Servo mit 8-bit Timer (AVRmega32) ?
Hallo,
wie kann ich 50Hz frequent für mein servo mit 8-bit timer (timer0 oder timer2 von mega32) erzeugen? Ich benutze 16mhz Taktfrequent
Timer1 in mein Board ist shon besetzt, ich kann das nicht benutzen.
sorry für mein schlechtes deutsch.
Vielen Dank.
Da hätte ich auch mal eine Frage zu...
Hi Leutz,
ich steh eigentlich vor dem selben Problem:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned int ontime = 0;
unsigned int offtime = 2000;
ISR(TIMER0_COMP_vect)
{
offtime--;
if( offtime == 0 )
{
offtime = 2000;
PORTA &= ~0x80;
}
if(offtime == ontime )
{
PORTA |= 0x80;
}
}
int main(void)
{
DDRC = 0xFF;
PORTC = 0x0F; // alles aus
DDRA = 0x80;
PORTA = 0x00;
// CLK/8 Prescaler CS01
TCCR0 = (1<<CS01);
OCR0 = 20; // 16000000/8 = 1999490Hz/20 = 99974,50Hz => 0,01ms
TIMSK |= (1<<OCIE0);
sei();
int i = 0;
ontime = 100;
for(i=0;i<25;i++)
_delay_ms( 200 );
ontime = 125;
for(i=0;i<25;i++)
_delay_ms( 200 );
ontime = 150;
for(i=0;i<25;i++)
_delay_ms( 200 );
ontime = 175;
for(i=0;i<25;i++)
_delay_ms( 200 );
ontime = 200;
for(i=0;i<25;i++)
_delay_ms( 200 );
ontime = 0;
while(1){ }
}
Ich benutze den Billig-Servo von Conrad (Basetech ES-05). Sollte ich das mit den Timern richtig verstanden haben, so müsste doch die Interrupt-Routine alle 0.01ms aufgerufen werden. Sprich 20ms = 2000 Aufrufe. Damit wäre ein ontime von 100 = 1ms usw.?
Auch die _delay_ms-Funktion sollte bei 25*200ms = 5000ms = 5 Sekunden warten, was sie auch nicht tut (F_CPU ist über AVR Studio mit 16000000 für ATmega32 gesetzt ).
Inzwischen glaube ich, dieses Mikrocontroller-Zeug ist von bösen Zauberern erfunden worden und nur Magiekundigen zugänglich, die ihre Seele bereits dem Satan verkauft haben und durch Zölibat und Selbstgeisselung die schwarze Kunst der Elektronenbeeinflussung beherrschen.
Grütze
Banzai