Autor Tema: PWM y ADC con PIC16F876A  (Leído 7641 veces)

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

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
PWM y ADC con PIC16F876A
« en: 09 de Enero de 2009, 20:31:17 »
Hola amigos,

Tengo algunas dudas que creo que son más bién de conceptos básicos y espero me puedan ayudar a aclararlas:

El convertidor ADC de los PICs, siendo analógico-digital, acepta señales analógicas como señales pwm y las convierte a su correspondiente valor digital o es necesarios realizar una rectificación, filtrado, etc para que el convertidor pueda generar el valor digital?

De ser esto asi, y ya que tengo una señal PWM de 1.99 VAC @ 7.814KHz (medido con Fluke 189) cómo tendría que ingresar esta señal al conv ADC del 16F876A para tener su valor digital correspondiente?

Por último y aunque es más bién una custión meramente de hardware, la señal PWM medida con el Fluke 189 me dice 1.99 VAC @ 7.814KHZ y una componente DC de 0.99 VDC, cómo le hago para quitar la componente DC?

Saludos

jacrmr

  • Visitante
Re: PWM y ADC con PIC16F876A
« Respuesta #1 en: 09 de Enero de 2009, 20:59:48 »
El convertidor A/D del PIC no convierte ninguna señal PWM en un valor promedio si a eso te refieres. Simplemente convierte como cualquier otro convertidor A/D el valor instantáneo de la señal ya sea ésta PWM, un voltaje fijo, una señal de AC dentro del rango de 0 a 5 volts, ruido, etc. El convertidor no necesita de ninguna circuitería externa para generar el valor digital del voltaje que vaya a convertir. Sin embargo, la aplicación sí puede necesitarla, a veces forzosamente en la gran mayoría de los casos para que la señal que le llegue al convertidor sea lo más fiel posible. Dentro de éstas consideraciones sí puedes necesitar filtrado, limitación, escalamiento, etc. Eso ya lo dicta tu circuito de donde viene la señal que quieres convertir.

Respecto a la última pregunta todo depende de lo que quieras medir con el convertidor A/D. Si lo que quieres es medir la representación del PWM (0% a 100%) y quitas la componente de DC no podrás medir nada ya que precisamente ésa componente es lo que te representa la actividad del PWM (con un filtrado paso bajo adecuado). Si lo que quieres es medir el valor instantáneo en determinados tiempos de la señal puedes hacerlo directamente.
« Última modificación: 09 de Enero de 2009, 21:06:01 por jacrmr »

Desconectado josnelihurt

  • PIC12
  • **
  • Mensajes: 64
Re: PWM y ADC con PIC16F876A
« Respuesta #2 en: 09 de Enero de 2009, 21:15:51 »
hola, el ADC lee el valor instantáneo a la muestra correspondiente, es decir detectara un valor de muestra mas no un promedio, ud debe tener encuentra que el ADC solo se puede usar entre valores de 0 a 5V no valores negativos, si la señal esta dentro de este rango no hay porque preocuparse en cuanto a voltaje.

lo mas sencillo seria utilizar un LPF (Filtro pasa bajas RC) y leer el ADC, pero si lo quiere hacer netamente digital puede detectar los flancos de subida y bajada, determinar la frecuencia(cada flanco de subida del PWM), y el duty(% de encendido es decir tiempo en dar flanco de bajada con respecto al de subida el PWM), y multiplicándolo el resultado por 5 que seria el valor H del PWM, y listo, para quitar el DC, puede aplicar un filtro pasa bajas o castizamente un promediador, el cual le dice cual es el promedio de la señal y luego se la resta a la muestra entrante.

Espero le sirva, Saludos
JoN

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: PWM y ADC con PIC16F876A
« Respuesta #3 en: 10 de Enero de 2009, 00:10:17 »
Gracias por las respuestas.

Creo que primero tendria que asegurarme que estoy generando efectivamente la señal PWM. El código que estoy utilizando es el siguiente a través de AN0:

GenPWM:
   movlw   0x63
   movwf   PR2
   movlw   0x32
   movwf   CCPR1L
   bcf      CCP1CON,4
   bcf      CCP1CON,5
   movlw   0x04
   movwf   T2CON
   bsf      CCP1CON,2
   bsf      CCP1CON,3
   return

Según lo que estuve viendo en el datasheet, primero tengo que calcular el valor de PR2 y de la fórmula

PWM per = (PR2+1) * 4 * Tosc * TMR2

                  PWM per
PR2 = ---------------------- - 1
            4 * Tosc *TMR2

establecí que mi PWM freq = 20KHz y entonces el PWM per = 50 useg. Si estoy usando un osc de 8MHz y seteo TMR2 = 1

me da como resultado PR2 = DEC 99 = 63h

Después el PWM duty cycle de la fórmula

PWM dc = (CCPR1L : CCP1CON) * Tosc * TMR2

                                     PWM dc
CCPR1L : CCP1CON = ---------------
                                    Tosc * TMR2

el PWM dc lo puse a 50% y me da como resultado

CCPR1L : CCP1CON = DEC 200 = C8h

de este ultimo cálculo no me acuerdo por qué puse los valores de 32h y 04h, pero lo voy a rectificar. Tal vez mi generación de la señal PWM no esté correcta.

Aunque Sí se genera una señal que como mencioné tiene valores de 1.99 VAC y 7.814 KHz y una componente de DC de 0.99 VDC. Me preguntaba si no tendría que estar esta señal cerca de los 5volts DC?

Ahora, dado que esta señal se me hacía muy débil, le puse un transistor 2N2222 en una config muy básica:

                                               +5V
                                                |
                                                |
                                               /C
     Señal PWM del PIC  O------|/
                                             \
                                              \ E ------> Muestra al osciloscopio
                                                   |
                                                  ---
                                                  |  |
                                                  |  | 1kohm
                                                  ---
                                                   |
                                                 GND

esto con el fin de amplificarla, pero de hecho baja el voltaje a 1.73 VAC @ 7.814 KHZ y 0.86 VDC, esto pensando que fuera algún tipo de ruido.

Voy a ver lo de los filtros también, que aunque no he trabajado mucho con ellos lo investigaré y les cuento. En general lo que pretendo hacer es generar la señal PWM y leerla en el convertidor A/D

Saludos

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: PWM y ADC con PIC16F876A
« Respuesta #4 en: 10 de Enero de 2009, 00:34:09 »
Ok, otra cosita, le cambié el valor que habia calculado para PR2 de 63h = DEC 99, lo multipliqué por 1.5 (solo para ver que pasaba) y me da 148.5, le pongo DEC 148 = 94h y me da exactamente la misma señal con los mismos valores de AC DC y frecuencia..... qué es lo que pasa?????? Me queda claro que algo está mal en mi generación del PWM pero no logro saber qué es.....

Saludos

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: PWM y ADC con PIC16F876A
« Respuesta #5 en: 10 de Enero de 2009, 01:07:42 »
Otro dato para generar el PWM dc tome el valor de 50% que corresponde a 25useg y con esto me da el valor de DEC 200 = C8h tomo los primeros 8 bits como 00110010 = 32h y los ultimos 2 (00) los pongo en CCP1CON,4 y CCP1CON,5

Saludos

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: PWM y ADC con PIC16F876A
« Respuesta #6 en: 13 de Enero de 2009, 00:10:39 »
Con nuevos resultados:

Sucede que en vez de variar el valor cargado en PR2 dejé el que habia calculado de DEC99 = 63h y cambié el cargado en CCPR1L : CCP1CON, solo por probar el valor 0 x 32 lo multipliqué por 2 y cargué el valor 0 x 64 y obtuve una señal diferente, de la misma frecuencia pero de aspecto diferente en cuanto a los anchos de pulso. Realice varios cambios al mismo registro y en cada valor cargado obtengo diferentes anchos de pulso. Con esto pienso que mi generador PWM está correcto en cuanto a la código que puse anteriormente. El valor que pienso dejar es el de 0x7D que me da una forma de onda más simétrica y de ahi voy a a ponerle un filtro RC. Este tema de los filtros lo sigo estudiando y ya les contare.

Mientras sigo al pendiente por cualquier idea, sugerencia o ayuda en general.

Saludos y gracias

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: PWM y ADC con PIC16F876A
« Respuesta #7 en: 14 de Enero de 2009, 00:15:53 »
Bueeeeeno..... sigo haciendo experimentos y nada de avance....... una ayudadita por favor.....

Lo del transistor no funcionó para la amplificación de la señal, por lo cual opté por un filtro RC pasa bajos.

Mi problema de momento y creo que más importante es que quiero leer dos señales analogicas, una por AN0 y la otra por AN1 en momentos diferentes claro. El problema es que sin conectarle ninguna señal a la entrada AN1 me da una lectura en el ADC. Ya revisé conexiones y están bien. En cuanto al código creo también estar bien, pero no sé si algo me falte:

