Servosteuerung mit einem MEGA32U4

Janiiix3

Aktives Mitglied
28. Sep. 2013
1.333
10
38
Hannover
Sprachen
  1. ANSI C
  2. C#
Halli Hallo :p

Ich bin gerade dabei eine kleine Servomotorsteuerung zu programmieren.
Leider komme ich nicht so wirklich auf meine Zeitbasis. Man steuert die meisten Motoren ja mit einem Puls von ca. 900µs - 2000µs und einer Pause von 20ms an.

Nun habe ich in einem anderen Forum eine Routine gefunden, die mir dies schon zum größten Teil erledigt.
Nur ist die Hardware nicht richtig dafür ausgelegt (Quarz = 16MHz).

Gibt es vill. doch einen weg (wollte es in Software erledigen und keinen Hardwarepin benutzen) dies mit meiner aktuellen Hardware hin zu bekommen?

MFG

Jan

/* Routine */

 
Zuletzt bearbeitet:
Nun habe ich in einem anderen Forum eine Routine gefunden, die mir dies schon zum größten Teil erledigt.
Nur ist die Hardware nicht richtig dafür ausgelegt (Quarz = 16MHz).

Was ist denn nicht richtig "ausgelegt". Passt der Systemtakt nicht? Dann kannst du den Wert für das OCR0A Register neu berechnen und ggf. die Prescalerbits anders wählen.

Gibt es vill. doch einen weg (wollte es in Software erledigen und keinen Hardwarepin benutzen) dies mit meiner aktuellen Hardware hin zu bekommen?

Noch benötigen wir leider einen "Hardwarepin", um den Mikrocontroller mit dem Servo zu "verbinden" ;)

Du meinst wahrscheinlich SoftwarePWM.

Ich habe mir das Softwarebeispiel nicht genau angesehen, aufgefallen ist mir aber folgendes:



CodeBox C
#define NR_SERVOS  1
// ...
uint8_t ServoPuls[NR_SERVOS] = {
1<<PD1
};

// ...

void InitServo()
{  
  SERVO_DDR = (ServoPuls[0] | ServoPuls[1] | ServoPuls[2] | ServoPuls[3] | ServoPuls[4] | ServoPuls[5] | ServoPuls[6] | ServoPuls[7]);
//...


Es ist nur ein Servo vorhanden. Das Array ServoPuls hat nur ein Element. Das DataDirection Register wird eventuell nicht richtig initialisiert.
 
Hallo Dirk,

Ich habe ja so meine "problemchen" mit einigen Sachen, mit unter auch das berechen der Register (OCRxx)... Auf der Seite wo ich die Routine gefunden habe, steht beschrieben das ich wenn ich einen 8 Bit Timer benutzen soll, wo der Wert von OCRxx ziemlich nahe an 128 sein sollte (eben wegen der Auflösung). Dies geht super mit einer Frequenz von 1MHz. Da das Board dies aber nicht hat, müsste ich das irgendwie anderst machen. Gibt es da eine möglichkeit oder habe ich falsch gerechnet.

Den Code habe Verstanden. Er ist ja eigentlich auch für 8 Servos ausgelegt, daher habe ich ein bisschen umgeändert. Das DataDirectionRegister wird falsch Initalisiert, dass spielt aber in meinem Fall erstmal keine Rolle.
 
So wie ich es verstanden habe, wird die Periodendauer 20ms nicht eingehalten, was aber anscheinend nichts ausmachen soll?!
Die Periodendauer wird beeinflusst von den Puls-High-Zeiten aller Servos.
Ich gehe jetzt einfach davon aus, es ist so in Ordnung.

Im Moment läuft es bei dir mit einem Servo, das funktioniert so nicht. Nicht nur wegen dem DataDirection Register. Die Low-Zeit ist einige 100ns, das wird zu wenig sein (siehe dir die ISR an).

Wenn du das Beispiel übernimmst (mit allen Servos), dann könnte es eventuell mit folgenden Werten funktionieren.

ATmega32U4
F_CPU 16000000UL

8 Bit Timer0

Prescaler 256
TCCR0B |= 1<<CS02;

MILLISEC_BASE = 62
das sind dann (256/16Mhz)*62 = 0,992ms
bei 124 hast du dann 1,984ms (also knapp 2ms)


ServoValue[] bewegt sich dann von 0 bis 62. (1ms ... 2ms)

Die Auflösung ist hier nicht so gut, könnte dir aber vielleicht ausreichen.

Wenn du eine bessere Auflösung benötigst, dann verwende einen 16Bit Timer.

Dirk :ciao:
 
Hallo Dirk,

vielen lieben dank!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)