PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega32, PWM mit 2 Motoren



Wurni
03.09.2009, 16:48
Hey leute,
Ich und ein Kollege sind grade beim Bau eines Roboters.
Nur stecken wir gerade bei dem Code der PWM fest.
Als Motor Treiber Platine haben wir eine einfache H-Brücke (laut Asuro Schaltplan) genommen. Diese soll jetzt zwei kleine Motoren ansteuern.
Den folgenden Code spielten wir den Mega32 rüber und es funktioniert auch, jedoch nicht ganz.
Jetzt zum Problem:
Hab schon einiges versucht aber welche parameter muss ich ändern um
Motor1 schneller und Motor2 langsamer laufen zu lassen?
Bitte mit Code Bsp. dazu.
Mfg



$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1600000

Config Portb.1 = Output
Config Portb.2 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Do
Compare1a = 205
Compare1b = 51

Loop
End

Che Guevara
03.09.2009, 22:36
Hallo Wurni,

was mir als erstes aufgefallen ist:
Ich glaube, du hast bei der "$crystal = 1600000" definition eine Null vergessen. Oder hast du tatsächlich einen 1,6Mhz Quarz?
Des weiteren würde ich die Pins, an denen das PWM-Signal ausgegeben wird, als Ausgang definieren. Das wären in deinem Fall PD4 und PD5.

Anstatt von "compare1a" und "compare1b" kannst du auch "pwm1a" und "pwm1b" schreiben, das finde ich persönlich leslicher und ist kürzer. Ist aber geschmackssache.
Zu deiner eigentlichen Frage:
Die Geschwindigkeit änderst du mit "pwm1a" und "pwm1b".

Gruß
Chris

Wurni
07.09.2009, 12:59
Danke für die shnelle Antwort.
Also müsste der Code dann so aussehen:

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portd.4 = Output
Config Portd.5 = Output


Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Do
Pwm1a = 205
Pwm1b = 51
Loop

End
Und je höher ich jetzt den Wert von Pwm1a bzw. Pwm1b stelle desto schneller müsste sich der jeweilige Motor drehen. Ist das richtig?

recycle
07.09.2009, 15:05
Du müsstest den 4 Pins über die du die Drehrichtung der Motoren steuerst schon noch die passenden Werte setzten.
Per default haben die alle denselben Wert und das heisst für die Motoren "Aus", bzw. sogar "Kurzschlussbremse".

D.h. da fehlt nochfür alle vier Pins:

PortX.X = 1, bzw. PortX.X=0

>> Do
>> Pwm1a = 205
>> Pwm1b = 51
>> Loop

Die Werte in einer Schleife immer wieder neu setzen muss nicht sein, tut allerdings für einen ersten Test auch nicht weh.

Thomas$
07.09.2009, 15:54
geht das pwm jetzt? klingt gerade so als ob du es noch nicht getestet hast. wenn du es noch nicht gemacht hast häng mal leds ran

Wurni
08.09.2009, 17:47
Also das mit der LED funktioniert
Der Motor dreht sich auch. Nur funktioniert die Regelung der Motorgeschwindigkeit irgendwie nicht.
Ich nahm diesen Code:

$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000


Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.6 = Output
Config Portb.7 = Output
Config Portd.4 = Output
Config Portd.5 = Output

Portb.0 = 1
Portb.1 = 0
Portb.6 = 0
Portb.7 = 1


Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Pwm1a = 205
Pwm1b = 51


End

Che Guevara
13.09.2009, 16:31
probier mal folgenden mainloop:



do

for i = 0 to 255
j = 255 - i
pwm1a = i
pwm1b = j
waitms 10
next i

loop


jetzt wird der eine motor immer schneller, während der andere parallel dazu immer langsamer wird

Gruß
Chris