raist
22.08.2012, 18:39
Hallo,
ich baue derzeit mit ein paar Kommilitonen im Rahmen einer Projektarbeit an einem FTS. Die Steuerung ist so ziemlich dem Asuro nachempfunden. Um die Drehzahl der asynchron Motoren genau regeln zu können, verwenden wir dabei Taktscheiben (120er Teilung). Das Problem ist, dass wir dabei eine viel zu hohe Anzahl an Pulsen bekommen. So haben wir z.B. bei 44 upm über 50000 Pulse/min gemessen (per Pin-Change Interrupt / beide Flanken). Wenn ich richtig rechne müssten es eigentlich 240 * 44 = 10560 sein. Wir haben mit dem Oszilloskop das Signal am Pin gemessen und haben eine recht saubere Rechteckspannung. Prinzipiell ist das für uns eigentlich kein Problem, weil Drehzahl und Pulse trotzdem gleichmäßig ansteigen - doppelte Drehzahl = doppelt soviele Pulse. Allerdings finden wir es jetzt nicht so wirklich schön ;) Wir verwenden einen Atmega 2560 und programmieren mit Bascom. Hier ist mal ein "Testprogramm" von uns, allerdings misst dieses nur noch eine Flanke (zumindest soll es das) und gibt die Drehzahl sekündlich aus... Sieht evtl. etwas wild aus, weil wir momentan nur "rumprobieren" (wir haben erst vor 3 Wochen angefangen uns damit zu beschäftigen)
$prog , 255 , &B11011001
$regfile = "m2560def.dat"
$hwstack = 120
$framesize = 100
$swstack = 100
$crystal = 16000000
'Timer für Zeitbezug (1 Sekunde)
Config Timer1 = Timer , Prescale = 256
Enable Timer1
On Timer1 Timing
Timer1 = 3036
'-----------------------------------
'Pin Change Interrupt
'Motor links
Config Pink.4 = Input
Portk.4 = 1
'Motor rechts
Config Pink.5 = Input
Portk.5 = 1
Enable Interrupts
Pcmsk2 = &B00110000
On Pcint2 Test
Enable Pcint2
'Variablen für Inkremente
Dim Inkr_links As Word
Dim Inkr_rechts As Word
'Variablen für vorherigen Zustand um Flanke feststellen zu können
Dim Tmp_links As Bit
Dim Tmp_rechts As Bit
Inkr_links = 0
Inkr_rechts = 0
Tmp_links = 0
Tmp_rechts = 0
'---------------------------
'PWM für beide Motoren
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinb.4 = Output
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinh.6 = Output
Config Timer2 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Portc.2 = 0
Portc.3 = 1
Pwm2a = 60
Portc.0 = 1
Portc.1 = 0
Pwm2b = 20
'------------------------------------
Do
Loop
End
'--------------------------------------
'Interrupt für Pulse
Test:
If Pink.4 = 1 And Tmp_links = 0 Then
Incr Inkr_links
Tmp_links = Pink.4
End If
If Pink.5 = 1 And Tmp_rechts = 0 Then
Incr Inkr_rechts
Tmp_rechts = Pink.5
End If
Tmp_links = Pink.4
Tmp_rechts = Pink.5
Return
'-------------------------------------
'Timer für Zeitbezug (Umdrehungen/Sekunde) und Ausgabe
Timing:
Print Inkr_links ; " " ; Inkr_rechts
Inkr_links = 0
Inkr_rechts = 0
Return
Ich bin für jeden Tipp dankbar...
ich baue derzeit mit ein paar Kommilitonen im Rahmen einer Projektarbeit an einem FTS. Die Steuerung ist so ziemlich dem Asuro nachempfunden. Um die Drehzahl der asynchron Motoren genau regeln zu können, verwenden wir dabei Taktscheiben (120er Teilung). Das Problem ist, dass wir dabei eine viel zu hohe Anzahl an Pulsen bekommen. So haben wir z.B. bei 44 upm über 50000 Pulse/min gemessen (per Pin-Change Interrupt / beide Flanken). Wenn ich richtig rechne müssten es eigentlich 240 * 44 = 10560 sein. Wir haben mit dem Oszilloskop das Signal am Pin gemessen und haben eine recht saubere Rechteckspannung. Prinzipiell ist das für uns eigentlich kein Problem, weil Drehzahl und Pulse trotzdem gleichmäßig ansteigen - doppelte Drehzahl = doppelt soviele Pulse. Allerdings finden wir es jetzt nicht so wirklich schön ;) Wir verwenden einen Atmega 2560 und programmieren mit Bascom. Hier ist mal ein "Testprogramm" von uns, allerdings misst dieses nur noch eine Flanke (zumindest soll es das) und gibt die Drehzahl sekündlich aus... Sieht evtl. etwas wild aus, weil wir momentan nur "rumprobieren" (wir haben erst vor 3 Wochen angefangen uns damit zu beschäftigen)
$prog , 255 , &B11011001
$regfile = "m2560def.dat"
$hwstack = 120
$framesize = 100
$swstack = 100
$crystal = 16000000
'Timer für Zeitbezug (1 Sekunde)
Config Timer1 = Timer , Prescale = 256
Enable Timer1
On Timer1 Timing
Timer1 = 3036
'-----------------------------------
'Pin Change Interrupt
'Motor links
Config Pink.4 = Input
Portk.4 = 1
'Motor rechts
Config Pink.5 = Input
Portk.5 = 1
Enable Interrupts
Pcmsk2 = &B00110000
On Pcint2 Test
Enable Pcint2
'Variablen für Inkremente
Dim Inkr_links As Word
Dim Inkr_rechts As Word
'Variablen für vorherigen Zustand um Flanke feststellen zu können
Dim Tmp_links As Bit
Dim Tmp_rechts As Bit
Inkr_links = 0
Inkr_rechts = 0
Tmp_links = 0
Tmp_rechts = 0
'---------------------------
'PWM für beide Motoren
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinb.4 = Output
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinh.6 = Output
Config Timer2 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Portc.2 = 0
Portc.3 = 1
Pwm2a = 60
Portc.0 = 1
Portc.1 = 0
Pwm2b = 20
'------------------------------------
Do
Loop
End
'--------------------------------------
'Interrupt für Pulse
Test:
If Pink.4 = 1 And Tmp_links = 0 Then
Incr Inkr_links
Tmp_links = Pink.4
End If
If Pink.5 = 1 And Tmp_rechts = 0 Then
Incr Inkr_rechts
Tmp_rechts = Pink.5
End If
Tmp_links = Pink.4
Tmp_rechts = Pink.5
Return
'-------------------------------------
'Timer für Zeitbezug (Umdrehungen/Sekunde) und Ausgabe
Timing:
Print Inkr_links ; " " ; Inkr_rechts
Inkr_links = 0
Inkr_rechts = 0
Return
Ich bin für jeden Tipp dankbar...