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

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

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #15 en: 14 de Octubre de 2010, 15:08:00 »
Código: [Seleccionar]
#include <16F877A.h>
#device adc=10
#use delay (clock=4000000)
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#include<lcd_flex.h>

void control(float dutylcd);

#define q1=PIN_C4
#define q2=PIN_C5
#define q3=PIN_C6
#define q4=PIN_C7

void main(void)
{
int duty=0; //VER SI duty SE LO DECLARA COMO FLOAT!
float 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,66,1);
//Resolucion = log(Fosc/Fpwm)/log(2)=8,066 --> 2^(Resolución)=268
//DUTY: 0% ->0, 100% -> 268
dutylcd=20*vref; //(100%/5V)*vref = 20*vref
duty=2.68*dutylcd; //(268/100%)*dutylcd%=2.68*dutylcd
set_pwm1_duty(duty);
delay_ms(1);

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=2.68*dutylcd; //(268/100%)*dutylcd%=2.68*dutylcd
set_pwm1_duty(duty);
delay_ms(1);
printf(lcd_putc,"D:%.1f",dutylcd);
lcd_putc('%');

lcd_gotoxy(3,2);
printf(lcd_putc, "RPM: %.1f",rpm);

control(dutylcd);
}

vref=(float) read_adc()*0.0048828125; // (5v/1024)=0,0048828125=4,88mV
delay_ms(1);

/*setup_adc_ports(RA1_ANALOG);
adc=read_adc();*/
}
}

#int_rb
void frec(void)
{
if(input(pin_B4)==1)
output_high(pin_C0);
if(input(pin_B5)==1)
output_low(pin_C0);
}


void control(float dutylcd)
{
if(dutylcd<48)
{
q1=1;
q2=0;
q3=1;
q4=0;
}

if(dutylcd>=48 && dutylcd<=52)
{
q1=0;
q2=0;
q3=1;
q4=1;
}

if(dutylcd>52)
{
q1=0;
q2=1;
q3=0;
q4=1;
}
}

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #16 en: 14 de Octubre de 2010, 15:20:25 »
 :shock:

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


Sino, no funciona  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #17 en: 14 de Octubre de 2010, 15:27:40 »
Ahi funciono, pero si en el 16f877.h tiene #define PIN_C0  56 no deberia andar??

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #18 en: 14 de Octubre de 2010, 15:33:05 »
Ahi funciono, pero si en el 16f877.h tiene #define PIN_C0  56 no deberia andar??

No. Esa es una definición propia del compilador. "Él entiende como aplicarlo"  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #19 en: 14 de Octubre de 2010, 22:23:44 »
Vuelvo del lab. El 100% del duty o 99% mejor dicho es con el valor de duty=63 no 268 como da el calculo...

Otra duda,,,,,necesito estar sensando constantemente otra tension, para lo ke pensaba usar el ADC del pin A2, tengo ke ir "apagando" el ADC del pin A1 y "prender" el del A2 y luego al reves??

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #20 en: 14 de Octubre de 2010, 23:28:53 »
Otra duda,,,,,necesito estar sensando constantemente otra tension, para lo ke pensaba usar el ADC del pin A2, tengo ke ir "apagando" el ADC del pin A1 y "prender" el del A2 y luego al reves??
el ADC es uno solo, lo que multiplexas es el canal.
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #21 en: 15 de Octubre de 2010, 00:20:03 »
Clarisimo, cambie al canal 0 y 1 segun necesitaba y anda a la prefeccion. Gracias!

Alguna idea por el tema del duty? Estoy haciendo la regla de tres simples pero tomando el 63 como duty al 100%, pero es un "parche" descubierto con el osciloscopio....no es la idea,,,me gustaria que "quede bien" :)

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #22 en: 15 de Octubre de 2010, 03:34:20 »
buenas, intenta no hacer operaciones en el momento que cojes el readADC.
Y despues de leer el ADC siempre es mejor esperarse un poco.

Código: C
  1. vref=(float) read_adc()*0.0048828125 begin_of_the_skype_highlighting              0048828125      end_of_the_skype_highlighting;        // (5v/1024)=0,0048828125 begin_of_the_skype_highlighting              0048828125      end_of_the_skype_highlighting=4,88mV
  2. vref2=vref;
  3. lcd_gotoxy(1,1);
  4. printf(lcd_putc,"V:+%.2fv",vref);
