Forum: Mikrocontroller und Digitale Elektronik Ansteuern des Servomotors funktioniert nicht


von Grevak D. (xorda)


Lesenswert?

Hallo,

Ich wollte einen SG90 mit meinem Atmega328P ansteuern, aber es 
funktioniert nicht. Dazu habe ich mir folgendes angeschaut: 
http://extremeelectronics.co.in/avr-tutorials/servo-motor-control-by-using-avr-atmega32-microcontroller/

Die PWM Leitung des Servos ist an PD5 angeschlossen

Mein Code:
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
int main() {
7
    TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
8
    TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
9
    ICR1 = 4999;
10
11
    DDRD |= 1 << DDD5;
12
13
    while(1) {
14
        OCR1A = 250;
15
        _delay_ms(1500);
16
    
17
        OCR1A = 500;
18
        _delay_ms(1500);
19
    }
20
}

Woran könnte das liegen?

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Grevak D. schrieb:
> Die PWM Leitung des Servos ist an PD5 angeschlossen

PD5 ist aber gar nicht der OC1A Ausgang beim Mega328. Du solltest PB1 
benutzen.

von Grevak D. (xorda)


Lesenswert?

Danke es klappt ! :D

Wo stehen die jeweiligen PINs für die Buffer?
Und wie finde ich heraus welche Winkel welcher Wert für OCR1A ist?

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Grevak D. schrieb:
> Wo stehen die jeweiligen PINs für die Buffer?

Was für Buffer? Die Pinbelegung der Mega48-328 stehen im Datenblatt auf 
der 2. Seite. Die Belegung ist fix, also liegt z.B. OC1A auf PB1, OC1B 
auf PB2 usw.

Grevak D. schrieb:
> Und wie finde ich heraus welche Winkel welcher Wert für OCR1A ist?

Schon der indische Artikel sagt ja, das das von Servo zu Servo etwas 
unterschiedlich ist. Im Allgemeinen bewegen sich die Servopulse immer 
zwischen 1ms und 2ms, so das die Mitte etwa bei 1,5ms liegt.

: Bearbeitet durch User
von Grevak D. (xorda)


Lesenswert?

Danke, habe herausgefunden, dass es zwischen 130 und 600 liegt. Was dem 
Datenblatt des SG90 widerspricht. Danke für die Hilfe

von Wolfgang (Gast)


Lesenswert?

Grevak D. schrieb:
> Was dem Datenblatt des SG90 widerspricht.
Das Datenblatt kann gar nicht wissen, dass du die Impulse mit dem Timer 
eines  Atmega328P erzeugen willst. Wie soll dein Wertebereich also dem 
Datenblatt widersprechen können.

von Grevak D. (xorda)


Lesenswert?

Im Datenblatt steht zwischen 1 und 2 ms. Das müsste also bei 16Mhz und 
einen Prescaler von 64 4999 sein um dann zwischen ca. 250 und 500 zu 
kommen. Das weicht von 130 bis 600 ab. Also muss es kleiner als 1 ms und 
größer als 2 ms sein der Bereich

Beitrag #5414466 wurde vom Autor gelöscht.
von Wolfgang (Gast)


Lesenswert?

Grevak D. schrieb:
> Also muss es kleiner als 1 ms und größer als 2 ms sein der Bereich

Das ist bei den meisten Servos so. Der Bereich 1..2ms wird garantiert. 
Bei deutlich kürzeren oder längeren Zeiten kann exemplar- und 
typabhängig der Anschlag sein, so dass der Motor blockiert wird.

von Rolf M. (rmagnus)


Lesenswert?

Wobei man tunlichst darauf achten sollte, dass das nicht passiert. 
Solche Servos gehen ziemlich schnell kaputt, wenn sie gegen Block 
laufen.

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.