Gestern Abend hatte alles funktioniert, Motorregelung, Richtungswechsel, Odometrie, bei 2khz PWM wie auch viele Modellbau Fahrtregler verwenden.
Heute geht gar nichts mehr. Wenn mal ein Motor läuft, ignoriert er zu 50% die Odometrie. Einzige Softwareänderung war die Odometrie raus aus dem Hauptprgramm rein in eine Funktion, lt Simulator zählt er schön mit.
Habe sogar die 5V seperat versorgt (9V Batterie + Spannungsregler), bringt keinen Unterschied. Die 5V Motortreiber hängen auch auf der Batterie, das könnte ich noch auftrennen und die Motortreiber auch auf den Fahrakku hängen so dass nur der µC an der Batterie ist, wenn es was bringt.
Das einzige was funktioniert ist die neu angeschlossene Status LED die 5x blinkt bevor die Motoren starten (sollten).
Meistens dreht sich der rechte Motor, manchmal der linke, der dann ausnahmsweise die Odometrie berücksichtigt, sehr selten beide Motoren, oft stehen sie.
Nur der 3. Motor geht zuverlässig.
An einen SW Fehler glaube ich nicht, mittlerweile kann ich das Datenblatt auswendig, aber ich poste die Motorsteuerung trotzdem, es gibt immer wen der sich besser auskennt. zB habe ich noch nicht herausbekommen wie man bei einer Funktion 2 Werte zurückgibt, deshalb ein paar ungeliebte globale Variablen.
Die Motoren drehen sich ab einem Wert von 150 in Zeitlupe, bei 200 schon mit etwas Kraft, und ab 500 geht eher das Rad runter bevor etwas blockiert.
Das JTAG Interface ist mit den Fuses ausgeschaltet damit am PortC nichts stört.
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
unsigned int odo_li,odo_li_x,odo_re,odo_re_x; //global für Odometrie und später Navigation
unsigned int timer;
volatile unsigned char timecount;
ISR(TIMER2_COMP_vect)
{timecount++;}
/* init PWM, Eingänge, Ausgänge definieren */
void init(void)
{
/* Ausgänge an Port C für Drehrichtungen der Motoren 2+3 Motor links, 4+5 rechts, 6+7 Mower */
DDRC = (1 << DDC2) | (1 << DDC3) | (1 << DDC4) | (1 << DDC5) | (1<<PC6)| (1<<PC7);
/* Eingänge ohne Pullup*/
DDRB &= ~(1 << PB2); //Mower Odometrie
DDRA &= ~(1 << PA0); //links Odometrie
DDRA &= ~(1 << PA1); //rechts Odometrie
DDRA &= ~(1 << PA2); //Sensor Vorne
DDRA &= ~(1 << PA3); //Sensor Hinten
/* Eingang Bumper mit Pullup*/
DDRA &= ~(1 << PA4); PORTA |= (1<<PA4);
/* Ausgänge */
DDRB =(1<<DDB0); // Status LED
/* PWM Timer 1 Antriebsmotoren */
DDRD =(1<<PD4) | (1<<PD5); // PWM PIN als Ausgang schalten
TCCR1A =(1<<COM1A1) | (1<<COM1B1) | (1<<WGM10) | (1<<WGM11); //fast PWM 10Bit
TCCR1B=(1<<WGM12); //fast PWM /8/9/10 Bit
TCCR1B=(1<<CS11); // Prescaler 8
OCR1A = 0;
OCR1B = 0;
#define MotorLinks OCR1B
#define MotorRechts OCR1A
/* PWM Timer 0 Mower */
DDRB= (1<<PB3); // PWM PIN auf Ausgang
TCCR0 = (1<<WGM01) | (1<<WGM00) | (1<<COM01) | (1<<CS01); //fast PWM, Prescaler 8
OCR0=0;
#define Mower OCR0
/*+++++++Timer2++++++++++++++++*/
TCCR2 = (1<<WGM21) | (1<<CS20) | (1<<CS21) | (1<<CS22); // CTC Mode, Prescaler 1024
TIMSK = (1<<OCIE2); //Interupt compare match enable
OCR2=78; // alle 10ms 1 Interrupt
}
/*++++++++++++++++++++++++++++++*/
void Motor_li_vor()
{PORTC |= (1<<PC2);PORTC &= ~(1<<PC3);
}
void Motor_li_ru()
{PORTC |= (1<<PC3);PORTC &= ~(1<<PC2);
}
void Motor_li_stop()
{PORTC &= ~( (1<<PC2) | (1<<PC3) );
}
void Motor_li_faststop()
{PORTC |= (1<<PC2) | (1<<PC3);
}
void Motor_re_ru()
{PORTC |= (1<<PC4);PORTC &= ~(1<<PC5);
}
void Motor_re_vor()
{PORTC |= (1<<PC5);PORTC &= ~(1<<PC4);
}
void Motor_re_stop()
{PORTC &= ~( (1<<PC4) | (1<<PC5) );
}
void Motor_re_faststop()
{PORTC |= (1<<PC4) | (1<<PC5);
}
void Mower_vor()
{PORTC |= (1<<PB6);PORTC &= ~(1<<PB7);
}
void Mower_ru()
{PORTC |= (1<<PB7);PORTC &= ~(1<<PB6);
}
void Mower_stop()
{PORTC &= ~( (1<<PB6) | (1<<PB7) );
}
void Mower_faststop()
{PORTC |= (1<<PB6) | (1<<PB7);
}
/*******ODO auslesen++++*/
void odo()
{ if ((PINA &(1 << PINA0)) ) //links
{ if (odo_li_x==0)
{odo_li++;
odo_li_x=1;}}
else odo_li_x=0;
if ((PINA & (1 << PINA1)) ) //rechts
{ if (odo_re_x==0)
{odo_re++;
odo_re_x=1;}}
else odo_re_x=0;
if ((odo_re>200)&&(odo_li>200)) {odo_re=odo_re-100; odo_li=odo_li-100;}
}
int main(void)
{
char i;
unsigned int x;
sei(); //Interupt ein
init(); //Porteinstellungen, PWM
timer=0; timecount=0; zeit=0;zeitx=0;
odo_li=0;odo_re=0;
//*******************************
x=0;
/*+++++++Startverzögerung + Led blinken */
while (x<4)
{
PORTB |= (1<<PB0);//LED on
Warten();
PORTB &= ~(1<<PB0);Warten();//LED off
x++;
}
PORTB |= (1<<PB0);//LED on
Mower=220; Mower_vor();
Warten();Warten();
MotorLinks = 500;
MotorRechts = 500;
Motor_li_vor();Motor_re_vor();
while (1)
{
odo(); //Odometrie aktualisieren
if (odo_li>10) Motor_li_stop();
if (odo_re>20) Motor_re_stop();
}
}
Lesezeichen