Die Ansteuerung ist auch über die vorhandenen vier Anschlüsse möglich. Sie entsprechen von der Ansteuerung ja quasi einem L293 mit Enable fest auf high. Und den benutze ich auf meinem Roboter.
Der Trick: für die Rückwärtsfahrt wird die PWM invertiert.
Zufälligerweise arbeite ich auch mit nem M8, hätte also hier den gesamten Code für dich:
Code:
#include <avr/io.h>
//die Pins für die Richtungsumschaltung
#define DIR_L_PIN_ON PORTD|=(1<<PD5)
#define DIR_L_PIN_OFF PORTD&=~(1<<PD5)
#define DIR_R_PIN_ON PORTD|=(1<<PD6)
#define DIR_R_PIN_OFF PORTD&=~(1<<PD6)
//PWM-Ports: links 1A (PB1) rechts 1B (PB2)
#define vor 0b10100000
#define rueck 0b01010000
#define stop 0b00000000
#define rdreh 0b01100000
#define ldreh 0b10010000
void initPWM(void)
{
TCCR1A = 0x00;
TCCR1B = 0x00;
//WGM10 = mode 1 = PWM Phase correct TOP=0x00FF, 8bit
//COM1A1 und COM1A0 = 11 = (Table 38 pdf)
// => OC1A high on upcounting compare match, low on downcouting compare match
//COM1B1 und COM1B0 = 11 = (Table 38 pdf)
// => OC1B high on upcounting compare match, low on downcouting compare match
TCCR1A |= (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0) | (1<<COM1B1) | (1<<COM1B0); //Timer konfigurieren
//prescaler /8
//TCCR1B |= (1<<CS11);
// /1024
//TCCR1B|= (1<<CS12)|(1<<CS10);
// /256
TCCR1B|=(1<<CS12);
//======>>> port als Ausgang schalten <<<======
//pin B1 (OC1A) und pin 18 (OC1B) als ausgang schalten (ATmega8)
DDRB |=(1<<PB1) | (1<<PB2);
//Richtungsausggänge
DDRD |=(1<<PD5) | (1<<PD6);
}
void PWM_L_non_inv(void)
{
TCCR1A|=(1<<COM1A1);
TCCR1A&=~(1<<COM1A0);
}
void PWM_L_inv(void)
{
TCCR1A|=(1<<COM1A1)|(1<<COM1A0);
}
void PWM_R_non_inv(void)
{
TCCR1A|=(1<<COM1B1);
TCCR1A&=~(1<<COM1B0);
}
void PWM_R_inv(void)
{
TCCR1A|=(1<<COM1B1)|(1<<COM1B0);
}
void setzeMotoren(uint8_t PWML, uint8_t PWMR, uint8_t DIR)
{
switch(DIR)
{
case vor:
PWM_L_inv();
PWM_R_inv();
DIR_L_PIN_ON;
DIR_R_PIN_ON;
OCR1A=PWML;
OCR1B=PWMR;
break;
case rueck:
PWM_L_non_inv();
PWM_R_non_inv();
DIR_L_PIN_OFF;
DIR_R_PIN_OFF;
OCR1A=PWML;
OCR1B=PWMR;
break;
case ldreh:
PWM_L_non_inv();
PWM_R_inv();
DIR_R_PIN_ON;
DIR_L_PIN_OFF;
OCR1A=PWML;
OCR1B=PWMR;
break;
case rdreh:
PWM_R_non_inv();
PWM_L_inv();
DIR_R_PIN_OFF;
DIR_L_PIN_ON;
OCR1A=PWML;
OCR1B=PWMR;
break;
case stop:
default:
PWM_L_non_inv();
PWM_R_non_inv();
DIR_L_PIN_OFF;
DIR_R_PIN_OFF;
OCR1A=0;
OCR1B=0;
} //end.case
} //end.setzemotren
Erst initPWM(); und dann mit setzeMotoren(uint8_t PWML, uint8_t PWMR, uint8_t DIR); ansteuern. PWML und PWMR sind die 8bit-PWM-Werte, DIR die Drehrichtung gemäß den Defines (vor rueck, ldreh,rdreh, stop)
Lesezeichen