Estoy haciendo un puente H, para lo que voy a usar el ADC(PIN_A0) para ver una tension en un potenciometro linea, que de acuerdo a su posicion sera el sentido y velocidad de giro del motor, en el medio apagado. El tema de esa referencia y a partir de la misma obtener el PWM con el duty necesario esta andando, resta ver si estan bien las constantes en el codigo para ver si se corresponden a los tiempos que quiero.
El problema lo tengo en la interrupcion int_rb, la cual voy a usarla para medir las RPM del motor. En si lo que tengo que hacer es medir la frecuencia del tren de pulsos que obtengo del optoacoplado. Dejo el codigo para ver si me pueden dar una mano, ya que no esta ingresando a la #int_rb (pude comprobarlo con el debugger proteus VSM)-
#include <16F877A.h>
#device adc=10
#use delay (clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#include<lcd_flex.h>
void main(void)
{
float duty=0,dutylcd=0, rpm=1200, vref=5,vref2=0,adc=0;
//set_tris_a(0x00); Ver si hace falta poner todo como salida.
set_tris_b(0xFF);
set_tris_c(0x00);
set_tris_d(0x00);
/*output_a(0);
output_b(0); Ver si hace falta poner todo en cero.
output_c(0);
output_d(0);*/
lcd_init();
delay_ms(10);
output_b(0);
output_c(0);
//Configuracion del ADC:
setup_adc_ports(NO_ANALOGS);
setup_adc_ports(RA0_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
enable_interrupts(int_rb);
enable_interrupts(global);
vref=(float) read_adc()*0.0048828125; // (5v/1024)=0,0048828125=4,88mV
vref2=vref;
lcd_gotoxy(1,1);
printf(lcd_putc,"V:+%.2fv",vref);
//Configuracion del PWM:
setup_ccp1(CCP_PWM);
setup_timer_2(T2_DIV_BY_1,65.66667,1);
dutylcd=20*vref; //(100%/5V)*vref = 20*vref
duty=vref*204.6; //(1023/100%)*dutylcd = 10.23*dutylcd = 10.23*20*vref=204.6*vref
set_pwm1_duty(duty);
lcd_gotoxy(10,1);
printf(lcd_putc,"D:%.1f",dutylcd);
lcd_putc('%');
lcd_gotoxy(3,2);
printf(lcd_putc, "RPM: %.1f",rpm);
while(1)
{
if(vref2!=vref)
{
vref2=vref;
lcd_gotoxy(1,1);
printf(lcd_putc,"V:+%.2fv",vref);
duty=20*vref; //(100%/5V)*vref
lcd_gotoxy(10,1);
dutylcd=20*vref; //(100%/5V)*vref = 20*vref
duty=vref*204.6; //(1023/100%)*dutylcd = 10.23*dutylcd = 10.23*20*vref=204.6*vref
set_pwm1_duty(duty);
printf(lcd_putc,"D:%.1f",dutylcd);
lcd_putc('%');
lcd_gotoxy(3,2);
printf(lcd_putc, "RPM: %.1f",rpm);
}
vref=(float) read_adc()*0.0048828125; // (5v/1024)=0,0048828125=4,88mV
delay_ms(1);
}
}
#int_rb
void frec(void)
{
if(input(pin_B4)==1)
output_high(pin_C0);
if(input(pin_B5)==1)
output_low(pin_C0);
}
Actualizacion 1: Recien llego del lab, en PWM esta a la frecuencia que quiero (15kHz), pero no el ciclo de trabajo. Lo que yo quiero es sea lineal la variacion con una tension de referencia (para la que uso el ADC), pero me parece que estoy asignando mal la funcion set_pwm1_duty(duty); El valor de la variable duty tiene que ser el valor del duty propiamente? es decir, de 0 a 100 o tengo que hacer una regla de 3 simples, con 100% de duty son 1023 por los 10 bits que utiliza el pwm?? Gracias!!