;----------------------------------------------------- ; EASYGLIDER - Controllo motore easy glider electric ; By Claudio Fin 15/9/2005 - Versione 1.3 ; Ultimi aggiornamenti: ; 17/09/2005 aggiunto gestione freno ; 18/09/2005 ristretto range riconoscimento impulsi ; e migliorato indicazione LED ; 17/10/2005 freno sempre inserito a motore spento ;----------------------------------------------------- PROCESSOR 16F628 RADIX DEC INCLUDE "P16F628.INC" __CONFIG 11110100010100B ;clock interno 4MHz ;WDT attivo ;----------------------------------------------------- ; RA0 (in) ENAM - 0=motore abilitato 1=disabilitato ; RA1 (cin) - Partitore tensione batteria ; RA2 (cin) - Partitore tensione 5V ; RA3 (in) PULSEIN - Ingresso impulsi da ricevente ; ; RB0 (out) BRAKE - Freno 1=attivo 0=disattivo ; RB1 (out) LED - Led 1=acceso 0=spento ; RB3 (out) - Out PWM (1=motore acceso) ;----------------------------------------------------- ; FLAG1,0 ROLLOVER - 1 se impulso + lungo di 722 uS ; FLAG1,1 PULSEOK - 1 se singolo impulso ricevuto ok ; FLAG1,2 STATLED - Stato LED per lampeggio, 1=acceso ; FLAG1,3 SIGNALOK - 1 se presente segnale ok ; FLAG1,4 CUTOFF - 1 se raggiunto il cutoff ;----------------------------------------------------- ;----------------------------------------------------- ; Variabili del programma e definizioni ;----------------------------------------------------- ORG 20H CL RES 1 FLAG1 RES 1 CNTLED RES 1 IMPULSO RES 1 CNTRX RES 1 CCPR1L_BK RES 1 CNTCUTOFF RES 1 CNTPWM RES 1 STATPWM RES 1 #DEFINE ENAM PORTA,0 #DEFINE PULSEIN PORTA,3 #DEFINE BRAKE PORTB,0 #DEFINE LED PORTB,1 #DEFINE ROLLOVER FLAG1,0 #DEFINE PULSEOK FLAG1,1 #DEFINE STATLED FLAG1,2 #DEFINE SIGNALOK FLAG1,3 #DEFINE CUTOFF FLAG1,4 ;----------------------------------------------------- ; Inizio programma all'indirizzo 0. ;----------------------------------------------------- ORG 0 CLRWDT GOTO INIZIO ;----------------------------------------------------- ; Tabella transcodifica per adattamento corsa, ; riduzione massimo al 70% e applicazione curva ; antiquadratica per comando in potenza. ;----------------------------------------------------- ORG 256 INCLUDE "tabconv.txt" ;----------------------------------------------------- ; Init porte INIZIO MOVLW 00000000B MOVWF PORTB BSF STATUS,RP0 ;BANCO1 CLRF TRISB BCF STATUS,RP0 ;BANCO0 ; Init comparatori MOVLW 5 ;RA1 RA2 ingressi comparatore MOVWF CMCON ;CMCON,C2OUT VA A 1 QUANDO ;LA V SCENDE SOTTO I 9,22v ; Init PWM BSF STATUS,RP0 ;BANCO1 MOVLW 254 MOVWF PR2 ;imposta frequenza pwm 3900Hz BCF STATUS,RP0 ;BANCO0 CLRF CCPR1L ;duty cycle iniziale = 0 MOVLW 4 MOVWF T2CON ;attiva timer2 (pre/postscaler :1) MOVLW 00001100B MOVWF CCP1CON ;attiva i segnali pwm ; Init timer0 BSF STATUS,RP0 ;BANCO1 MOVLW 11010111B MOVWF OPTION_REG BCF STATUS,RP0 ;BANCO0 ; Init variabili CLRF IMPULSO CLRF FLAG1 CLRF STATPWM MOVLW 10 MOVWF CNTRX MOVWF CNTLED CLRF CCPR1L_BK MOVLW 40 MOVWF CNTCUTOFF ;----------------------------------------------------- ; Ciclo principale ;----------------------------------------------------- MAINLOOP CALL READPULSE CALL SIGNALTST CALL CTRLCUTOFF CALL AGGRNPWM CALL AGGRNLED GOTO MAINLOOP ;----------------------------------------------------- ; Lettura impulsi con timeout di 31 mS sulla loro attesa ; e reset da WDT se piu' lunghi di 18mS ; Il valore misurato e' messo in IMPULSO, risoluzione ; 6,12 uS, 128=1,5mS. 157 punti utili. ;----------------------------------------------------- READPULSE MOVLW 136 MOVWF TMR0 BCF INTCON,T0IF ;avvia timer 31 mS MOVLW -117 MOVWF CL BCF ROLLOVER BCF PULSEOK BTFSC PULSEIN ;attende impulso GOTO READPULSE2 BTFSC INTCON,T0IF ;se timeout return RETURN CLRWDT GOTO $-5 READPULSE2 INCF CL,F ;conteggia durata BTFSC STATUS,Z BSF ROLLOVER BTFSC PULSEIN GOTO READPULSE2 BTFSS ROLLOVER ;se impulso troppo corto return RETURN MOVLW 40 ;se CL<40 (960uS) return SUBWF CL,W BTFSS STATUS,C RETURN MOVF CL,W ;se CL>216 (2,04mS) return SUBLW 216 BTFSS STATUS,C RETURN MOVF CL,W ;transcodifica per correzione BTFSC STATUS,Z ;corsa, riduzione al 70% e GOTO $+5 ;pilotaggio in potenza con ADDLW -1 ;curva antiquadratica CLRF PCLATH BSF PCLATH,0 CALL TRANSCODE MOVWF IMPULSO BSF PULSEOK RETURN ;----------------------------------------------------- ; Abilita il bit SIGNALOK solo dopo 10 impulsi ok ; consecutivi. Al primo impulso errato SIGNALOK ; torna a 0 e ne servono altri 10 buoni consecutivi. ;----------------------------------------------------- SIGNALTST BTFSC SIGNALOK GOTO SIGNALTST2 BTFSS PULSEOK GOTO $+5 DECFSZ CNTRX,F RETURN BSF SIGNALOK RETURN MOVLW 10 MOVWF CNTRX RETURN SIGNALTST2 BTFSC PULSEOK RETURN BCF SIGNALOK MOVLW 10 MOVWF CNTRX RETURN ;----------------------------------------------------- ; Controllo raggiungimento tensione di cutoff. ; Se per 40 cicli consecutivi tensione <9,22V ; viene settato il bit CUTOFF. ; Si evitano disturbi e problemi di spunti all'avvio. ;----------------------------------------------------- CTRLCUTOFF BTFSC CMCON,C2OUT GOTO $+4 MOVLW 40 MOVWF CNTCUTOFF RETURN DECFSZ CNTCUTOFF,F RETURN BSF CUTOFF RETURN ;----------------------------------------------------- ; Task controllo motore e freno. ;----------------------------------------------------- ;-----------Stato fermo (motore off, freno on) AGGRNPWM MOVF STATPWM,F BTFSS STATUS,Z GOTO AGGRNPWM2 CLRF CCPR1L ;PWM a zero CALL DEL1MS ;ritardo 1mS BSF BRAKE ;freno motore attivo BTFSC CUTOFF RETURN ;se cutoff ritorna BTFSS SIGNALOK RETURN ;se segnale non ok ritorna BTFSC ENAM RETURN ;se motore non abilitato ritorna MOVF IMPULSO,W BTFSC STATUS,Z RETURN ;se impulso motore a 0 ritorna BCF BRAKE ;toglie freno motore CALL DEL1MS ;ritardo 1mS MOVWF CCPR1L_BK BCF STATUS,C RRF CCPR1L_BK,W ;meta' impulso per variazioni soft MOVWF CCPR1L_BK MOVWF CCPR1L ;avvia PWM BSF STATPWM,1 RETURN ;-----------Stato in moto AGGRNPWM2 BTFSC CUTOFF GOTO AGGRNPWM2A ;se cutoff vai ad arresto BTFSS SIGNALOK GOTO AGGRNPWM2A ;se segnale non ok vai ad arresto BTFSC ENAM GOTO AGGRNPWM2A ;se motore non abilitato vai ad arresto MOVF IMPULSO,W BTFSC STATUS,Z GOTO AGGRNPWM2A ;se impulso a 0 vai ad arresto MOVF IMPULSO,W ;media con valore precedente ADDWF CCPR1L_BK,F ;per ridurre il jitter RRF CCPR1L_BK,W MOVWF CCPR1L_BK MOVWF CCPR1L ;aggiorna uscita PWM RETURN AGGRNPWM2A CLRF CCPR1L ;ferma PWM CLRF STATPWM RETURN ;-----------Ritardo 1,026mS DEL1MS CLRF CNTPWM NOP DECFSZ CNTPWM,F GOTO $-2 RETURN ;----------------------------------------------------- ; Il led lampeggia a 1/4 della freq. degli impulsi ; Se non c'e segnale resta spento. ;----------------------------------------------------- AGGRNLED BTFSS SIGNALOK GOTO AGGRNLED2 DECFSZ CNTLED,F RETURN MOVLW 4 MOVWF CNTLED MOVLW 00000100B XORWF FLAG1,F BTFSS STATLED BSF LED BTFSC STATLED BCF LED RETURN AGGRNLED2 BCF LED BCF STATLED MOVLW 4 MOVWF CNTLED RETURN ;----------------------------------------------------- END