Forum: Mikrocontroller und Digitale Elektronik Servo zittert


von Herbert H. (klerijan)


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
}

von Dr. Sommer (Gast)


Lesenswert?

Herbert Huber schrieb:
> Ich verwende eine externe Spannungsquelle (5,1V, 0.25A) für den Servo.
> Hab auch schon ein anderes Poti verwendet (beide mit 10k).
Viel zu wenig. Nimm eine die ein paar Ampere kann, Servos ziehen 
pulsartig hohe Ströme.

von Peter (Gast)


Lesenswert?

Dem ist es bestimmt zu kalt...

von oszi40 (Gast)


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.

von Holger W. (holgerw)


Lesenswert?

oder zittert vor Angst ;-)
Macht er das auch wenn du einen festen Wert ausgibst, also ohne den ADC 
abzufragen ?
Holger

von Dr. Sommer (Gast)


Lesenswert?

oszi40 schrieb:
> die Zappelfrequenz ändert sich.
Die entspricht vermutlich der Servo-Puls-Frequenz, also 50Hz. Der 
Duty-Cycle könnte sich aber ändern ;-)

von Spess53 (Gast)


Lesenswert?

Hi

>Ich verwende eine externe Spannungsquelle (5,1V, 0.25A) für den Servo.
>Hab auch schon ein anderes Poti verwendet (beide mit 10k).

Sicherheitshalber: Die Massen sind verbunden?

MfG Spess

von icke (Gast)


Lesenswert?

Digitalservos wollen manchmal etwas schneller angesteuert werden.

Also vll mal von den 50Hz auf 100 oder 200Hz.

von Herbert H. (klerijan)


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.

von Holger W. (holgerw)


Lesenswert?

Beschneide doch mal den ADC um die unteren Bits, vielleicht liegt es 
daran.

Holger

von Herbert H. (klerijan)


Lesenswert?

Hi

Danke für den letzten Tipp

Hab den ADC begrenzt durch einen zusätzlichen Widerstand und jetzt 
funktioniert es.

Warum und wieso ist mir zwar nicht wirklich klar... aber naja was solls

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.