Modulo PWM 16f628a TMR0 TMR1

Buenas tardes.

Llebo algun tiempo estancado con un pequeño proyecto.
Se trata de una pequeña centralita para una caldera de gasoil.

El proyecto consiste en conseguir un "intermitente" que simularia la entrada de combustible al sistema, este tiene 5 velocidades distintas, a la vez que esta funcionando este "intermitente" un motor comandado por PWM regula sus RPM en funcion de la velocidad preestablecida.

El problema esta en incorporar el PWM para la regulacion del motor, que no consigo implementarlo.
Dejo archivo de la simulacion de proteus y su archivo PICBASIC con la programacion para ver si alguien puede echarme una mano.


Código:
' Variables hardware -----------------------------------------------------------
Led1 var porta.1 'Led potencia 1
Led2 var porta.0 'Led potencia 2
Led3 var portb.7 'Led potencia 3
Led4 var portb.6 'Led potencia 4
Led5 var porta.2 'Led potencia 5

Bajar var portb.4 'Pulsador bajar potencia
Subir var portb.5 'Pulsador subir potencia
Bajar_pulsado var bit 'El pulsador de bajar potencia esta pulsado
Subir_pulsado var bit 'El pulsador de subir potencia esta pulsado

Bomba var portb.1
Bujia var portb.2
Ventilador var portb.3

' Test funcionamiento-----------------------------------------------------------

high led1
high led2
high led3
high led4
high led5
high bomba
high bujia
high ventilador
pause 150
Low led1
Low led2
Low led3
Low led4
Low led5
Low bomba
Low bujia
Low ventilador



'Variables software ------------------------------------------------------------
Potencia Var byte 'Valor seleccionado de la potencia
Encendido var bit 'El proceso de encendido se ha realizado o no
Bomba_tiempo_encendida var word
Bomba_tiempo_apagada var word
Bomba_contador var word
Bomba_espera var word 'Tiempo de espera desde que se enciende la bujía hasta
                        'que empieza a dar pulsos la bomba
Bomba_habilitada var bit 'La bomba está habilitada o no
Bujia_contador var word
Bujia_contador_maximo var word 'Tiempo de encendido de la bujía
Ventilador_apagado var word 'Tiempo funcionando al apagar el sistema

'Inicialización de variables ---------------------------------------------------
Potencia=0
encendido=0
bajar_pulsado=0
subir_pulsado=0
bujia_contador=0 'Contador de tiempo de encendido de la bujía
bomba_tiempo_apagada=0
bomba_contador=0
bomba_habilitada=0  'Bomba deshabilitada

'*******************************************************************************
'Variables para el comportamiento del sistema 
'*******************************************************************************
bomba_tiempo_encendida=3 'Tiempo que la bomba estará inyectando combustible
bomba_espera=50 'Tiempo de espera desde que se enciende la bujía hasta
                        'que empieza a dar pulsos la bomba
Bujia_contador_maximo=100 'Tiempo de encendido de la bujía
ventilador_apagado=1000 'Tiempo funcionando al apagar el sistema

'Ir al bloque leds para configurar los tiempos de bomba apagada en cada nivel de
'potencia
'*******************************************************************************




' Timer ------------------------------------------------------------------------
OPTION_REG = $05 ; prescaler = 64
INTCON = $A0 
on interrupt goto p1


'Inicio del programa -----------------------------------------------------------
programa:


'-------------------------------------------------------------------------------
' CONTROL DE LOS PULSADORES
' Monitoriza si se accionan los botones de potencia y almacena el nivel de
' potencia deseado en la variable Potencia
'-------------------------------------------------------------------------------
if subir=0 then
    subir_pulsado=1
endif
if subir=1 and subir_pulsado=1 then 'Si se ha soltado el pulsador
    if potencia<5 then potencia=potencia+1
    subir_pulsado=0
endif
if bajar=0 then
    bajar_pulsado=1
endif
if bajar=1 and bajar_pulsado=1 then 'Si se ha soltado el pulsador
    if potencia>0 then potencia=potencia-1
    bajar_pulsado=0
endif


'-------------------------------------------------------------------------------
' LEDS
' Encendido y apagado de los leds en funcion de la potencia seleccionada
'-------------------------------------------------------------------------------
if potencia=>1 then 
    high led1
    bomba_tiempo_apagada=25
else 
    low led1 
endif
if potencia=>2 then 
    high led2
    bomba_tiempo_apagada=19
else
    low led2
endif
if potencia=>3 then 
    high led3
    bomba_tiempo_apagada=13
else
    low led3
endif
if potencia=>4 then 
    high led4
    bomba_tiempo_apagada=7
else
    low led4
endif
if potencia=5 then 
    high led5
    bomba_tiempo_apagada=3
else
    low led5
endif


'-------------------------------------------------------------------------------
' APAGADO
' Si el sistema esta funcionando, y se establece la potencia en cero (apagado)
' desconectar todo y dejar el ventilador funcionando durante 30 segundos
'-------------------------------------------------------------------------------
if encendido=1 and potencia=0 then
    low bomba 'Desconectar la bomba
    low bujia 'Desconectar la bujía
    encendido=0
    bujia_contador=0
    bomba_habilitada=0
    pause ventilador_apagado 'Esperar 30 segundos
    low ventilador 'Desconectar el ventilador
    
endif


goto programa



'-------------------------------------------------------------------------------
' INTERRUPCIÓN
' Se produce cada milisegundo
'-------------------------------------------------------------------------------
disable
p1:
if potencia>0 then
    
    'VENTILADOR
    high ventilador 'Conectar el ventilador

    'BUJIA
    if encendido=0 then 'Si no se ha hecho el encendido
        high bujia 'Conectar la bujia
        if bujia_contador<Bujia_contador_maximo then
            bujia_contador=bujia_contador + 1
        endif
        if bujia_contador=bomba_espera then
             bomba_habilitada=1 'Habilitar que la bomba de pulsos
             high bomba 'Conectar la bomba
        endif
        if bujia_contador=Bujia_contador_maximo then
            low bujia 'Apagar la bujia
            encendido=1 'El encendido se ha realizado
        endif
    endif
    
    'BOMBA
    if bomba_habilitada=1 then
        bomba_contador=bomba_contador + 1
        if bomba=1 then 'Si la bomba esta encendida
            if bomba_contador=>bomba_tiempo_encendida then
                low bomba
                bomba_contador=0
            endif
        else 'Si la bomba está apagada
            if bomba_contador=>bomba_tiempo_apagada then
                high bomba
                bomba_contador=0
            endif        
        endif
        
    endif

    INTCON.2 = 0 'rehabilita interrupciones del TRMO

endif

resume
enable
end

Saludos y gracias.
 

Adjuntos

  • motor_pwm_intermitente.rar
    21.1 KB · Visitas: 41
Última edición:
Atrás
Arriba