Yo esto no lo haria, primero lees el ADC y luego haces lo que quieras, yo lo hago de la siguiente forma y me funciona perfectamente tomando el máximo valor como 1023 y el minimo como 0.

Aqui te dejo el trozo de codigo que yo utilizo, si quieres pruebalo en la protoboard porque funciona perfectamente.

Código: C
  1. medicio=read_adc();   //guardo el valor de adc en medicio
  2.    delay_us(20);
  3.    proporcio=((medicio+29)*0.80986);  //hago las peraciones que quiera y mas...
  4.    Vprop=(proporcio*0.01953);
  5.    lcd_gotoxy(1,1);
  6.    printf(lcd_putc,"A=%0Lu",medicio);   //muestro por el lcd todos los valores empezando por lo que me lee por adc
  7.    lcd_gotoxy(9,1);
  8.    printf(lcd_putc,"P = %u",proporcio);  //resultado de la primera operacion
  9.    lcd_gotoxy(1,2);
  10.    printf(lcd_putc,"V = %f",Vprop);       //resultado de la segunda operacion
  11.    set_pwm1_duty(proporcio);             //hago el duty

espero que te sirva de ayuda  ;-)

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #23 en: 15 de Octubre de 2010, 09:10:33 »
Voy a seguir tu consejo. Alguna idea del tema del duty??

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #24 en: 16 de Octubre de 2010, 08:21:58 »
que quieres decir con lo de alguna idea con lo del duty? no entiendo que quieres decir con lo de 268 como da el calculo, lo máximo a lo que te puede llegar el duty o el ADC es 256 porque lo defines como ADC = 8 bits

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #25 en: 16 de Octubre de 2010, 11:41:51 »
El adc esta en 10 bits, el 268 es por la resolucion del PWM (8.066), lo que da los 268, pero en el osciloscopio comprobe que el duty al 100% se da con 63 no con 268. Sera porque uso la variable para modificar el duty como int???

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #26 en: 16 de Octubre de 2010, 18:07:00 »
Si tienes que definir esa variable como int16, en eso no me habia fijado ;-)

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #27 en: 17 de Octubre de 2010, 19:49:58 »
Cambie a int16, mañana voy a probar en el osciloscopio, seguro ahi anda ;).

Pase a la parte de la interrupcion....quiero que detecto flancos de subida, lei que es por RB0. Declare en el main:

Código: [Seleccionar]
ext_int_edge(L_TO_H);
enable_interrupts(int_ext);
enable_interrupts(global);

y la funcion de interrupcion es:

Código: [Seleccionar]
#int_ext
void ext_isr(void)
{
output_high(PIN_C0);
delay_ms(200);
output_low(PIN_C0);
}

Obviamente, RB0 esta declarado como entrada y C0 como salida....pero no esta entrando en la interrucpio y no logro darme cuenta que es lo que esta faltando en el codigo....segun los ejemplos que vi no hay que poner nada mas que la declaracion de la interrupcion, que flanco quiero y nada mas...

Desconectado f-traxx

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #28 en: 18 de Octubre de 2010, 05:55:41 »
En teoria es asi como dices tu... digo en teoria porque yo tambien lo necesitava hacer para contar un tren de pulsos pero no me funcionaba ni a la de 3... por esa razon y como el programa no tenia que hacer nada mas que esperar los pulsos lo decidi hacer de forma "bruta" que seria esperando el flanco de subida y contando el tiempo hasta que bajara otra vez, si te sirve te puedo enviar el trozo de codigo que hace esa función.

Desconectado aripod

  • PIC16
  • ***
  • Mensajes: 170
Re: Dudas Varias (PWM, Int_RB)
« Respuesta #29 en: 18 de Octubre de 2010, 10:37:26 »
Será problema del CCS que no configura bien los registros? Gracias por ofrecerme tu prog, pero desafortunadamente si tengo que ir haciendo otras cosas no solo esperar el tren de pulsos....espero que alguien haya tenido suerte con la int_ext y se de una vuelta por el thread :)