Hallo Roboternetz!
Ich versuche ein 2-rädriges Fahrzeug mit Rad-Encodern zu bauen.
Diese werden über Lichtschranken realisiert und alles funktioniert soweit super.
Also ich kann die Flanken des Encoders über einen Interrupt einlesen und daher die Anzahl der durchlaufenden "Löcher" über UART ausgeben.
Sobald ich jedoch einen beliebigen Timer für ein PWM Signal initialisiere funktioniert das nicht mehr ganz so.
Dann werden manchmal mehrere Flanken erkannt (oft 2 auf einmal oder ganz viele hintereinander) und der Encoder wird unbrauchbar.
Ich nutze ein Arduino Mega (ATMega 2560), und programmiere diesen mit dem AVR-GCC Compiler.
PWM funktioniert einzeln und auch die Interrupts funktionieren einzeln, zusammen jedoch leider nicht
hier der Code:
Code:
#include <avr/io.h> #include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include "uart.h"
uint16_t counter_l=0,counter_r=0;
char s[10];
void PWM_Init(void){
TCCR3A = (1<<WGM30)|(1<<COM3A1)|(1<<COM3B1);
TCCR3B = (1<<WGM32)|(1<<CS31);
}
ISR(INT2_vect)
{
counter_l++;
uart_puts("Left: ");
uart_puts(itoa( counter_l, s, 10 ) );
uart_puts("Right: ");
uart_puts(itoa( counter_r, s, 10 ) );
uart_putc('\n');
}
ISR(INT3_vect)
{
counter_r++;
uart_puts("Left: ");
uart_puts(itoa( counter_l, s, 10 ) );
uart_puts("Right: ");
uart_puts(itoa( counter_r, s, 10 ) );
uart_putc('\n');
}
void interrupt_init(void){
DDRD &= ~(1<<2);
DDRD &= ~(1<<3);
EICRA = (1<<ISC21)|(1<<ISC31); //falling edge detection for ext.int2,ext.int3
EIMSK = (1<<INT2)|(1<<INT3); //turn on ext.int2,ext.int3
sei();
}
int main(void){
//OUTPUTS
DDRE |= (1<<3); //Motor ? PWM
DDRE |= (1<<4); //Motor ? PWM
//Pre Settings
//PWM_Init();
uart_init();
interrupt_init();
//OCR3A=0;
//OCR3B=0;
while(1){
}
return 0;
}
habt ihr eine Idee, was das Problem sein könnte?
Danke schon mal im voraus!
Gruß Lukas
Lesezeichen