CEDIDO por MRFLOWER
; ESC de 10Khz
; 30 velocidades
; ___________
; Vcc -|1 \__/ 18|- GND
; LED GP5 -|2 17|- GP0 OUT PWM
; GP4 -|3 12F629 16|- GP1 Jumper IN
; PPM IN GP3 -|4________15|- GP2 IN Cut Off
; By MrFlower
; v1.5b
LIST P=PIC12F629
#INCLUDE <P12F629.INC>
; Fuses
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_CLKOUT
CONT_PPM EQU 0x21 ; Memoriza el valor leido de la PPM
CONT EQU 0x22 ; Contador para la PWM
PPM_0 EQU 0x23 ; Memoriza el valor 0 de la PPM
PPM_100 EQU 0x24 ; Memoriza el valor 100 de la PPM
CounterA EQU 0x25
CounterB EQU 0x26
CounterC EQU 0x27
PPM_TEMP EQU 0x28
#Define OUT GPIO,0 ; Salida PWM
#Define IN GPIO,3 ; Entrada PPM
#Define CutOff GPIO,2 ; Entrada CutOff
#Define Jumper GPIO,1 ; Jumper de configuracion
#Define LED GPIO,5 ; LED
ORG 0x2100
DE 0x22,0x23
ORG 0 ; Vector de Reset
bsf STATUS,RP0
movlw 0xFF
movwf OSCCAL
goto INICIO
ORG 4 ; Vector de Interrupcion
;-------------- Lectura de la PPM--------------------------------------------
btfss CutOff
goto Motor_OFF
btfss IN
goto PPM_LOW
;-------------- Estados de la PPM--------------------------------------------
PPM_HIGH clrf TMR0 ; Divisor de la PPM a 0 (en 60 partes)
bsf INTCON,GIE
bcf INTCON,0
retfie
PPM_LOW movf TMR0,W ; Copiamos el contenido del divisor
movwf CONT_PPM ; en el contador de PPM.
bcf INTCON,0
bsf INTCON,GIE
movf PPM_0,W ; Se resta al contador PPM el valor
subwf CONT_PPM,F ; leido de la PPM en la calibracion
goto MAIN
;--------------Confuguracion del PIC-----------------------------------------
INICIO bsf STATUS,RP0
movlw b'10000011' ; Preescaler a 1:32 Re=30 F=10Khz
movwf OPTION_REG ; Preescaler a 1:16 Re=60 F=5Khz
clrf PIE1
movlw b'001110'
movwf TRISIO
bcf STATUS,RP0
movlw 07h
movwf CMCON ; Desactiva los comparadores
clrf CONT_PPM
clrf GPIO
call Temp ; Espera
call Temp ; Espera
call Temp ; Espera
;------------- Comprobacion del Jumper de memorizacion-----------------------
btfsc Jumper
goto Program ; Jumper quitado
;-------------- Vuelca los datos de la Eeprom en PPM_0 y PPM_100------------
bsf STATUS,RP0
clrf EEADR
bsf EECON1,RD
movf EEDATA,W
bcf STATUS,RP0
movwf PPM_0
bsf STATUS,RP0
incf EEADR,F
bsf EECON1,RD
movf EEDATA,W
bcf STATUS,RP0
movwf PPM_100
goto Verify
;------------- Calibracion del stick a 0 ------------------------------------
Program call ReadPPM
movwf PPM_0
bsf LED
call Temp
bcf LED
call Temp
call Temp
;------------- Calibracion del stick a 100-----------------------------------
call ReadPPM
movwf PPM_100
movf PPM_0,W
subwf PPM_100,F
decf PPM_100,F
bsf LED ; Un parpadeo indica que se ha
call Temp ; realizado la operacion.
bcf LED
;-------------- Memorizacion de los valores----------------------------------
write bsf STATUS,RP0
clrf EEADR ; Memoriza PPM_0
movf PPM_0,W
movwf EEDATA
bcf STATUS,RP0
call Eeprom
bsf STATUS,RP0
incf EEADR,F ; Memoriza PPM_100
movf PPM_100,W
movwf EEDATA
bcf STATUS,RP0
call Eeprom
goto $
;-------------- Comprobacion del stick, hasta que no este en 0 no arranca----
Verify call ReadPPM
movwf CONT_PPM
movf PPM_0,W
subwf CONT_PPM,F
btfsc STATUS,Z ; Verifica si el stick esta abajo
goto $+2
goto Verify
movlw b'10011000' ; Activamos interrupciones
movwf INTCON
bsf STATUS,RP0
movlw b'00001000'
movwf IOCB
bcf STATUS,RP0
goto Motor_OFF
;-------------- Lectura de la PPM en modo programacion ----------------------
ReadPPM btfsc IN ; Ignoramos el 1º pulso por si es
goto $-1 ; incorrecto.
btfss IN
goto $-1
clrf TMR0 ; Borramos el divisor para que empieze
btfsc IN ; a contar desde 0 el tiempo de la PPM
goto $-1
movf TMR0,W
return
;--------- Comprobacion el stick, abajo (motor off) arriba (motor al 100%)--
MAIN btfsc STATUS,Z ; Verifica si el stick esta abajo
goto Motor_OFF ; si es asi, apaga el motor.
btfss STATUS,C
goto Motor_OFF
movf CONT_PPM,W
subwf PPM_100,W
btfsc STATUS,Z ; Verifica si el stick esta arriba
goto Motor_ON ; si es asi, enciende el motor.
btfss STATUS,C
goto PWM
bcf LED
movf CONT_PPM,W
movwf PPM_TEMP
;--Rutina que genera la PWM de 10Khz, sale de la rutina interrupcion en PB---
PWM movf PPM_TEMP,W ; Determina la duracion a 1 de la PWM
movwf CONT ;
bsf OUT
decfsz CONT,F ; Temporizador
goto $-1
movf PPM_TEMP,W
subwf PPM_100,W
movwf CONT
bcf OUT
decfsz CONT,F
goto $-1
goto PWM
;--------------Estados del motor al 0% y al 100%-----------------------------
Motor_OFF bcf OUT
bcf LED
goto $
Motor_ON bsf OUT
bsf LED
goto $
;--------------Temporizador de 0,75s------------------------------------------
Temp movlw D'4'
movwf CounterC
movlw D'209'
movwf CounterB
movlw D'255'
movwf CounterA
loop decfsz CounterA,1
goto loop
decfsz CounterB,1
goto loop
decfsz CounterC,1
goto loop
return
;------RUTINA DE ESCRITURA EN LA EEPROM---------------------------------------
Eeprom bsf STATUS,RP0 ; Guarda el bit en la eeprom
bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
bcf STATUS,RP0
btfss PIR1,EEIF ; Espera a que finalize la operacion de
goto $-1 ; esritura
bcf PIR1,EEIF
bsf STATUS,RP0
bcf EECON1,WREN
bcf STATUS,RP0 ;Bank 0
return
END
Funcionamiento del ESC v1.0
Caracteristicas:
FRECUENCIA DE CONMUTACION: 10Khz
Intensidad maxima: depende del MOSFET (hasta 50A)
Corte del motor por tension: regulable (vale para lipo)
Programacion del stick para ajustar el recorrido.
BEC: 1 Amperio (2 microservos).
Peso: Aun por determinar.
Precio: 6/10€ dependiendo de los MOSFET
-Como programar recorridos.
1º- Conectar el Jumper en el ESC y encender la emisora con el stick de gas abajo.
2º- Conectar el ESC a la bateria.
3º- El LED hará un parpadeo, esto indica que se ha memorizado el nivel del stick y que hay que
subir el stick del gas rapidamente al maximo.
4º- Un segundo parpadeo indica que se ha memorizado el nivel maximo.
5º- Ya esta programado, quitamos el jumpler y desconectamos la bateria del ESC.
La siguiente vez que se conecte el ESC habiendo estado programado y con el Jumper quitado será asi:
1º- Encender la emisora (no importa la posicion del stick).
2º- Conectar el ESC a la bateria.
3º- El motor no funcionará hasta que el stick del gas esté abajo del todo (por seguridad).
El LED se encenderá cuando el stick esté al maximo.
Al esquema tuve que añadirle una resist de 10k del gatillo del mosfe a masa si no a maxima potencia se quedaba cebado.