PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 4x DC Motoren über 2x L293D per PWM ansteuern



spelli2001
22.02.2013, 04:17
Hallo,

ich habe hier ein Entwicklerboard mit einem Atmega644 und 20 MHz, verbunden mit 2x L293D mit denen ich 4x kleine DC Motoren ansteuern möchte.

Ich habe leider das Problem, dass ich mit der PWM nicht weiter komme. Ich füge hier den Code an, vielleicht kann mir jmd. helfen:



Hallo,

leider startet mein Atmega644 nach dem Print "Ctrl v.0.1" immer wieder
neu...

Ich möchte 4 DC Motoren in der Richtung und über 4x PWM in der
Geschwindigkeit regeln - aber da stimmt was nicht!


'################################################# ###############
'
' Control v. 0.1
' -------------------------------------
'
' Stand: 21.02.2013, ATmega644
'
'

'################################################# ###############



'--------------------------------------------------------------------------
' Compilerinstruktionen und Compilerdirektiven
'--------------------------------------------------------------------------

$regfile = "m644def.dat"
$crystal = 20000000
$hwstack = 64
$swstack = 64
$framesize = 64
$baud = 9600

'--------------------------------------------------------------------------
' Definition von Ressourcen
'--------------------------------------------------------------------------

Led Alias Portd.2 ' rote LED


'Treiber L293 oben (1) / Timer2
1_pwm1_z Alias Portd.7
1_m1a_z Alias Portc.3
1_m1b_z Alias Portc.4

1_pwm2_f Alias Portd.6
1_m2a_f Alias Portc.7
1_m2b_f Alias Portc.6


'Treiber L293 unten (2) / Timer0
2_pwm1_p Alias Portb.3
2_m1a_p Alias Portb.1
2_m1b_p Alias Portb.2

2_pwm2_t Alias Portb.4
2_m2a_t Alias Portb.0
2_m2b_t Alias Portc.5




'--------------------------------------------------------------------------
' Definition von Konstanten
'--------------------------------------------------------------------------



'--------------------------------------------------------------------------
' Definition von Variablen und Datentypen
'--------------------------------------------------------------------------

'---- PWM für A293D ----
Dim 1z As Integer
Dim 1f As Integer
Dim 2p As Integer
Dim 2t As Integer



'--------------------------------------------------------------------------
' Konfiguration und Basiseinstellungen
'--------------------------------------------------------------------------


' Timer2 für PWM 8Bit L293D (1) "oben"
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8

' Timer0 für PWM 8Bit L293D (2) "unten"
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8



'---- Timer ----


'---- Outputs ----
Config Led = Output


'Treiber L293 oben (1) / Timer2
Config 1_pwm1_z = Output 'OC2A
Config 1_m1a_z = Output
Config 1_m1b_z = Output

Config 1_pwm2_f = Output 'OC2B
Config 1_m2a_f = Output
Config 1_m2b_f = Output


'Treiber L293 unten (2) / Timer0
Config 2_pwm1_p = Output 'OC0A
Config 2_m1a_p = Output
Config 2_m1b_p = Output

Config 2_pwm2_t = Output 'OC0B
Config 2_m2a_t = Output
Config 2_m2b_t = Output




'---- Interrupts ----
Enable Interrupts
Enable Timer0
Enable Timer2



'--------------------------------------------------------------------------
' Init
'--------------------------------------------------------------------------

1_m1a_z = 0 ' L293D Zoom OFF
1_m1b_z = 0
'1z = 150 ' Anfangsgeschwindigkeit für PWM L293D
'Ocr2a = 1z

1_m2a_f = 0 ' L293D Focus OFF
1_m2b_f = 0
'1f = 150 ' Anfangsgeschwindigkeit für PWM L293D
'Ocr2b = 1f

2_m1a_p = 0 ' L293D PAN OFF
2_m1b_p = 0
'2p = 150 ' Anfangsgeschwindigkeit für PWM L293D
'Ocr0a = 2p

2_m2a_t = 0 ' L293D TILT OFF
2_m2b_t = 0
'2t = 150 ' Anfangsgeschwindigkeit für PWM L293D
'Ocr0b = 2t

Led = 1

Print "Ctrl v.0.1"


'--------------------------------------------------------------------------
' Hauptprogramm
'--------------------------------------------------------------------------


Do

2_m2a_t = 1
2_m2b_t = 0

Ocr0b = 150




Loop

End

spelli2001
22.02.2013, 15:47
Hallo,

ich bringe die 20 Mhz, Prescaler und meine 4 Motoren nicht in den Einklang!

Nichts rührt sich! Welche Frequenz sollte ich wählen?

Danke,
Christoph

Searcher
22.02.2013, 17:06
ich bringe die 20 Mhz, Prescaler und meine 4 Motoren nicht in den Einklang!


' Timer0 für PWM 8Bit L293D (2) "unten"
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Das Kommando stellt den Phase Correct PWM Modus des Timer0 ein.
Der Systemtakt ist 20MHz. Du teilst den Takt für den Timer0 mit dem Timer Prescaler durch 8

20Mhz / 8 = 2,5MHz
Der Timer0 wird also mit 2,5MHz getaktet.

Pro Takt verändert der Timer sein Zählregister TCNT0 um eins.
Das 8 Bit Register TCNT0 zählt mit 255 Takten von 0 auf 255. Mit den nächsten 255 Takten wird TCNT0 im Phase Correct Modus wieder runtergezählt (254, 253 ... 0).

In diesem Timerzyklus mit 510 Takten wird ein PWM Zyklus erzeugt.
Die eingestellte PWM Frequenz ist also 2500000Hz / 510 = ca. 4901 Hz

Falls du das alles schon wußtest, stell eine klare Frage.


Nichts rührt sich!
Hab mich nicht durch den Code durchgewühlt, da der Schaltplan fehlt. Vielleicht hast du ja nur was falsch angeschlossen?
Oder das Jtag Interface auf Port C ist nicht abgeschaltet?


Welche Frequenz sollte ich wählen?
5KHz könnte passen. Die optimale Frequenz hängt von deinem Motor ab und ist so einfach nicht zu beantworten.

Konzentrier dich doch erstmal auf einen Motor und bring den zum Laufen. Das macht den Code auch erstmal übersichtlicher.

Gruß
Searcher

spelli2001
23.02.2013, 19:50
Hallo!

Danke für deine Hilfe und deine Erklärung! - Es war das JTAG Interface.

Der Motor dreht jetzt zwar immer und das von Anfang an... Ich denke, dass ist ein Frequenzproblem!

Danke und Gruß
Christoph