Autor Tema: comparador, conversor ad...los dos ?  (Leído 5785 veces)

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

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
comparador, conversor ad...los dos ?
« en: 25 de Marzo de 2010, 14:06:05 »
hola, tengo un pequeño lio mental. Vereis, quiero controlar la salida PWM, basandome en un ejemplo que tengo. Quiero modificar ese ejemplo, pero no se cómo. os pongo el esquema :


y el programa :
Código: C
  1. #include <18f4520.h>
  2. #fuses XT,NOWDT
  3. #use delay(clock=4000000)
  4. #byte CMCON=0xFB4
  5. #byte TRISA=0xF92
  6.  
  7.  
  8. void main() {
  9.  
  10. int16  dutty;
  11.  
  12. TRISA= 0B11101011;
  13. CMCON= 0b00000100;
  14.  
  15.   setup_timer_2(T2_DIV_BY_4,62,1);
  16.   setup_ccp1(CCP_PWM);
  17.   set_pwm1_duty(714);
  18.  
  19. while(1) {
  20.   IF(C1OUT) dutty=714;
  21.   else dutty=0;
  22.   set_pwm1_duty(dutty);  }
  23. }

1. Con CMCON= 0b00000100 lo que hace es poner el tipo comparador 100, q pone 2 comparadores con la misma referencia. A parte de configurar el TRIS, no hace nada mas. Entonces, segun datasg¡heet esos pines de entrada se leen como analógicos?? Directamente ??

2. Lo que yo esperaba ver, es una conversion a/d, es decir, medir la tension proporcionada en ese punto, digitalizarla, y compararla con una referencia distinta a la que hay ( la de la fuente de 4.5V).

3. Yo pretendo hacer pasar una tension diferente, de alrededor 0.02 voltios. Detectar dicha tension, y cerrar el modulo PWM en cuanto ocurriese eso. Entonces pues la duda es: a partir de que tension (minima) detecta el PIC que le entra algo ? Valdria poner un AO pues a esta modificacion mia ?
Y hace falta realmente hacer la conversion a/d ??

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: comparador, conversor ad...los dos ?
« Respuesta #1 en: 25 de Marzo de 2010, 17:51:24 »
Porque no pruebas a establecer como entrada de uno de los comparadores , la señal que quieres controlar, y en la otra generas una igual al limite que quieras comparar  (con el generador interno de referencia sección 21.0 datasheet) , y aprovechas la interrupción de igualdad para decidir si paras o no el PWM, de esta forma ,configurando los dos comparadores, podrías detectar si es superior o inferior la señal de entrada, y así activar o desactivar el PWM.

Perdona si te parece una tonteria, pero creo que funcionaria.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #2 en: 26 de Marzo de 2010, 06:59:47 »
que tal bmfranky
Una  de las señales de entrada, es en efecto la que quiero controlar ( luego jugaria a modificar esa señal de entrada a mi antojo apara ver loq ue pasa).
La señal de referencia ( sin ser interna) pruebo a ponerla baja, y veo que no hay definicion minima, no reconoce el pic 0.02 V?

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #3 en: 26 de Marzo de 2010, 07:32:16 »
uhm...puede que tenga problemas por el proteus..veo que un usuario dice no poder usar el modulo comparador correctamente pra un pic18, con su version 7.6
Mi version es ...espera que lo mire...7.2 entonces deberia tener problemas por ello.
Si alguien no los ha tenido, podria decir que hizo para solucionar eoss problemas?

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #4 en: 26 de Marzo de 2010, 10:05:36 »


Bueno, al margen , o a la par, del fallido comparador, he decidido usar el A/D. Mido la tension en canal0 ( A0), y no obtengo respuesta  alguna..quiero que cuando el dato sea mayor, o menor, o igual ( he probado esas combinaciones para que por que si, empieze a digitalizar) encienda un pin ( el led asociado al pin), pero no funciona...alguien sabe que sucede ?!!!

