PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega 32 - 4 Motoren mittels Software PWM



gunni7909
12.01.2009, 17:34
Liebe Mitglieder des Forums,

ich wende mich mit ein paar Fragen an Euch, da ich nicht weiß ob meine Idee mit einem Mega32 so überhaupt durchführbar ist.
Es soll ein mobiler Robot gebaut werden, der mit Ultraschall- und Näherungssensoren ausgestattet ist. Der Antrieb soll über 4 DC-Getriebemotoren geschehen, ähnlich wie bei einem Fußball Robot mit Omniwheels.
Ich möchte bereits vorhandene Bauteile und Motoren verwenden um die Baukosten gering zu halten.
Jetzt zu meinem ersten Problem:
Die Motoren sollen über einen Atmega32 mittels PWM gesteuert werden. Die Sensoren sollen irgendwann einmal über ein zweites Atmega32 Board mittels I2C mit dem ersten Atmega32 Board kommunizieren.
Für meinen jetzigen Bedarf würde es reichen 4 Motoren mit einem Atmega32 per PWM zu steuern und zusätzlich noch einen Ultraschall Sensor abzufragen.
Da der mega32 nicht genug Hardware PWM Ausgänge hat, habe ich daran gedacht, diese Aufgabe über Software PWM zu realisieren. Leider habe ich keinen Ahnung wie ich das Problem angehen soll. Ich wäre dankbar, wenn mir mal jemand auf die Sprünge helfen könnte bzw. einen solchen Code Schnipsel in Bascom zukommen lassen könnte.
Früher habe ich einige kleinere Projekte in Assembler programmiert, glaube aber, daß der Aufwand in Assembler für dieses Projekt zu groß ist. Ich möchte die Programmierung vorerst in Bascom vornehmen, muß also Bascom erst noch lernen.
Vielen Dank für jeden Input
Gunni

Michael
12.01.2009, 18:00
Hallo gunni7909,

schau mal ins Datenblatt, der Mega32 hat 4 Hardware-PWM-Kanäle.
Brauchst du jetzt noch einen Code-Schnipsel für SW-PWM?

Gruß, Michael

gunni7909
13.01.2009, 23:50
Hallo,
wenn ich das Datenblatt richtig verstanden habe, hat der mega32 zwar 4 Hardware PWM, dann ist aber kein Timer mehr für andere Aufgaben verfügbar. Einen Timer für die Sensoren hätte ich gerne frei.
Das ist ja der Grund, warum ich auf SW PWM ausweichen wollte.
Also für eine SW Lösung wäre ich schon dankbar.
Viele Grüße
Gunni7909

Michael
14.01.2009, 17:42
Hallo gunni7909,


Einen Timer für die Sensoren hätte ich gerne frei.
ich würde dazu keinen Timerinterrupt verwenden.
US-Sensoren liest man z.B. mit einem Pin-Change Interrupt aus. (Int0 oder Int1)


Also für eine SW Lösung wäre ich schon dankbar.
das wäre eine Variante:

$crystal = 16000000
$regfile = "m8def.dat"

Ddrc.0 = 1
Ddrc.1 = 1


Dim Bla As Byte
Dim Pwma As Byte
Dim Pwmb As Byte
Pwmb = 10
Pwma = 127
Do
Bla = Bla + 1
If Bla > Pwma Then
Portc.0 = 1
Else
Portc.0 = 0
End If

If Bla > Pwmb Then
Portc.1 = 1
Else
Portc.1 = 0
End If


Loop
End

Gruß, Michael

gunni7909
16.01.2009, 21:03
Hallo Michael,
vorerst danke für Deine Antwort.
Ich werde die SW Lösung mal ausprobieren. Zur Abfrage der US Sensoren:
Ich stelle mir vor, daß ich aus der Sensorabfrage einen analogen oder digitalen Wert erhalte, der der Entfernung proportional ist. Wie soll ich da den Pin Change Int nutzen ? Ich muß doch den US in gewissen Zeitabständen abfragen und dann das Ergebnis an den Prozessor weiter leiten bzw verarbeiten.
Viele Grüße
gunni7909

Michael
17.01.2009, 00:10
Hallo gunni7909,

Es gibt verschiedene US-Sensoren. Neuere haben z.B. einen I2C-Bus, ältere geben vielleicht nur einen Puls aus. Der SRF04 ist so einer:
http://www.roboter-teile.de/datasheets/srf04.pdf
Du mißt dann z.B. nur die Pulslänge zwischen der Low-High-Flanke und der High-Low Flanke und hast die Entfernung.

Gruß, Michael