Forum: Mikrocontroller und Digitale Elektronik Servo Ansteuerung mit atMega32 Timer1 (16bit)


von Bernhard S. (snowy1509)


Lesenswert?

Hallo!

Ich versuche gerade einen ganz normalen Modellbau-Servo mit meinem 
atMega32 anzusteuern. Soweit ich weiß braucht der dafür ein PWM Signal 
mit 20ms Periodendauer und einem Duty-Cycle zwischen 1 und 2 ms (1,5 = 0 
Position).

Bis jetzt schon ein Fehler? ^^

Ok ich hab also meinen 16 Bit Timer1 in den FastPWM Mode eingerichtet, 
einen 3,2768MHz Quarz als Taktgeber angeschlossen um ein schönes 50Hz 
Signal zu generieren.

Als Vergleichswert hab ich ihm den berechneten Zählerwert für 1,5ms 
gegeben, allerdings fährt der Servor irgendwelche beliebigen Positionen 
an und surrt entwas ungewöhnlich^^

Hier ist mein Code:
PWM_NULL hab ich in meiner header-Datei mit 4915 definiert!
1
#include <avr/io.h>
2
#include "defaults.h"
3
4
void init_Timer()
5
{
6
  DDRD|= (1<<PD5);
7
  TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11);
8
  TCCR1B |= (1<<WGM13) | (1<<WGM12) | (1<<CS10);
9
  ICR1 = 0xFFFF;
10
  OCR1A = PWM_NULL;
11
}
12
13
int main(void)
14
{
15
  init_Timer();
16
    while(1)
17
    {
18
        
19
    }
20
}

Wäre toll wenn mir jemand helfen kann! :)

Mfg
Berni

von Karl H. (kbuchegg)


Lesenswert?

Bernhard Schneeweiß schrieb:

> Ich versuche gerade einen ganz normalen Modellbau-Servo mit meinem
> atMega32 anzusteuern. Soweit ich weiß braucht der dafür ein PWM Signal
> mit 20ms Periodendauer und einem Duty-Cycle zwischen 1 und 2 ms (1,5 = 0
> Position).
>
> Bis jetzt schon ein Fehler? ^^

Passt. Wobei du die 20ms nicht so genau nehmen musst. Die 1-2ms sind 
wichtig. Ob die Wiederholung dann alle 20ms oder alle 18 oder alle 15 
kommt, ist hingegen nebensächlich.

> Ok ich hab also meinen 16 Bit Timer1 in den FastPWM Mode eingerichtet,
> einen 3,2768MHz Quarz als Taktgeber angeschlossen

Schön.
Und? Hast du den QUarz auch per Fuse aktiviert?
Hast du das kontrolliert?

Der Punkt ist wichtig. Denn wenn dein µC den Quarz nicht benutzt, dann 
läuft er immer noch mit ca. 1Mhz, wodurch deine ganzen Berechnungen 
nicht stimmen.

Also: sicherheitshalber erst mal kontrollieren, ob der µC tatsächlich 
mit den 3.irgendwas Mhz läuft.
LED anschliessen und mittels _delay_ms(1000) blinken lassen. F_CPU auf 
3276800 stellen und wenn die LED dann tatsächlich 1 Sekunde an bzw. aus 
ist, dann stimmt die Taktfrequenz.

von Bernhard S. (snowy1509)


Angehängte Dateien:

Lesenswert?

Ja ich denke schon, allerdings steckt der in einem Polin Atmel 
evaluations-board das ich über Ponyprog/ISP flashe und das ist meiner 
Meinung nach sehr gewöhnungsbedürftig (ausgewöhlt heißt bit=0)

Ich hab dir einen Screenshot angehängt.

Oder ist vielleicht einfach der Servo defekt?

von Karl H. (kbuchegg)


Lesenswert?

Ich kann mich nur wiederholen:

Kontrolliere es! Dann weißt du es mit Sicherheit.
1
#define F_CPU 3276800
2
#include <avr/io.h>
3
#include <util/delay.h>
4
5
int main()
6
{
7
  DDR... |= ( 1 << ... );
8
9
  while( 1 ) {
10
    PORT.... |= ( 1 << ... );
11
    _delay_ms( 1000 );
12
    PORT.... &= ~( 1 << ... );
13
    _delay_ms( 1000 );
14
  }
15
}


Das ist wirklich nicht schwer und in 20 Sekunden WEISST du ganz sicher 
Bescheid was Sache ist. Entweder die 1 Sekunden zeigen sich an der LED 
oder du hast rund 3 Sekunden. Und den Unterschied siehst du mit freiem 
Auge.
Port und Pin, an dem an deinem Board eine LED hängt, musst du einsetzen.


> Oder ist vielleicht einfach der Servo defekt?
Möglich. Aber eher unwahrscheinlich. In mehr als 95% aller Fälle sitzt 
das Problem vor dem Monitor.

von Karl H. (kbuchegg)


Lesenswert?

Nur so:
Die Servomasse hast du aber schon mit dem Mega verbunden?

Auch sollte man nicht unbedingt unterschätzen, dass Servos schon auch 
mal ordentlich auf der Versorgungsspannung sauen können

Modellbauservo Ansteuerung

von Oliver (Gast)


Lesenswert?

Bis darauf, daß das Setzen von OCRA1
>  OCR1A = PWM_NULL;

besser vor dem Schreiben der WGM-Bits passiert (ansonsten ist der 
allererste PWM-Zyklus nicht so, wie du es gerne hättest), sieht das 
alles richtig aus.

Oliver

von Bernhard S. (snowy1509)


Lesenswert?

Danke! Der Fall zählt doch zu den anderen 5% ;)

Hab mir einen anderen Servo besorgt und schon funktionierts! Trotzdem 
danke für eure Hilfe!

Eine Frage noch, weiß wer wie das ganze bei der Ansteuerung von einem 
BL-Flugregler aussieht? ist dann 1,5ms Motor Stopp, 2ms 100% Leistung?

von Bernhard S. (snowy1509)


Lesenswert?

Oliver schrieb:
> Bis darauf, daß das Setzen von OCRA1
>>  OCR1A = PWM_NULL;
>
> besser vor dem Schreiben der WGM-Bits passiert (ansonsten ist der
> allererste PWM-Zyklus nicht so, wie du es gerne hättest), sieht das
> alles richtig aus.
>
> Oliver

Danke, da hast du recht, war aber für die Versuchszwecke nicht 
ausschlaggebend ;) Werd ich aber jetzt ändern!

von t0mM3k (Gast)


Lesenswert?

Die Speedcontroller für Brushlessmotoren muss man meist "anlernen". Man 
"bringt" ihnen damit quasi bei, welche Pegeldauer dann Stop, bzw Vollgas 
entspricht.
Im Normalfall wäre dann also 1ms = stop; 2ms = vollgas.

von Bernhard S. (snowy1509)


Lesenswert?

Danke!

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.