Test comando motori in PWM
Per fare le prime prove "di trazione" ho realizzato un doppio comando PWM con un PIC16F873. Questo PIC dispone infatti di due generatori PWM hardware interni, qui fatti lavorare ad una frequenza di circa 7800Hz. Ho previsto un trimmer che simula lo stick del gas, e un altro che simula lo stick cabra/picchia (pitch), che influisce sui motori in modo differenziale (aumenta la velocità di uno e riduce quella dell'altro e viceversa
Lo schema è qello riportato qui sotto, il PIC legge la tensione prelevata dai due trimmer ottenendo un valore digitale compreso tra 0 e 255, mixa i segnali gas/pitch (nel modo riportato nel listato del programma) e genera due segnali PWM in 256 passi (0=0% 255=100%).
I segnali PWM a livello 0..5V vengono elevati a livello 0..11V dall'integrato L293 che con le sue uscite push-pull è in grado di pilotare correttamente i gate dei mosfet di potenza. Se la tensione inviata ai terminali gate fosse troppo bassa i mosfet non si "accenderebbero" pienamente, scalderebbero e lascerebbero passare molta meno corrente. Le resistenze da 22 ohm non sono strettamente necessarie, ma creano un certo disaccoppiamento tra lo stadio pilota e i finali di potenza.
;-----------------------------------------------------
; 4C_PWM1 - Test comando motori in PWM e mixer
; degli sticks gas e pitch (simulati)
; By Claudio Fin 16/9/2004
;-----------------------------------------------------
PROCESSOR 16F873 ;8MHz
RADIX DEC
INCLUDE "P16F873.INC"
__CONFIG 11111100111010B
;-----------------------------------------------------
; Macro che simulano uno stack
;-----------------------------------------------------
PUSH MACRO VAR1
MOVF VAR1,W
MOVWF INDF
INCF FSR,F
ENDM
POP MACRO VAR1
DECF FSR,F
MOVF INDF,W
MOVWF VAR1
ENDM
;-----------------------------------------------------
; Macro selezione banco ram
;-----------------------------------------------------
BANK0 MACRO ;attiva banco0
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO ;attiva banco1
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
;-----------------------------------------------------
; Definizione variabili del programma
;-----------------------------------------------------
ORG 20H
S_STACK RES 16 ;area stack simulato (16 bytes)
AL RES 1 ;registro di uso generale
AH RES 1 ;registro di uso generale
TRIM_GAS RES 1 ;valore gas di base (0..255)
DELTA_GAS RES 1 ;variazione stick gas (-128..+128)
TRIM_PITCH RES 1 ;variazione pitch di base (-128..+128)
DELTA_PITCH RES 1 ;variazione stick pitch (-128..+128)
PWOUT1 RES 1
PWOUT2 RES 1
;-----------------------------------------------------
; Inizio programma all'indirizzo 0.
;-----------------------------------------------------
ORG 0
; Init dello stack simulato
MOVLW S_STACK
MOVWF FSR
; Init porte
CLRF PORTC ;azzera latch porta C
BANK1
BCF TRISC,1 ;RC1 uscita (pwm2)
BCF TRISC,2 ;RC2 uscita (pwm1)
BANK0
; Init ADC converter
BSF ADCON0,0 ;alimenta ADC
BSF ADCON0,7 ;clock di conversione ck/32
; Init PWM
BANK1
MOVLW 254
MOVWF PR2 ;imposta frequenza pwm 7844Hz
BANK0
CLRF CCPR1L ;duty cycle iniziale = 0
CLRF CCPR2L
BSF T2CON,2 ;attiva timer2 (prescaler :1)
MOVLW 00001100B
MOVWF CCP1CON ;attiva i segnali pwm
MOVWF CCP2CON
; Init variabili
MOVLW 128
MOVWF TRIM_GAS
MOVLW 0
MOVWF TRIM_PITCH
;-----------------------------------------------------
; Ciclo principale
;-----------------------------------------------------
MAINLOOP CALL STICK_GAS ;legge stick gas
CALL STICK_PITCH ;legge stick pitch
CALL MIXER ;miscelazione segnali
MOVF PWOUT1,W ;aggiorna duty cycle
MOVWF CCPR1L ;delle uscite PWM
MOVF PWOUT2,W
MOVWF CCPR2L
GOTO MAINLOOP
;-----------------------------------------------------
; Legge stick gas simulato con potenziometro
;-----------------------------------------------------
STICK_GAS BCF ADCON0,3 ;seleziona RA0 come analog input
CALL DELAIN ;ritardo 35uS per acquisizione
BSF ADCON0,2 ;avvia conversione
BTFSC ADCON0,2 ;attende fine conversione
GOTO $-1
MOVLW 128
SUBWF ADRESH,W
MOVWF DELTA_GAS ;salva delta gas (-128..+128)
RETURN
;-----------------------------------------------------
; Legge stick pitch simulato con potenziometro
;-----------------------------------------------------
STICK_PITCH BSF ADCON0,3 ;seleziona RA1 come analog input
CALL DELAIN ;ritardo 35uS per acquisizione
BSF ADCON0,2 ;avvia conversione
BTFSC ADCON0,2 ;attende fine conversione
GOTO $-1
MOVLW 128
SUBWF ADRESH,W
MOVWF DELTA_PITCH ;salva delta pitch (-128..+128)
RETURN
;-----------------------------------------------------
; Ritardo 35uS per acquisizione ADC converter
;-----------------------------------------------------
DELAIN MOVLW 22
MOVWF AL
DECFSZ AL,F
GOTO $-1
RETURN
;-----------------------------------------------------
; Mixer sticks
; OUT1 = TRIM_GAS + DELTA_GAS + DELTA_PITCH + TRIM_PITCH
; OUT2 = TRIM_GAS + DELTA_GAS - DELTA_PITCH - TRIM_PITCH
; SE OUT>255 ALLORA OUT=255
; SE OUT<0 ALLORA OUT=0
;-----------------------------------------------------
MIXER MOVF TRIM_GAS,W ;prepara campo somma AH:AL
MOVWF AL ;con valore di trim_gas
CLRF AH
CALL SUM_D_GAS ;somma delta_gas
PUSH AH ;salva valore AH:AL
PUSH AL
PUSH DELTA_PITCH
CALL SUM_D_PITCH ;somma delta_pitch
POP DELTA_PITCH
PUSH TRIM_PITCH
CALL SUM_T_PITCH ;somma trim_pitch
POP TRIM_PITCH
CALL NORMALIZZA ;normalizza range uscita
MOVF AL,W
MOVWF PWOUT1
POP AL ;recupera valore AH:AL
POP AH
CALL SUB_D_PITCH ;sottrai delta_pitch
PUSH TRIM_PITCH
CALL SUB_T_PITCH ;sottrai trim_pitch
POP TRIM_PITCH
CALL NORMALIZZA ;normalizza range uscita
MOVF AL,W
MOVWF PWOUT2
RETURN
;-----------------------------------------------------
SUM_D_GAS BTFSC DELTA_GAS,7 ;se delta_gas positivo
GOTO $+6
MOVF DELTA_GAS,W ;sommalo ad AH:AL
ADDWF AL,F
BTFSC STATUS,C
INCF AH,F
RETURN
COMF DELTA_GAS,F ;altrimenti complementa
INCF DELTA_GAS,W ;delta_gas
SUBWF AL,F ;e sottrailo da AH:AL
BTFSS STATUS,C
DECF AH,F
RETURN
;-----------------------------------------------------
SUM_T_PITCH BTFSC TRIM_PITCH,7 ;se trim_pitch positivo
GOTO $+6
MOVF TRIM_PITCH,W ;sommalo ad AH:AL
ADDWF AL,F
BTFSC STATUS,C
INCF AH,F
RETURN
COMF TRIM_PITCH,F ;altrimenti complementa
INCF TRIM_PITCH,W ;trim_pitch
SUBWF AL,F ;e sottrailo ad AH:AL
BTFSS STATUS,C
DECF AH,F
RETURN
;-----------------------------------------------------
SUM_D_PITCH BTFSC DELTA_PITCH,7 ;se delta_pitch positivo
GOTO $+6
MOVF DELTA_PITCH,W ;sommalo ad AH:AL
ADDWF AL,F
BTFSC STATUS,C
INCF AH,F
RETURN
COMF DELTA_PITCH,F ;altrimenti complementa
INCF DELTA_PITCH,W ;delta_pitch
SUBWF AL,F ;e sottrailo ad AH:AL
BTFSS STATUS,C
DECF AH,F
RETURN
;-----------------------------------------------------
SUB_T_PITCH BTFSC TRIM_PITCH,7 ;se trim_pitch positivo
GOTO $+6
MOVF TRIM_PITCH,W ;sottrailo ad AH:AL
SUBWF AL,F
BTFSS STATUS,C
DECF AH,F
RETURN
COMF TRIM_PITCH,F ;altrimenti complementa
INCF TRIM_PITCH,W ;trim_pitch
ADDWF AL,F ;e sommalo ad AH:AL
BTFSC STATUS,C
INCF AH,F
RETURN
;-----------------------------------------------------
SUB_D_PITCH BTFSC DELTA_PITCH,7 ;se delta_pitch positivo
GOTO $+6
MOVF DELTA_PITCH,W ;sottrailo ad AH:AL
SUBWF AL,F
BTFSS STATUS,C
DECF AH,F
RETURN
COMF DELTA_PITCH,F ;altrimenti complementa
INCF DELTA_PITCH,W ;delta_pitch
ADDWF AL,F ;e sommalo ad AH:AL
BTFSC STATUS,C
INCF AH,F
RETURN
;-----------------------------------------------------
; Riporta range di AH:AL entro 0..255
;-----------------------------------------------------
NORMALIZZA MOVF AH,F
BTFSC STATUS,Z
RETURN
CLRW
BTFSS AH,7
MOVLW 255
MOVWF AL
RETURN
;-----------------------------------------------------
END
16/9/2004
Prime osservazioni
Ho montato i due motori (dei 480 con riduttore 4:1) su un'intelaiatura di legno (listello provvisorio di pino con sezione quadrata da 15mm di lato per 60cm di lunghezza).
Il comando PWM funziona bene ma, come mi aspettavo, la parte utile di escursione dei trimer/stick è minima rispetto all'escursione totale, e il comando pitch in particolare produce una variazione troppo marcata. Questa parte andrà naturalmente rivista.
Le prime prove le ho fatte alimentando i motori con il filo sottile visibile nella foto, cosa che si è rivelata subito un ostacolo al tentativo di raggiungere piena potenza. Per questo motivo ho sostituito il filo con un più generoso 1,5mm
2 collegato direttamente alla batteria (12V al piombo), e ho messo i mosfet su due piccole basettine vicino ai motori, lasciando il circuito di comando sulla bredboard.
Nonostante il notevole miglioramento la spinta complessiva è bassa, per capire se fosse ancora un problema di potenza ho quindi pensato di misurare i giri delle eliche. Come contagiri ho usato una C con un LED ultraluminoso affacciato su una fotoresistenza, entro cui far passare le pale dell'elica. Ho constatato che gli RPM si raggiungono (4400..4900), ma con una spinta utile di almeno 150 grammi per motore inferiore a quanto dichiarato dalla casa costruttrice... questi 300 grammi in meno (aggravati anche dai 30+30 grammi di peso in più dei motori rispetto a quanto pensavo) rendono le cose molto più complesse, perché il margine su cui contavo di giocare è di fatto inesistente...
Dettaglio del supporto motore e del mosfet di potenza. Ho avuto la piacevole
sorpresa di scoprire che il motore si fissa con bulloncini da 2,5mm invece che i consueti 3mm... I terminali del
motore sono dei minifaston da 2,8mm, il mosfet è un comune BUZ11 in contenitore TO220 a
cui ho tolto la parte metallica sporgente (tanto non scalda). I fili sono da 1,5mm
2,
dalla basettina partono anche dei fili sottili che portano la massa e la
tensione della batteria al circuito pilota, e da esso arriva il filo del segnale PWM che va al gate del mosfet.
Il circuito interruttore a mosfet posto vicino al motore. La resistenza da 100k verso massa sul gate serve a tenere spento il motore se non vi è alcuna tensione in arrivo (o se i fili di controllo del cablaggio sono staccati).
Se il filo di controllo che va alla resistenza di gate viene collegato al positivo della batteria il motore gira alla massima velocità possibile.
Circuito di controllo su bredboard. A destra c'è il pic con il quarzo da 8MHz (il PIC è da 20MHz, ma vista l'applicazione è meglio farlo lavorare "tranquillo"), e i due trimmer saldati su un pezzo di millefori per evitare i contatti imperfetti. I trimmer di questo tipo infatti quando sono inseriti direttamente nelle bredboard tendono a perdere il contatto su qualche piedino... cosa in questo caso da evitare tassativamente!
Sulla sinistra l'L293 che pilota i mosfet, un solo L293 ne può comandare quattro.
I motori in funzione, le squadrette metalliche fungono da zavorra per valutare la capacità di sollevamento.
Dai dati della casa costruttrice i 2 rotori a 4900 rpm dovrebbero spingere complessivamente fino a 1kg... mentre non raggiungono gli 800 grammi (probabilmente meno, una misura precisa devo ancora farla).
Il sensore ottico del contagiri, la fotoresistenza è racchiusa in un pezzo di guaina per schermarla dalla luce esterna.
Schema del sensore contagiri, all'uscita del transistor sono presenti dei picchi di tensione (la cui ampiezza varia a seconda dei giri ed è sovrapposta ad un discreto rumore) leggibili su un oscilloscopio. Dalla distanza in millisecondi tra gli impulsi si riesce già a determinare il numero di giri, per esempio se gli impulsi sono distanti 10ms significa che il fascio luminoso viene interrotto 100 volte al secondo, il che vuol dire 50 giri al secondo, e cioè 50*60=3000 giri al minuto.
19/9/2004