Hi
Ich habe folgendes Problem.
Mittels einem STK 500 ( Atmega 16 ist verbaut ) möchte ich die Position
eines Servos über ein Poti vorgeben.
Dazu hab ich einen Code erstellt der mittels ADC Umwandlung und dem
Timer2 das ganze realisiert.
Anschließend hab ich das ganze an einem kleinen analog Servo ausprobiert
und es funktioniert ohne Probleme.
Jetzt wollte ich es an einem etwas größerem Digital Servo ausprobieren
und leider kommt es da zu einem extremen zucken, teilweise dauerts ein
paar Sekunden bis er die Position findet.
Ich verwende eine externe Spannungsquelle (5,1V, 0.25A) für den Servo.
Hab auch schon ein anderes Poti verwendet (beide mit 10k).
Habe leider kein Oszi um die Signale anzusehen, aber was ich beobachtet
habe ist, dass das zucken nur dann auftritt wenn der OCR1A Wert hoch ist
Was kann ich dagegen tun bzw woran liegt es eventuell ?
Bin um jeden Ratschlag dankbar.
lg
Den Code stell ich hier gleich noch rein. Vl liegts ja daran
1 | #include <avr/io.h>
|
2 | #define ADATE 5 // Definition is missing in
|
3 | void pwm_init() // some Versions of AVR Studio
|
4 | {
|
5 | TCCR1A = _BV(COM1A1) // _BV Bit Values
|
6 | | _BV(COM1B1) // Inverted Mode
|
7 | | _BV(WGM11) ;
|
8 | TCCR1B = _BV(WGM13)
|
9 | | _BV(WGM12) // Fast PWM
|
10 | | _BV(CS00) // Prescaler
|
11 | | _BV(WGM12)
|
12 | | _BV(WGM13);
|
13 | ICR1 = 20000;
|
14 | OCR1A = 1900;
|
15 | DDRD = _BV(PD4)| _BV(PD5);
|
16 | }
|
17 | int main(void)
|
18 | {
|
19 | ADMUX |= (1<<REFS0); // Set reference to AVcc
|
20 | ADCSRA |= (1<<ADEN)|(1<<ADATE)| // Enable ADC, Enable auto Triggering
|
21 | (1<<ADPS2)|(1<<ADSC); // Set prescaler to 1
|
22 | // Fadc=Fcpu/prescaler=1000000/16=62.5kHz // Fadc should be between 50kHz and 200kHz
|
23 | pwm_init(); // initialize timer in PWM mode
|
24 | while(1) // run forever
|
25 | {
|
26 | while(!(ADCSRA&(1<<ADSC))); // Wait until a conversion is finished
|
27 | OCR1A =ADC*0.975+1000;
|
28 | }
|
29 | }
|