Hallo,
hab mcih jetzt mal drangemacht und versucht, einen Servo anzusteuern:
Code:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <math.h>
int16_t sollwert=(0.001/0.000004);
int16_t wert_alt;
int8_t pos;
int main(void)
{
sei();
DDRB = (1<<DDB0);
PORTB = (0<<PB0);
wert_alt = 5000;
TCCR0 = (0<<CS02) | (1<<CS01) | (1<<CS00); //Vorteiler 64
TCNT0 = (255-5000); //Timer vorladen
TIMSK = (1<<TOIE0); //Interrupt enablen
}
SIGNAL (SIG_OVERFLOW0)
{
PORTB ^= (1<<PB0); //Pin tooglen
if (wert_alt = 5000)
{
TCNT0 = sollwert;
wert_alt = sollwert;
}
else
{
TCNT0 = 5000;
wert_alt = 5000;
}
}
Das Problem ist, das er bei Werten zwischen 0.002 und 0.001 eigentlich immer nur in eine Richtung will, gleiches wenn ich die Werte noch größer oder kleiner mache. D.h. es ist keine genaue Positionierung möglich.
Meine Berechung ist folgendermaßen:
16000000/64 = 2500000
1/250000 =4*10^-6=0.000004 Zeit, die ein Takt braucht
20ms = 0.02s -> 0.02/0.000004 = 5000
1ms = 0.001s -> 0.001/0.000004 = 250
Weiss jemand, wo mein Fehler ist?
Lesezeichen