Hola a todos, estoy programando una placa que tiene una salida de pwm x hardware en funcion de la frecuencia de un encoder q entra x interrupción externa, al mismo tiempo tengo q generar dos pwm x software en funcion de la lectura de un adc.
En principio funciona pero tengo errores en el pwm casero debido a la rutina de medición de pulsos.
El microcontrolador es un 16f819, pego el código abajo.
#include <16f819.h>
#device adc=10
#fuses NOWDT,HS,PUT,NOPROTECT
#use delay(clock=16000000)
#define OFF output_high
#define ON output_low
#define HA PIN_B4
#define HB PIN_B5
int16 adc=0;
int16 t1=0;
int16 valor_us=0;
int8 desbordamientos=0;
int16 DC=0;
int8 tmr0=0;
int1 f_giro=1;
int1 f_ext=0;
int16 Ton=0;
#INT_TIMER0
void TMR0_Interrupt()
{
if(f_giro==1)
{
ON (HA);
}
if(f_giro==0)
{
ON (HB);
}
}
#INT_TIMER1
void TMR1_Interrupt()
{
++desbordamientos;
}
#INT_EXT
void RB0_Interrupt()
{
f_ext=1;
}
void main()
{
OFF(HA);
OFF(HB);
setup_timer_0(T0_DIV_4);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_timer_2(T2_DIV_BY_4, 102, 1);
ext_int_edge(L_TO_H);
setup_ccp1(CCP_PWM);
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(0);
set_adc_channel(0);
delay_us(10);
enable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while(true)
{
adc=read_adc();
tmr0=get_timer0();
if (f_ext==1)
{
set_timer1(15536);
set_pwm1_duty(((get_timer1()-15536)*2 + desbordamientos*100000)*(-1)*(0.00189) + 1023);
desbordamientos=0;
f_ext=0;
}
if (adc<512)
{
f_giro=1;
Ton=adc/2;
}
else
{
f_giro=0;
Ton=(adc/2)-256;
}
if (tmr0>Ton)
{
OFF(HA);
OFF(HB);
}
}
}
Espero alguno pueda ayudarme a depurar un poco mi código y lograr tiempos y frecuencias constantes.
Gracias