Servo zittert

OP #3171513
Lesenswert?

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
}
Gast #3171544
Lesenswert?

>> Ich verwende eine externe Spannungsquelle (5,1V, 0.25A)
0,25A sind nicht viel für Dein Netzteil.

Mal einen Stütz-Elko testen. Entweder raucht Dein Netzteil beim 
Einschaltstrom oder die Zappelfrequenz ändert sich. Damit weißt Du dann, 
daß Du ein kräftigeres Netzteil brauchst.
OP #3171663
Lesenswert?

Danke für die Antworten

Also die Massen sind miteinander verbunden.

Ein besseres Netzteil werde ich probieren, aber zieht ein servo ohne 
last auch so viel Strom ?

Wo müsste ich den Stützelko denn einbauen und wie groß soll der sein ?

Ansonsten hab ich jetzt ein paar feste Werte ohne ADC ausprobiert und da 
kommt es zu keinem zittern.
Werd jetzt dann mal die Frequenz ändern.
Mal schaun was sich da tut.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren