![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
' ============================================================================ ' Die beiden Timer/PWM-Module der Open-Maxi für 8 Servo-Ports umkonfigurieren ' In OCBASIC 1.12a_e1 von Dietmar Harlos am 17. Januar 2019 ' ============================================================================ ' Die beiden Timer/PWM-Module der Open-Maxi unterstützen die Betriebsarten ' "Input Capture", "Output Compare" und "Buffered Edge-Aligned Pulse-Width ' Modulation (PWM)" an jedem Kanal. Letztere kann für Servo-, Digital-Analog- ' oder PWM-Betrieb eingesetzt werden. Dieses Beispielprogramm demonstriert, ' wie acht Servomotoren angesteuert werden können. Allerdings stehen dadurch ' folgende Funktionen des Open-Maxi-Betriebssystems nicht mehr zur Verfügung: ' PAUSE, BEEP, TEST, TIMER, DCF77, RTCTIMER, RTC (Real-Time-Clock), FREQ1, ' FREQ2, DA[1], DA[2], PORT[35] und PORT[36]. Außerdem sind FREQ1 und FREQ2 ' durch diese Umkonfigurierung jetzt Ausgabeports. ' Welche Timer-Module und deren Kanäle sind für welche Pins zuständig? ' ' Pin | Bezeichnung im AW60-Controller ' ----------+------------------------------------------ ' PORT[35] | Timer/PWM-Module 1 - Channel 0 (TPM1CH0) ' PORT[36] | Timer/PWM-Module 1 - Channel 1 (TPM1CH1) ' BEEP | Timer/PWM-Module 1 - Channel 2 (TPM1CH2) ' TEST | Timer/PWM-Module 1 - Channel 3 (TPM1CH3) ' FREQ1 | Timer/PWM-Module 1 - Channel 4 (TPM1CH4) ' FREQ2 | Timer/PWM-Module 1 - Channel 5 (TPM1CH5) ' DA[1] | Timer/PWM-Module 2 - Channel 0 (TPM2CH0) ' DA[2] | Timer/PWM-Module 2 - Channel 1 (TPM2CH1) ' Den Subroutinen zum Setzen der Position des jeweiligen Servos wird als ' Übergabe die gewünschte Position übergeben. Erlaubt sind hier die Werte 0 ' bis 957, die je nach Servo variieren können. Sie wurden experimentell ' ermittelt. ' Auf der OM-Infosite gibt es bei den Downloads die Systemerweiterung ' "Servomotoren für Open-Maxi", die zeigt, wie 4 Servomotoren angesteuert ' werden können, ohne daß Funktionen des Open-Maxi-Betriebssystems ' deaktiviert werden müssen. ' Siehe auch Kapitel 10 "Timer/PWM (S08TPMV2)" im Data Sheet zum MC9S08AW60- ' Mikrocontroller: ' https://www.nxp.com/docs/en/data-sheet/MC9S08AW60.pdf ' --- Definitionen für das System -------------------------------------------- INCLUDE "omax.def" 'Definitionen für die Open-Maxi ' --- Definitionen des Anwenders --------------------------------------------- DIM a,b,c BYTE 'einige Variablen definieren DIM w WORD DEFINE POSLINKS 364 'die kleinste Pulslänge, die der Servo unterstützt '364/12500*20e-3 = 0.58 ms \ experimentell '(364+957)/12500*20e-3 = 2.11 ms / ermittelt ' --- Das Hauptprogramm ------------------------------------------------------ inittpm1 'TPM1-Modul für Servo-Betrieb konfigurieren inittpm2 'TPM2-Modul für Servo-Betrieb konfigurieren WHILE TRUE FOR w=0 TO 957 set_servo_da1 w 'Zur Demonstration alle acht Servo-Motoren ansteuern set_servo_da2 w set_servo_port35 w set_servo_port36 w set_servo_beep w set_servo_test w set_servo_freq1 w set_servo_freq2 w FOR a=0 TO 49 : NEXT a NEXT w FOR w=956 TO 1 STEP -1 set_servo_da1 w set_servo_da2 w set_servo_port35 w set_servo_port36 w set_servo_beep w set_servo_test w set_servo_freq1 w set_servo_freq2 w FOR a=0 TO 49 : NEXT a NEXT w WEND End2Host=ON 'Nach Programmende in den Host-Modus END 'Programmende, Neustart mit der Enter-Taste ' --- Subroutinen zum Setzen der Servopositionen ----------------------------- ' SERVO am PORT[35]-Pin setzen PROCEDURE set_servo_port35(w) TPM1C0VH=(POSLINKS+w) SHR 8 TPM1C0VL=POSLINKS+w RETURN END PROCEDURE ' SERVO am PORT[36]-Pin setzen PROCEDURE set_servo_port36(w) TPM1C1VH=(POSLINKS+w) SHR 8 TPM1C1VL=POSLINKS+w RETURN END PROCEDURE ' SERVO am BEEP-Pin setzen PROCEDURE set_servo_beep(w) TPM1C2VH=(POSLINKS+w) SHR 8 TPM1C2VL=POSLINKS+w RETURN END PROCEDURE ' SERVO am TEST-Pin setzen PROCEDURE set_servo_test(w) TPM1C3VH=(POSLINKS+w) SHR 8 TPM1C3VL=POSLINKS+w RETURN END PROCEDURE ' SERVO am FREQ1-Pin setzen PROCEDURE set_servo_freq1(w) TPM1C4VH=(POSLINKS+w) SHR 8 TPM1C4VL=POSLINKS+w RETURN END PROCEDURE ' SERVO am FREQ2-Pin setzen PROCEDURE set_servo_freq2(w) TPM1C5VH=(POSLINKS+w) SHR 8 TPM1C5VL=POSLINKS+w RETURN END PROCEDURE ' SERVO am DA[1]-Pin setzen PROCEDURE set_servo_da1(w) da0=POSLINKS+w RETURN END PROCEDURE ' SERVO am DA[2]-Pin setzen PROCEDURE set_servo_da2(w) da1=POSLINKS+w RETURN END PROCEDURE ' --- Subroutinen zur Initialisierung ---------------------------------------- ' Das TPM1-Modul für Servo-Betrieb konfigurieren ' PORT[35] liegt an TPM1CH0 ' PORT[36] liegt an TPM1CH1 ' BEEP liegt an TPM1CH2 ' TEST liegt an TPM1CH3 ' FREQ1 liegt an TPM1CH4 ' FREQ2 liegt an TPM1CH5 PROCEDURE inittpm1 INLASM ! mov #%00001101,TPM1SC 'TPM clock input = 20E6/32 = 625 kHz ! ldhx #12499 'Timer 1 Counter Modulo Registers (TPMxMODH:TPMxMODL) ! sthx TPM1MODH 'von 0 bis inklusive 12499 zählen (also Modulo 12500) - (kein 100% duty cycle) ! lda #%00101000 '"Edge-aligned PWM, High-true pulses" - PWM-Frequenz: 20E6/32/12500 = 50 Hz ! sta TPM1C0SC 'Timer 1 Channel 0 Status and Control Register ! sta TPM1C1SC 'Timer 1 Channel 1 Status and Control Register ! sta TPM1C2SC 'Timer 1 Channel 2 Status and Control Register ! sta TPM1C3SC 'Timer 1 Channel 3 Status and Control Register ! sta TPM1C4SC 'Timer 1 Channel 4 Status and Control Register ! sta TPM1C5SC 'Timer 1 Channel 5 Status and Control Register ! rts END PROCEDURE ' Das TPM2-Modul für Servo-Betrieb konfigurieren ' DA[1] liegt an TPM2CH0 ' DA[2] liegt an TPM2CH1 PROCEDURE inittpm2 INLASM ! mov #%00001101,TPM2SC 'TPM clock input = 20E6/32 = 625 kHz ! ldhx #12499 'Timer 2 Counter Modulo Registers (TPMxMODH:TPMxMODL) ! sthx TPM2MODH 'von 0 bis inklusive 12499 zählen (also Modulo 12500) - (kein 100% duty cycle) ! lda #%00101000 '"Edge-aligned PWM, High-true pulses" - PWM-Frequenz: 20E6/32/12500 = 50 Hz ! sta TPM2C0SC 'Timer 2 Channel 0 Status and Control Register ! sta TPM2C1SC 'Timer 2 Channel 1 Status and Control Register ! rts END PROCEDURE ' --- Programmende ---------------------------------------------------------- Passender Link: Bedienungsanleitung zur Open-Macro und Open-Maxi Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |