Autor Tema: Dudas Varias (PWM, Int_RB)  (Leído 6779 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Dudas Varias (PWM, Int_RB)
« en: 13 de Octubre de 2010, 15:24:42 »
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)-

Código: [Seleccionar]
#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!!
« Última modificación: 13 de Octubre de 2010, 21:18:49 por aripod »

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: No entra en #int_rb
« Respuesta #1 en: 13 de Octubre de 2010, 19:07:37 »
Hola aripod, recuerdo haber leído aqui en el foro sobre este problema, creo que se soluciona leyendo el portb dentro de la interrupcion.

Usa el buscador, este problema ya ha sido tratado.

Saludos
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #2 en: 14 de Octubre de 2010, 03:53:49 »
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!!

Hola amigo, el valor de la variable duty, tiene que ser un valor entre 0 y 1023 si configuras el ADC = 10 bits, si lo configuras a 8 bits será entre 0 y 255, tienes que hacer una simple regla de 3.

Te subo un archivo totalmente comentado que espero que te sirva de ayuda.


Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #3 en: 14 de Octubre de 2010, 09:25:00 »
El archivo adjunto esta solo la simulacion...
Entonces esta bien si quiero que el duty sea proporcional a la vref segunn la tension del potencionmetro (de 0 a 5v), con hacer duty=read_adc() tendria una linealidad entre el potenciometro y el duty, verdad? Si esto llega a estar bien, estoy haciendo otra cosa mal porque varia el duty pero en muy poca variacion de vref digamos.
« Última modificación: 14 de Octubre de 2010, 09:31:06 por aripod »

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #4 en: 14 de Octubre de 2010, 10:51:52 »
Lo siento antes me he equivocado al subir el archivo, aqui lo tienes, si en teoria seria eso, si lees el valor y lo pones directamente en duty te iria bien, aqui te lo vuelvo a subir...

Lo siento  :oops::?

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #5 en: 14 de Octubre de 2010, 12:13:24 »
Estoy entonces convirtiendo y el valor ese directamente lo envio al duty:

Código: [Seleccionar]
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,66,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
delay_ms(10);
set_pwm1_duty(511); //Para que arranque en 50%.

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=(int) vref*204.6; //(1023/100%)*dutylcd = 10.23*dutylcd = 10.23*20*vref=204.6*vref
duty=read_adc();
delay_ms(10);
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);
}
}

Tendra algo que ver que se esta modificando todo el tiempo el duty y no le da tiempo suficiente?

Ahora que estoy probando es ese el funcionamiento, pero una vez que maneje bien el duty digamos, tengo que poner el duty que muestro en el lcd (dutylcd) debe ser el de la señal, entonces tendria que hacer (1024/100)*dutylcd, verdad? Eso tiene que ser int o puede ser float o no importa el tipo?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #6 en: 14 de Octubre de 2010, 12:31:43 »
Estas trabajando a 4MHz, Frecuencia del PWM 14925.37Hz con PR2=66, resolución 8.066, entonces 0% ->0, 100% -> 268.



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #7 en: 14 de Octubre de 2010, 12:34:19 »
Estas trabajando a 4MHz, Frecuencia del PWM 14925.37Hz con PR2=66, resolución 8.066, entonces 0% ->0, 100% -> 268.



Saludos!

Me podrias explicar como hiciste ese calculo??

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #8 en: 14 de Octubre de 2010, 12:50:45 »
En el datasheet están la formulas para el cálculo de la frecuencia y de la resolución. Solo hay que reemplazar valores


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #9 en: 14 de Octubre de 2010, 13:00:53 »
Calculo bien la resolucion, pero como lo relacionas con los bits?

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #10 en: 14 de Octubre de 2010, 13:14:12 »
Calculo bien la resolucion, pero como lo relacionas con los bits?

2^(Resolución)   :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #11 en: 14 de Octubre de 2010, 13:17:00 »
Hagamos de cuenta ke no pregunte eso y ke kede entre nosotros!!jaja
gracias!!

Otra duda....no quiero estar haciendo output_high(PIN_C1) por ejemplo, sino en vez hacer q=1 y que q sea el pin C1, me explico? Igual para output_low(PIN_C1)

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #12 en: 14 de Octubre de 2010, 13:20:03 »
Puedes hacer:

#bit q=0x07.1  // Creo que el 0x07 es el puerto C  :mrgreen:

El tris debe estar configurado correctamente  ;-)


saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #13 en: 14 de Octubre de 2010, 14:21:41 »
Declare globalmente para poder usarlo en el main y en las distintas funciones y me da un error cuando compilo: A numeric expression must appear here. Aclaro, estoy haciendo q=1 o q=0
« Última modificación: 14 de Octubre de 2010, 14:41:34 por aripod »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #14 en: 14 de Octubre de 2010, 15:06:40 »
Declare globalmente para poder usarlo en el main y en las distintas funciones y me da un error cuando compilo: A numeric expression must appear here. Aclaro, estoy haciendo q=1 o q=0

Lo hiciste correctamente? En la ayuda de CCS hay más ejemplos.

Saludos!
No contesto mensajes privados, las consultas en el foro