mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR: PWM-Ansteuerung eines Servo funktioniert nicht richtig


Autor: Steffen Krebs (mrcrabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aalso ich benutze ein Board mit einem ATMEGA 644P. ICh habe einen 
Servomotor angeschlossen...dieser braucht ja eine PWM mit einer 
Periodendauer von 20ms was 50 Hz entspricht und eine Pulsbreite von 1 
bis 2 ms.
Dies habe ich in C so realisiert:

int main(void){

DDRB = 1<<4;

/*
Ich nutze also den Port OC0B, einen der beiden Pinne des 8-Bit-Timers.
Ich überlege noch einen der 16-Bit-Pinne zu nutzen, aber zunächst sollte
es ja auch so laufen.
*/

TCCR0A = (1<<COM0B1)|(1<<WGM01)|(1<<WGM00);
TCCR0B = (1<<WGM02)|(1<<CS02);
OCR0A = 78;
OCR0B = 6;

/*
Die WGM-Bits stellen Fast-PWM ein, und zwar zählt der Zähler bis OC0RA, 
also 195 um dann wieder von 9 zu starten. Die IO-Frequenz von 1 Mhz 
(interner 8 Mhz RC-Oscillator wird genutzt mit per Fusebits 
eingeschaltetem Vorteiler 8) wird durch 256 geteilt. Den Zähler um eins 
zu erhöhen dauert also 1s/(1000000/256) =0.256ms. Wenn der Zähler immer 
bis 78 zählt ist also eine Periodendauer von 19.2ms erreicht was 
ziemlich genau dem verlangten Wert entspricht. OCR0B von 6 ergibt in 
Kombination von nicht-invertiertem Betrieb eine Pulsbreite von ziemlich 
genau 1.5ms (78*1.5/20)
*/

while(1){}

return(0);
}

So. Der Servomotor ist an einem anderen Board getestet worden, bei 1ms 
Pulsbreite ging er zum einen Anschlag, bei 2ms zum Anderen und bei 1.5ms 
in Mittelstellung.

Nun verhält er sich ganz anders. Egal was ich einstelle er dreht gegen 
den Uhrzeigersinn bis zum Anschlag und versucht weiter zu laufen. Egal 
was ich bisher eingestellt hab. selbst wenn ich gar kein PWM-Signal 
draufgebe und nur 5V und Masse anschließe. Hat jemand ne Idee was da los 
ist? Ist in meiner Überlegung zur PWM mit AVR vielleicht etwas 
Grundlegendes falsch? Oder ist der Motor in der kurzen Zwischenzeit wohl 
doch kpuatt gegangen? Wie gesagt vor kurzem lief er wie er sollte.

Danke im Vorraus.

Autor: Steffen Krebs (mrcrabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab mal versuchsweise eine PWM künstlich gemacht indem ich einen 
normalein portpin high setze, 1 bis 2 ms delay mache, ihn low setze und 
20ms delay mache, das alles in einer while(1) schleife.
Auch bisschen die Zeiten variiert...aber die Motoren drehen nur in eine 
Richtung, mit konstanter Geschwindigkeit, teilweise ruckend, aber ohne 
zu versuchen eine bestimmte Position anzusteuern...was ist hier los?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>was ist hier los?

Klingt sehr nach einem Software- oder Takt-Problem.
Hast du auch das DDR für den Pin richtig eingestellt?

Autor: Steffen Krebs (mrcrabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jap, der zugehörige Portpin PB4 ist mit DDRB = 1<<4 als Ausgang 
definiert.

Autor: Erik S. (erik_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In jedem Fall solltest du etwas in die leere While-Schleife einbauen, 
sonst wird der Compiler die schnell wegoptimieren und das wäre nix gut.

Autor: Erik S. (erik_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr\io.h>

int main(void)
{
//volatile unsigned char temp = 1<<4;

DDRB = 1<<4;

/*
Ich nutze also den Port OC0B, einen der beiden Pinne des 8-Bit-Timers.
Ich überlege noch einen der 16-Bit-Pinne zu nutzen, aber zunächst sollte
es ja auch so laufen.
*/

TCCR0A = (1<<COM0B1)|(1<<WGM01)|(1<<WGM00);
TCCR0B = (1<<WGM02)|(1<<CS02);
OCR0A = 78;
OCR0B = 5;

/*
Die WGM-Bits stellen Fast-PWM ein, und zwar zählt der Zähler bis OC0RA,
also 195 um dann wieder von 9 zu starten. Die IO-Frequenz von 1 Mhz
(interner 8 Mhz RC-Oscillator wird genutzt mit per Fusebits
eingeschaltetem Vorteiler 8) wird durch 256 geteilt. Den Zähler um eins
zu erhöhen dauert also 1s/(1000000/256) =0.256ms. Wenn der Zähler immer
bis 78 zählt ist also eine Periodendauer von 19.2ms erreicht was
ziemlich genau dem verlangten Wert entspricht. OCR0B von 6 ergibt in
Kombination von nicht-invertiertem Betrieb eine Pulsbreite von ziemlich
genau 1.5ms (78*1.5/20)
*/


while(1)
{
  asm volatile ("nop");
}

  return(0);
}


So läuft der Aufbau mit 49,5Hz und 1,52... 1,56ms Pulsdauer, habs eben 
getestet.

Autor: Steffen Krebs (mrcrabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst...das Schaltnetzteil war zu Schwach und die Spannung ist 
eingebrochen...musste von 7.5V auf 9.5V erhöht werden vor dem 
7805...jetz läuft alles einwandfrei. Trotzdem Danke! :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.