Autor Tema: Diagrama de flujo CCS  (Leído 12411 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Diagrama de flujo CCS
« Respuesta #30 en: 26 de Mayo de 2008, 13:23:39 »
Bueno mue si lo que quieres es probar la conversión, puedes dejarlo tal como está, a 8 bits, pero insertando estas líneas:

Código: C
  1. set_adc_channel(0);
  2.   delay_us(20);
  3.   lectura_vk=read_adc();
  4.   output_X(lectura);
  5. //  Vk = (float)read_adc();            // Vk e Ik son el valor actual

Deberías declarar lectura_vk como int, y podrías declararte también una lectura_ik y hacer el código similar para ik.
Y en la instrucción output_x en lugar de la x coloca el puerto al que vas a mandar el dato (por ejemplo si lo vas a mandar al puerto C: output_C)
Lo que te recomiendo es que montes en proteus la cuestión y simules la entrada analógica con un potenciómetro (tensión variable) y 8 leds con cátodo a tierra en el puerto al que vas a mandar el dato, asi puedes ver fácilmente si está haciendo la conversión correctamente.

Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Diagrama de flujo CCS
« Respuesta #31 en: 26 de Mayo de 2008, 14:02:45 »
Hola mue, hay algunas cositas que no esta bien en tu programa, ya firepic hizo hincapié en una:

Código: [Seleccionar]
Vk = (float)read_adc();
y tambien

Código: [Seleccionar]
Ik = (float)read_adc();
La función read_adc() devuelve un valor entero de acuerdo al preprocesador #device adc=x, que en tu caso sera 1 byte.  Luego estas haciendo un casting a un numero con coma flotante para luego guardarla en una variable del tipo entero de 1 byte de longitud (Mira en las declaraciones, tanto Vk como IK son del tipo int). En limpio, estas convirtiendo una variable entera de 1 byte en un numero con coma flotante para luego volver a convertirlo en un numero entero de 1 byte, lo cual es un desperdicio de tiempo de procesador. Para que el codigo sea correcto coloca en reemplazo de las instrucciones anteriores lo siguiente:

Código: [Seleccionar]
Vk = read_adc();
y tambien

Código: [Seleccionar]
Ik = read_adc();
Con respecto a la instruccion setup_adc, estas configurando el reloj del ADC en forma incorrecta, una frecuencia de la mitad del reloj principal solo es valida para frecuencias de cristal menores o iguales a 1.25 MHz. Para tu caso, 20 MHz y un PIC 16F877 recomiendo que reemplazes la instrucción setup_adc por esta otra:

Código: [Seleccionar]
setup_adc(ADC_CLOCK_DIV_32);
Para informarte mas sobre la configuracion del tiempo de conversion del ADC lee este post, aqui se ha debatido sobre ello:

Seguimiento a los voltajes de I/O de un trafo

Con respecto a la instrucción delay_us(50) esta no es necesaria pues una vez que read_adc() termina y devuelve el valor convertido pues cambiar el canal de entrada sin esperar. Es más, transcurridos 100 ns luego de comenzar read_adc() el capacitor del sample & hold se desconecta y ya se puede cambiar el canal de entrada, pero bueno, eso es orejón de otro tarro y no voy a entrar en detalles.

Veo que declaraste algunas variables globales como estaticas, nunca he tenido la oportunidad de probar que efectos tiene este tipo de declaracion en la memoria, pero por definicion, una variable global es estatica por si misma y declararla como static o no   es indiferente, salvo que tengas varias unidades de compilacion en tu proyecto.

Por ultimo supongo que falta algo de código en el programa, pues faltan los corchetes que cierran el main y el bucle while, sin eso no iras a ninguna parte, no podras ni compilar tu programa. Perdona por haberte dejado tanto trabajo :mrgreen:, esperamos con ansias tus logros.

Un saludo desde Argentina.


"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado mue

  • PIC10
  • *
  • Mensajes: 21
Re: Diagrama de flujo CCS
« Respuesta #32 en: 26 de Mayo de 2008, 14:18:50 »
gracias por vuestra ayuda de momento mi progranma es este, para quien lo quiera leer y opinar:

Código: C#
  1. #include <16f877.h>         //pic a utilizar
  2. #device adc=8      
  3. #fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT //ordenes. para el programador
  4. #use delay (clock=20000000)
  5.  
  6. const int dx=10;
  7. static int Vk,Ik,dV,dI,V,I;
  8. int D;
  9.  
  10. //setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
  11.  
  12. void main()
  13. {
  14.  
  15. setup_ccp1(CCP_PWM);                    
  16. setup_timer_2(T2_DIV_BY_4,249,1);
  17.  
  18. // COMIENZO
  19. // Lecturas
  20.  
  21. setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
  22. //setup_adc(ADC_CLOCK_DIV_2); //antigua setup_adc(ADC_CLOCK_DIV_32);
  23.    set_tris_a(0xff);
  24.    set_tris_b(0);
  25.  
  26.    SETUP_ADC(ADC_CLOCK_INTERNAL);      // configuras esto para que el a/d funcione con un reloj interno del micro
  27.    //SETUP_ADC_PORTS(AN0);                       // aca determianr que el puerto RA0 será analógico
  28.    //SET_ADC_CHANNEL(0);                          
  29.  
  30.    
  31.  
  32.  
  33.  //set_tris_a(0xff);
  34.  
  35. while(TRUE)
  36.    {
  37.    set_adc_channel(0);
  38.    delay_us(20);
  39.    Vk = (int)read_adc();            // Vk e Ik son el valor actual
  40.    
  41.    delay_us(50);  
  42.    
  43.    output_b(Vk);               // lee el canal analogico seleccionado anteriormente, y lo uestra el en puerto b
  44.    delay_us(20);
  45.    
  46.    set_adc_channel(1);
  47.    delay_us(20);
  48.    Ik = (int)read_adc();
  49.  
  50.    delay_us(50);
  51.  
  52.    dV = Vk - V;          // V e I son el valor anterior  
  53.    dI = Ik - I;
  54.  
  55.    if(dV == 0)
  56.       {
  57.      
  58.       if(dI != 0)
  59.          {
  60.          
  61.          if(dI > 0)
  62.             {
  63.            
  64.             D = D + dx;
  65.            
  66.             }
  67.          else
  68.             {
  69.            
  70.             D = D - dx;
  71.            
  72.             }
  73.          
  74.          }
  75.      
  76.    else
  77.       {
  78.  
  79.       if(dI/dV != -(Ik/Vk))
  80.          {
  81.  
  82.          if(dI/dV > -(Ik/Vk))
  83.             {
  84.          
  85.             D = D + dx;
  86.          
  87.             }
  88.          else  
  89.             {
  90.  
  91.             D = D - dx;
  92.  
  93.             }
  94.  
  95.          }
  96.      
  97.       }
  98.    V = Vk;
  99.    I = Ik;
  100.  
  101.    set_pwm1_duty(D);
  102.    delay_ms(1);
  103.    }
  104.  
  105.    }
  106. }

Saludos muy cordiales desde Barcelona.

Desconectado mue

  • PIC10
  • *
  • Mensajes: 21
Re: Diagrama de flujo CCS
« Respuesta #33 en: 26 de Mayo de 2008, 14:36:36 »
otra duda como puedo saber respecto el algoritmo anterior cuanto aumento "dx"??
dx es un valor constante que hace variar el duty "D",

como puedo saber la resolucion, creo que mi duty va de 0 a 1000 siendo el 1000 el 100%.

gracias

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Diagrama de flujo CCS
« Respuesta #34 en: 26 de Mayo de 2008, 15:35:26 »
Pues no has corregido las observaciones que te ha hecho el Dr. Gonzalo.
A ver pues, a trabajar!  :D
Bueno con respecto a lo de que el duty D va de 0 a 1000... entonces tienes que cambiar la definición de la variable, en vez de colocarla como la tienes (int), debes colocarla como int16.
En cuanto a esto:
otra duda como puedo saber respecto el algoritmo anterior cuanto aumento "dx"??
dx es un valor constante que hace variar el duty "D",
Ahí si me dejaste frito viejo... porque si dices que es un valor constante, cómo es que va a aumentar?  :shock:
Bueno tal vez no capté tu pregunta, trata de explicarte mejor a ver....
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado mue

  • PIC10
  • *
  • Mensajes: 21
Re: Diagrama de flujo CCS
« Respuesta #35 en: 26 de Mayo de 2008, 15:46:02 »
Que cantidad aumento cada vez el duty (en este caso D), donde D viene de D = D - dx; o D = D + dx;

por que eso del int16???

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Diagrama de flujo CCS
« Respuesta #36 en: 26 de Mayo de 2008, 15:53:59 »
Bueno si dices que el valor del duty varía entre 0 y 1000, entonces la variable que tienes definida D se queda corta... porque está definida como entero de ocho bits (int) y ya sabrás que 8 bits permite valores solo de 0-255.... entonces si tienes un int16 permite de 0-65535.... claro que tu vas a usar no más 0-1000.
En cuanto a esto:
Que cantidad aumento cada vez el duty (en este caso D), donde D viene de D = D - dx; o D = D + dx;
Todavía no te capto bien. A ver, tú quieres saber cuánto ha variado D por cada medición? Entonces lo que debes hacer es guardar D en una variable, digamos D_anterior... y luego otra variable (tendría que ser float, por si el cambio es negativo, o sea ahora D es menor) que podrías llamar variacion o delta... seria:
Código: [Seleccionar]
delta=D-D_anterior;
D_anterior=D;
Y vuelves a cargar D_anterior con el valor actual para que la próxima lectura tenga el valor anterior...
Espero haberme explicado.
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Diagrama de flujo CCS
« Respuesta #37 en: 26 de Mayo de 2008, 21:07:40 »
Hola mue, el duty del PWM se define por un valor de 10 bits, es decir que puede tomar valores entre 0 a 1024. Tal como lo ha dicho firepic, D debe ser del tipo long o int16 o de 2 bytes de longitud para poder contener todo el espectro de duty que necesitas. El PWM solo toma como duty valores enteros, por lo tanto dx no puede ser menor que 1 y debe ser entero.  Sin embargo, la variación en el ciclo de trabajo real de la onda de salida con respecto al valor que tu seteas varia de acuerdo a la resolución del PWM, la cual esta en función de la frecuencia del mismo.

No me voy a explayar mas en este tema, creo que primero debes solucionar tus otros inconvenientes que ya hemos expuesto en post anteriores. Tal como ha dicho firepic, A ver pues, a trabajar!   :-/ :-/

Saludos desde Argentina.


"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado mue

  • PIC10
  • *
  • Mensajes: 21
Re: Diagrama de flujo CCS
« Respuesta #38 en: 02 de Junio de 2008, 07:01:50 »
Tengo la mejor pregunta de este post y la mas ambigua:

Cuando controlo mi proceso, basandome en el algoritmo, voy mirando la tension y la intensidad mediante el CAD del pic y segun lo que de, aumento o disminuyo el duty cycle para modificar el trabajo del convertidor. La pregunta es esta: No deja de aumentar el duty!!! o disminuir!!!! no se queda en ningun punto , no llega ni a oscilar en un intervalo!

Alguna idea??? (Me quedan 3 dias para entregar el proyecto, se nota mi estres??jejeje)

un saludo cordial,

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Diagrama de flujo CCS
« Respuesta #39 en: 02 de Junio de 2008, 12:14:52 »
Saludos mue! Tal vez puede ser porque la tensión y corriente que estás midiendo están cambiando muy rápido... prueba hacer una pausa entre una medición y la otra... bueno es sólo una hipótesis... pero sería bueno que colocaras alguna simulación en proteus para ver qué es lo que está haciendo tu circuito y cuál podría ser la falla.
Andale pues, que si lo puedes lograr!  :P
Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web