PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Empfehlung für AVR Controller..?



xecon
19.06.2011, 21:32
Hi,

heiße Paul und komme aus'm Modellbau (Heli) bzw. Elektronikbereich (haupsächlich: AVR & HF-Technik).
Nun möchte ich zumindest für mein jetziges Projekt diese bereiche zum Roboterbau kombinieren (zuvor oft Belechtungsmodule für Flächenmodelle gebaut etc.)

Betrieben wird der Robo mit nem 2S Lipo (Nennspg. 7,4V) und dessen Unterspannungsabschaltung mittels Spannungsteiler und ADC des Tiny13's :p
---------------------------------------------------------------------------------------

Gesteuert werden nun 5 Servos, ein Piezo Summer und 2 RGB Leds..
Kein großes Ding? Aber mit welchen Controller..?! Der ATmega 8 tut's nicht mehr, zu wenige PWM Ausgänge.. :(
Der ATmega48 hätte 6 PWM ausgänge(?) Was haltet ihr davon?
SMD muss es nicht sein, außer es gibt den Controller nicht anders :P

Ich möchte alles mit einem Controller steuern anstatt positionen z.B. mittels UART an Hände oder Füße zu schicken, oder was einem noch so alles einfällt.. :D

Des weiteren wär ein Beispielprogramm in C zur richtigen PWM konfiguration ganz hilfreich (Digital servo, sprich Signal alle 6ms?) da steh ich auch ein wenig an.. :(

Vielen dank schon mal! ;)

Besserwessi
19.06.2011, 21:51
Der Mega48 hat mehr PWM Ausgänge, aber auch nur 4 mit 16 Bit Auflösung. Die Kanäle mit 8 Bit Auflösung helfen zur Servosteuerung eher weniger. Die Servo Signale kann man halb in Software und nacheinander machen. Für 3 Kanäle würde es auch mit 6 ms Wiederhohlrate noch hinkommen. Für die beiden anderen müsste dann HW PWM gehen. Im RN-Wiki Bereich steht da was zur Servoansteuerung.

wkrug
19.06.2011, 22:57
Deine geforderten Eckdaten sind mit einem ATMEGA8 noch machbar.
Die Servos werden dabei sequenziell angesteuert.

Der Timer 1 Steuert dann über die Interrupts Comp1a und Comp1b die zugehörigen Ausgänge.
Comp1a bearbeitet dabei die ersten 3 Ausgänge Comp1b die zweiten 3Kanäle.

Das geht so:
Zu COMP1A wird mit dem Wert für Servo 1 dazugerechnet und in COMP1A abgelegt.
Der Ausgang 1 wird aktiviert.
Tritt dieser Interrupt dann auf wird Ausgang1 Abgeschaltet und Ausgang2 aktiviert, sowie der COMP1A der Wert für Servo 2 zuaddiert. Dadurch bekommt man dann einen Impuls mit der gewünschten Länge auf Ausgang 1 zustande.
Kommt dann dieser Interrupt wird Ausgang2 abgeschaltet und Ausgang3 aktiviert, wieder die Impulsdauer für Ausgang3 zum Comparematch zuaddieren.
Wenn man mag kann man jetzt noch die Restzeit auf 6ms mit allen Ausgängen abgeschaltet abwarten, bis ein neuer Zyklus beginnt.

Der Comparematch 1B mach im Prinzip genau das gleiche mit den Ausgängen 4 bis 6.
Die gewünschten Servoimpulslängen kann man in einem Array ablegen, die Interruptroutinen bedienen sich dann aus diesem Array.

Bei Beschreiben des Arrays sollte man kurz die Interrupts blockieren ( mit "CLI" ) , damit nicht gerade während eines Schreibvorganges ein Comparematch Interrupt auftritt.

Überläufe sind auch kein Problem, wenn man unsigned int als Zahlenformat verwendet, da ja auch der TCNT1 bei einem Überlauf wieder mit 0 beginnt.

Die Lösung arbeitet im Prinzip in den Comparematch Interrupts des Timers 1.
Ich arbeite da gerne mit einem 8MHz Quarz und einem Timer Prescaler von 8, weil dann die Impulszeit direkt in Mikrosekunden in die Comparematches eingetragen werden kann.

Im Hauptprogramm kann man dann in " aller Ruhe " die benötigten Impulszeiten berechnen.
Zeitmässig sollte das auch kein Problem machen, da immerhin 4000 Taktzyklen vergehen ( bei 2 * 1ms Impulszeit ) bis erneut ein Interrupt auftritt. Fließkommaberechnungen oder höhere mathematische Funktionen würd ich aber lassen ;) .