Código: C
  1. #include <18f4520.h>
  2. #fuses XT,NOWDT
  3. #use delay(clock=4000000)
  4. #byte CMCON=0xFB4
  5. #byte TRISA=0xF92
  6. #byte TRISB=0xF93
  7.  
  8. #USE STANDARD_IO (A)
  9. #USE STANDARD_IO (B)
  10. #USE STANDARD_IO (C)
  11. #USE STANDARD_IO (D)
  12. #USE STANDARD_IO (E)
  13.  
  14. #byte  porta = 0xf80
  15. #byte   portb = 0xf81
  16. #byte   portc = 0xf82
  17. #byte   portd = 0xf83
  18. #byte   porte = 0xf84
  19.  
  20. #byte   t1con = 0xfcd
  21. #byte   latd = 0xf8c
  22.  
  23. #byte   adcon0 = 0xfc2
  24. #byte   adcon1 = 0xfc1
  25. #byte   adcon2 = 0xfc0
  26.  
  27. #byte   adresl = 0xfc3
  28. #byte   adresh = 0xfc4
  29.  
  30.  
  31. void main() {
  32.  
  33. int16  dutty;
  34. float value;
  35.  
  36. TRISA= 0B11101011;
  37. CMCON= 0b00000100;
  38. TRISB= 0B11001011;
  39.  
  40.  
  41.  
  42.  
  43.  
  44.   setup_timer_2(T2_DIV_BY_4,62,1);
  45.   setup_ccp1(CCP_PWM);
  46.   set_pwm1_duty(714);
  47.  
  48. while(1) {
  49.   IF(C1OUT) dutty=714;
  50.   else dutty=0;
  51.   set_pwm1_duty(dutty);  }
  52.   setup_adc (adc_clock_internal);     // selecciona el moodo para la configuracion del modulo conversor A/D
  53.                                     //correspondientes a los bits7:6 del ADCON0
  54.   setup_adc_ports (all_analog);       //DEFINICION DE LAS ENTRADAS ANALOGICAS CORRESPONDIENTE A LOS BITS 3-0 DEL ADCON1
  55.   set_adc_channel (0);                // Elige canal analogico a medir
  56.   delay_us (20);                      //espera 20 microseg
  57.   value=read_adc ();              // Hace conversión A/D
  58.   if (value>1){
  59.      output_high(pin_C5);
  60.      delay_ms(10000);
  61.      }
  62. }

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: comparador, conversor ad...los dos ?
« Respuesta #5 en: 26 de Marzo de 2010, 10:25:10 »
Quiza te falte esto.
Código: [Seleccionar]
#device ADC=10 ///captura 10 bits
o
#device ADC=8/// captura 8 bits
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #6 en: 26 de Marzo de 2010, 12:53:20 »
cierrto. me he dejado eso, pero sige igual..no se entera de nada...la verdad es que no qiero usar los ejemplos que tengo por ahi como una cotorra, porque entonces nunca sabr que esta pasando ...

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: comparador, conversor ad...los dos ?
« Respuesta #7 en: 26 de Marzo de 2010, 14:09:06 »
Prueba con esto y me comentas, yo he simulado con potenciometro en RA0 y cuando pasa de 0 voltios prende el led y cuando vuelve a cero lo apaga.
Código: [Seleccionar]
 
      #include <18f4520.h>
 
      #fuses XT,NOWDT
 
      #use delay(clock=4000000)


#byte CMCON=0xFB4

#byte TRISA=0xF92

#byte TRISB=0xF93

 

#USE STANDARD_IO (A)

#USE STANDARD_IO (B)

#USE STANDARD_IO (C)

#USE STANDARD_IO (D)

#USE STANDARD_IO (E)
       

 
   

      void main() {
       
      int16  dutty;
       float value;
       
 
      TRISA= 0B11101011;

      CMCON= 0b00000100;
 
      TRISB= 0B11001011;
       
       
       
       
       
        setup_timer_2(T2_DIV_BY_4,62,1);
        setup_ccp1(CCP_PWM);
 
       set_pwm1_duty(714);
 
       set_pwm1_duty(dutty);
        setup_adc (adc_clock_internal);     // selecciona el moodo para la configuracion del modulo conversor A/D
                                          //correspondientes a los bits7:6 del ADCON0
        setup_adc_ports (AN0);       //DEFINICION DE LAS ENTRADAS ANALOGICAS CORRESPONDIENTE A LOS BITS 3-0 DEL ADCON1
        set_adc_channel (0);                // Elige canal analogico a medir
/// si redefines las entradas cada vez nunca leeras nada,
 
       while(1) {//1 el while tiene que abarcarlo todo o no chequea las entradas analoguicas.
        IF(C1OUT) dutty=714;
        else dutty=0;
       
         delay_us (20);                      //espera 20 microseg
        value=read_adc ();              // Hace conversión A/D
       if (value>1){//2 si mayor a 1 enciende
           output_high(pin_C5);
         
           delay_ms(10000);
         
         }//2
        else{//3 de lo contrario apaga.
        output_low(pin_C5);
        delay_ms(10000);
        }//3
       }//1

      }
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #8 en: 29 de Marzo de 2010, 07:20:44 »
bueno va bien, pero lo que no entiendo es la forma de leer el analogico. Por ejemplo, si le pongo ( directamente, desde una fuente ) una tension de 1,5 voltios, y quiero que a mas tension se pare el PWM, por que solo lo hace si le pongo la tension menor  a 0.007?

Yo se que VDD*TENSION QUE QUIERO/1024 ( definicion a 10 bits) da ese numero que yo digo, 0.007..pero leche...el input es precisamente la tension que quiero, o sea 1,5 voltios... Que valor saca o lee el AD por la entrada de tension que el pongas en A0?? poniendo que precisamos de 10 bits en el AD.

Porque cada calculo que doy no me hace caso..no es logico que si pongo 1voltio en la entrada ( que 1<1,5) se me pare ya el PWM, he de bajar a esos 0.007...

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: comparador, conversor ad...los dos ?
« Respuesta #9 en: 29 de Marzo de 2010, 08:34:10 »
Si tienes configurado el ADC a 10Bits y tu tensión de referencia es 4.5V. La salida del ADC va a ser 1024 cuando la entrada sea 4.5V, ahora para los valores intermedios, es una simple regla de 3.

ValorADC=Vin*1024/4.5V.
por ejemplo si le metes 1.5v a la entrada
ValorADC=1.5V*1024/4.5V=341


si le colocas 0.007V a la entrada
ValorADC=0.007V*1024/4.5V=1.59
pero como el adc solo da valores enteros, te va a dar un 1 o un 2, esta oscilación es debida al error de cuantización.
Es decir que el valor que te da el ADC, es una valor que escala el rango entre Vref+ y 0V, a la longitud de la palabra que es de 10bits.

ValorADC=Vin*1024/Vref+


En este caso Vref- no se considera porque lo tienes a 0V

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: comparador, conversor ad...los dos ?
« Respuesta #10 en: 29 de Marzo de 2010, 08:37:18 »
El problema lo tienes al asignar el valor del adc a un float, asignalo a un int 6 y lo podras ver en la simulacion, porque no se el motivo , el isis no lo muestra, el 0007 es la direccion en memoria; prueva esto y veras.
Código: [Seleccionar]
  #include <18f4520.h>
 
      #fuses XT,NOWDT
 
      #use delay(clock=4000000)


#byte CMCON=0xFB4

#byte TRISA=0xF92

#byte TRISB=0xF93

 

#USE STANDARD_IO (A)

#USE STANDARD_IO (B)

#USE STANDARD_IO (C)

#USE STANDARD_IO (D)

#USE STANDARD_IO (E)
      

 
    

      void main() {
      
      int16  dutty;
      INT32 TMP=0;
       float value;
        
  
      TRISA= 0B11101011;

      CMCON= 0b00000100;
 
      TRISB= 0B11001011;
        
      
        
        
        
        setup_timer_2(T2_DIV_BY_4,62,1);
        setup_ccp1(CCP_PWM);
 
       set_pwm1_duty(714);
 
       set_pwm1_duty(dutty);
        setup_adc (adc_clock_internal);     // selecciona el moodo para la configuracion del modulo conversor A/D
                                          //correspondientes a los bits7:6 del ADCON0
        setup_adc_ports (AN0|VSS_VDD);       //DEFINICION DE LAS ENTRADAS ANALOGICAS CORRESPONDIENTE A LOS BITS 3-0 DEL ADCON1
        set_adc_channel (0);                // Elige canal analogico a medir
/// si redefines las entradas cada vez nunca leeras nada,
 
       while(1) {//1 el while tiene que abarcarlo todo o no chequea las entradas analoguicas.
        IF(C1OUT) dutty=714;
        else dutty=0;
        
         delay_us (20);                      //espera 20 microseg
        value=read_adc();              // Hace conversión A/D
        TMP=value;
      if (value>1){//2
           output_high(pin_C5);
          
           delay_ms(10000);
        
         }//2
        else{//3
        output_low(pin_C5);
        delay_ms(10000);
        }//3
       }//1

      }