INICIO:
      banksel   ADCON1      ;Cambia a Bank 1
       movlw   0x3F      ;Pone a RA0:RA5 como entradas
       movwf   PORTA        ;
       movlw   0x00       ;Pone a w = 00000000
       movwf   PORTB        ;Pone a PORTB & PORTC como salidas
       movlw   0x90       ;Pone a RC4 y RC7-RX como entradas
       movwf   PORTC      ;y a RC3:RC0 RC5:RC6-TX como salidas
      movlw   0x04      ;RA0, RA1 y RA3 como analogica
      movwf   ADCON1      ;RA2,RA4 y RA5 como digitales
                     ;A/D Result Format = Left justified
      banksel   ADCON0      ;Cambia a Bank 0

;*****************************************************************************************
;SUBRUTINA PARA LEER EL CONVERSOR A/D EN AN0
;*****************************************************************************************
LEER_ADC_AN0:
   banksel   ADCON1      ;Cambia a Bank 1
   movlw    0x04            ;RA0, RA1 y RA3 como analogica
   movwf    ADCON1      ;RA2,RA4 y RA5 como digitales
                  ;A/D Result Format = Left justified
   banksel   ADCON0      ;Cambia a Bank 0
   movlw   0x00      ;AN0 Analog Input Channel, para tomar la muestra de PWM generada en el PORTC RC2
      movwf   ADCON0      ;
      bsf      ADCON0,6   ;ADC Clock Fosc/8
      bsf      ADCON0,0   ;Enciende el ADC

      call   Delay_40us
      call   Delay_5us
      call   Delay_5us

      bsf      ADCON0,2   ;Inicia la conversion ADC

Lloop   btfss   PIR1,6
      goto   Lloop

      movf   ADRESH,0
      movwf   VIN

      bcf      PIR1,6

      return

;*****************************************************************************************
;SUBRUTINA PARA LEER EL CONVERSOR A/D EN AN1
;*****************************************************************************************
LEER_ADC_AN1:
      banksel   ADCON1      ;Cambia a Bank 1
      movlw   0x04      ;RA0, RA1 y RA3 como analogica
      movwf   ADCON1      ;RA2,RA4 y RA5 como digitales
                     ;A/D Result Format = Left justified
      banksel   ADCON0      ;Cambia a Bank 0
       bsf      ADCON0,3   ;AN1 (ADCON0 <5:3> CHS2:CHS0 = 001) entrada analogica para tomar la muestra de retorno
      movwf   ADCON0      ;
      bsf      ADCON0,6   ;ADC Clock Fosc/8
      bsf      ADCON0,0   ;Enciende el ADC

      call   Delay_40us
      call   Delay_5us
      call   Delay_5us

      bsf      ADCON0,2   ;Inicia la conversion ADC

LloopRT   btfss   PIR1,6
      goto   LloopRT

      movf   ADRESH,0
      movwf   VINRTN

      bcf      PIR1,6

      return

La señal PWM que genero en el PORTC CCP1 la aplico a AN0 solamente pero sin aplicar nada en AN1 me da una lectura que no deberia existir. Alguna idea de por qué esté pasando esto??????

De hecho los valores que leo en VIN y VINRTN son consecutivos y a veces iguales, por ejemplo: ED, EC..... F2,F1..... E8,E7.... EC,EC..... EE,EE..... EC,EB

curioso no?????

Desconectado telojurito

  • PIC12
  • **
  • Mensajes: 55
Re: PWM y ADC con PIC16F876A
« Respuesta #8 en: 14 de Enero de 2009, 18:38:52 »
Despues devarias pruebas pense en que podria tener problemas de ruido, ademas porque con el osciloscopio se veia una especie como de barrido en la señal que estoy leyendo por AN1. Empece a quitar los capacitores del filtro RC pero se mantenia esta señal y en el display me ponia un valor que no deberia de ser, ya que si no habia fisicamente nada que hiciera contacto, inclusoquitando el cable que lleva esta señal a AN1 deberia de leer 00.00volts. Entonces pense en la señal PWM generada en el PORTC CCP1, corte el cablecito y contua leyendo un cierto valor aunque pequeño por ejemplo 02.84 volts pero al tocar este cablecito y leer los valores me despliega 00.00 en ambos puntos AN0 y AN1. Entonces pense en mi fuente que por ser sencilla me estaria metiendo ruido. A la entrada del reg de 5V le puse una pila cuadrada de 9V pero pasa lo mismo, sigue poniendo esos mismos valores pequeños y al tocar el cable que viene de CCP1 o el que entra a AN1 se pone todo en ceros.

 :( :( :( :( :(

No logro entender este efecto espero que alguien pueda darme una idea de lo que sucede y como solucionarlo. Estoy construyendo el circuito en una tablilla perforada experimental para soldar.

Saludos