comprueva como un valor lo muestra y el otro no.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: comparador, conversor ad...los dos ?
« Respuesta #11 en: 29 de Marzo de 2010, 08:41:47 »
Ahora si lo que necesitas es saber que tensión le aplicaste a la entrada, teniendo el valor que te da el ADC debes hacer

Vmedida=ValorADC*Vref+/1024
en tu caso si la Vref+=4.5v

Vmedida=ValorADC*4.5v+/1024


Si por ejemplo el ADC te dio un valor de ValoADC=341
Vmedida=341*4.5/1024=1.498V

Debes tener en cuenta que el valor de adc es un entero. Por lo tanto para poder realizar las operaciones correctamente, tu variable medida debes declararla como float.


Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #12 en: 29 de Marzo de 2010, 09:02:31 »
hola!
gracias por las respuestas a todos..que rapidos !

Lo del a tension de referencia no entiendo si es a 4,5 V..yo creo que son 5 voltios ( si no ponia yo a drede alguna Vref distinta). Bueno, en efecto, lo que es el "valor real" o sea, lo que lee, esta en los registros ADRESH y ADRESL. Del ADRESH solo cojo 2 bits, ya que esta para 10 bits. He visto en el isis una ventanita donde le puedes poner para ver el resultado de esos registros ( o los que quieras del pic) y...en efecto..por regla de 3...
si 1024 ( que son los 10 bits a 1) son los 5 voltios ( si no pongo nada de Vref. lo toma como 5..?) entonces 286 ( que es el valor que leo si meto 1.4 voltios de input, por los registros ADRESH=00000001  ADRESL=00011110) seran  x voltios. Solucionamos... y en efecto, sale 1.4 V .

Para que salgan los 1.4, se ha de sumar el 0 del resultado de los registros, o sea, no 286 sino 287.
Ahora pues, inhabilitar mi PWM hago esto :
Código: C
  1. value = read_adc();
  2.  delay_us(10);
  3.  valor_real=5.0*value/1024.0;
  4.  delay_us(10);
  5.  
  6. if(value>286){     //  286 ( mas el 0) es lo que lee el ADC del PIC con una entrada de 1,4 voltios
  7.  setup_ccp1(CCP_OFF);
  8.  setup_ccp2(CCP_OFF);

Ahora lo mas " bonito" seria hacer la comparacion del if, no con el valor del rgistro, sino con el valor de la tension que quiero, o sea valor real

El siguiente punto seria hacer esto solo con comparador ( que esa era la duda del principio) para ver que ventajas tiene hacerlo por conversion AD o por comparador, para parar el PWM

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: comparador, conversor ad...los dos ?
« Respuesta #13 en: 29 de Marzo de 2010, 09:28:47 »
Lo de 4.5v fue por lo que vi en el esquemático, y solo fue  modo de ejemplo  :lol:, en realidad en el código está configurado para 5V de Vref+.


Si utilizas los comparadores, solo vas a lograr un control On/OFF del pwm. con lo que el riple de salida creo va a ser muy grande.
Yo me inclinaría por utilizar el ADC y así poder implementar un control PID, para lograr así una tensión de salida lo más estable posible.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: comparador, conversor ad...los dos ?
« Respuesta #14 en: 29 de Marzo de 2010, 09:58:00 »
uhmm..PID...si... Estoy de acuerdo, porque depende de que valor que se que "cortara" el PWM le deja hacer una pasadita... Si por ejemplo esa "pasadita" de valores lo pongo en mi circuito boost ( que por otra parte me esta costando configurarlo...pero eso es otro tema ya ) no deberia pasar nada, pq el tiempo de conversion del boost es algo mas lento ( hasta que se cargan los C de carga), pero depende de en que circuito lo use...esa pasadita por el valor malo una vez (solo) me daria probloemillas. Asi que si, en efecto, me decantaria por el AD que ya esta y un posible PID. De todos modos, probare el comparador, porque no lo he hecho, y asi ya tengo una cosa mas aprendida . merci!

PD: ahhh !! ahora entiendo lo de la Vref...uy que despitado...e sque ese primer circuito era para entender un segundo, que es el que pongo a continuacion..asi despejo dudas..nadie diga..." y este de que habla..?" jaja! :P

En ese circuito el boost me falla, lo que decia antes, pero para A0 pongo una fuente de tension analogica directa, para provar los valores de tension que quiero

« Última modificación: 29 de Marzo de 2010, 10:10:41 por PICYO »