Autor Tema: 16f877A: Utilizar ADC para generar señal PWM  (Leído 7516 veces)

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

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
16f877A: Utilizar ADC para generar señal PWM
« en: 05 de Marzo de 2014, 11:26:55 »
Hola!

Estoy intentando hacer funcionar un 16f877A para, según la tensión que reciba de una fuente de alimentación generar luego una señal PWM pero termino de conseguirlo. No sé si es debido al código o a la forma de conectar el PIC y sus pines.

El código es el siguiente:

Código: [Seleccionar]
//Programa que recibiendo un voltaje lo convertimos a PWM mediante el módulo ADC

int temp_res;
int voltaje;
unsigned short CU=255;

void main() {
PORTC=0X00;                  //Inicializacion
TRISC2_bit=0;                //RC2 como salida
PWM1_Init(10000);           //Frecuencia PWM
PWM1_Set_Duty(CU);
PWM1_Start();
 while(1) {
 temp_res=ADC_Read(2);      //Obtiene 10 bits de la conversión del canal 2.
 //voltaje=(temp_res*488); //Transforma el número de 10 bits al voltaje
 //correspondiente. Considerando que multiplica por 10^5 para no tener que
 //tratar con decimales.
 CU=temp_res/4; //Paso de 10 bit a 8bit
 PWM1_Set_Duty(CU);
}
}

Lo he simulado en Proteus y parece que va bien, pero luego a la hora de la verdad me sale lo que debería, me sale una señal con mucho ruido y un voltaje fijo, alrededor de 4V. Os dejo la imagen de PROTEUS.

A parte de eso tengo conectado un oscilador de 10 MHZ a los pines 13 y 14 con sus respectivos condensadores a tierra, son de 100 nano ya que no tengo de 15p. El pin 1 lo tengo conectado a VDD mediante una resistencia de 5K, y luego tengo los dos pares de pines VDD y GND conectados entre sí. 32 y 11 a 5V y 31 y 12 a GND.

¿Qué puedo estar haciendo mal? ¿Puede ser el PIC que esté fallando?
Tengo pensado aprender a hacerlo en lenguaje c18 con un pic 18f2321 para dejarme de líos de tener que poner el oscilador externo.

Muchas gracias de antemano.

Un saludo.

Desconectado HJG

  • PIC12
  • **
  • Mensajes: 77
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #1 en: 05 de Marzo de 2014, 11:41:48 »
A parte de eso tengo conectado un oscilador de 10 MHZ a los pines 13 y 14 con sus respectivos condensadores a tierra, son de 100 nano ya que no tengo de 15p.
Eso está mal.

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #2 en: 05 de Marzo de 2014, 11:53:52 »
A parte de eso tengo conectado un oscilador de 10 MHZ a los pines 13 y 14 con sus respectivos condensadores a tierra, son de 100 nano ya que no tengo de 15p.
Eso está mal.


Intentaré corregirlo tan pronto pueda y comentaré los resultados.
Gracias!

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #3 en: 05 de Marzo de 2014, 12:09:13 »
Sí tienes ruido en el ADC lo vas a tener en el PWM
mi recomendación, hacer muchas lecturas del conversor ad y promediar
después asignar el valor al pwm
Tienes que mirar también la resolución del pwm por que tal vez trabaje a 10bits y tú le estas asignando un valor de 8, o tal vez a la inversa, piensa que dependiendo de la frecuencia del pwm tendrás una resolución u otra
mira el datasheet la forma de calcularlo
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado HJG

  • PIC12
  • **
  • Mensajes: 77
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #4 en: 05 de Marzo de 2014, 12:33:13 »
Sí tienes ruido en el ADC lo vas a tener en el PWM
mi recomendación, hacer muchas lecturas del conversor ad y promediar
después asignar el valor al pwm
Tienes que mirar también la resolución del pwm por que tal vez trabaje a 10bits y tú le estas asignando un valor de 8, o tal vez a la inversa, piensa que dependiendo de la frecuencia del pwm tendrás una resolución u otra
mira el datasheet la forma de calcularlo
Me das la sensación de que no pasa por allí en este caso, ya que el menciona que en la simulación le anda correctamente y en la vida real no... y en el cristal ha colocado capacitores (condensadores) de 100000pF en lugar de 15pF.... lo mas seguro es que el oscilador no oscile... creo que debería modificar eso antes que nada.

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #5 en: 05 de Marzo de 2014, 12:44:44 »
Proteus no genera ruido y se por experiencia que las entradas adc en proboard captan muchísimo ruido
yo hay veces que no pongo condenadores al cristal y funciona bien... 100nf es una barbaridad pero me decanto más por problema de software y el ruido de el ADC
yo quitaria los compensadores y haría las múltiples lecturas, lo acumularía en una variable de 32bits y hallaria la media
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #6 en: 05 de Marzo de 2014, 15:36:19 »
Muchas gracias HJG y ppyote por vuestra ayuda!

He probado poniendo dos de 100 nano en serie que si no me he equivoco nos hace como si fuera uno de 20 pico pero aún así nada, eso sí, ahora no me da ningún voltaje la señal. También he probado a meterle un código de PWM que he encontrado en el libro "Cómo programar en lenguaje C los microcontroladores PIC16F88, 16F628A Y 16F877A" de Juan Ricardo Penagos Plazas y tampoco me funciona, no me da ninguna señal. En este código no se usa la señal ADC, simplemente se genera una señal PWM a la que variamos su Duty Cicle de 25% en 25% mediante un pulsador.

Así que supongo que o bien está mal el PIC o bien está mal la forma de conectarlo.

Voy a intentar probar algún ejemplo con el 18F2321.

Desconectado HJG

  • PIC12
  • **
  • Mensajes: 77
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #7 en: 05 de Marzo de 2014, 16:01:53 »
He probado poniendo dos de 100 nano en serie que si no me he equivoco nos hace como si fuera uno de 20 pico pero aún así nada,
hola, totalmente erroneo, dos capacitores de 100 nF es serie dan uno de 50 nF.... y vos necesitas cuando mucho 33 pF, es decir 1000 veces menos de lo que  pusiste.

Haceme caso, colocá dos capacitores de entre 15pF a 33pF y proba, ese es todo el problema que tenés, estoy seguro en un 99.9%

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #8 en: 05 de Marzo de 2014, 16:12:37 »
He probado poniendo dos de 100 nano en serie que si no me he equivoco nos hace como si fuera uno de 20 pico pero aún así nada,
hola, totalmente erroneo, dos capacitores de 100 nF es serie dan uno de 50 nF.... y vos necesitas cuando mucho 33 pF, es decir 1000 veces menos de lo que  pusiste.

Haceme caso, colocá dos capacitores de entre 15pF a 33pF y proba, ese es todo el problema que tenés, estoy seguro en un 99.9%

 :oops: :oops: No había vuelto a invertir. Muchas gracias por la corrección!! Intentaré conseguirlo de alguna forma.

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #9 en: 06 de Marzo de 2014, 11:13:16 »
Era cosa de los condensadores  :pared

Muchísimas gracias HJ!!

Ahora el problema que tengo es que el 50% del duty cicle me lo da un voltaje de 2,20 V aprox, cuando debería ser 2,50 V el que me lo diera, además, este voltaje que me fija el 50% (y por tanto el resto de valores de Duty Cicle) varía dependiendo de la frecuencia que le ponga a la onda PWM. ¿Por qué puede ser?

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #10 en: 21 de Marzo de 2014, 15:47:26 »
Al final conseguí hacer funcionar el ADC y el PWM, ahora tengo un nuevo problema relacionado, y es que quiero sacar 10 bits del PWM y por ello no voy a utilizar las funciones de la librería de PWM que vienen en MikroC si no que usaré los registros del PIC.

El problema es que no consigo que funcione y no sé qué puedo estar haciendo mal, cuando cargo la simulación en Proteus y doy al play me sale el error que adjunto en la imagen. Por lo que me dice es cuestión de que no doy el tiempo adecuado a la conversión ADC para finalizar cuando ya quiero empezar la siguiente. Pero he configurado los bits y el fosc siguiendo las instrucciones del datasheet del 16f877a para dejar un tad de 1,6us.

Os dejo el nuevo programa a ver si me podéis echar una mano:

utilizo un cristal de 20MHz

Código: [Seleccionar]
//Programa que recibiendo un voltaje lo convertimos a PWM mediante el módulo ADC
char alto, bajo;

void inicia_AD();
void selecciona_AD(unsigned num);
void arranca_AD();
char leer_AD();
void set_PWM(char alto, char bajo);

void main() {
PORTC=0X00;                  //Inicializacion
TRISC2_bit=0;                //RC2 como salida
PR2 = 0b11111111;            // PR2 = 255
T2CON = 0b00000100;          // Timer2 Prescaler = 1
inicia_AD();

 while(1) {
 arranca_AD();
 alto, bajo = leer_AD();
 set_PWM(alto, bajo);
 }
}

void inicia_AD() {
 ADCON0=0b11010001; //Fosc/32 ; channel 2; utilizo un cristal de 20MHz
 ADCON1=0b00000010; // Left-justified: dos bits menos significativos en ADRESL. Utilizamos como voltajes de referencia VDD y VSS.
}

void selecciona_AD(unsigned num)
{
 char aux;
 aux=ADCON0 & 0b10000111; //pongo a 0 el canal de conversion
 ADCON0=aux | (num<<3); //activamos el canal que se pasa
//000 = Channel 0 (AN0)
//001 = Channel 1 (AN1)
//010 = Channel 2 (AN2)
//011 = Channel 3 (AN3)
//100 = Channel 4 (AN4)
//101 = Channel 5 (AN5)
//110 = Channel 6 (AN6)
//111 = Channel 7 (AN7)
}

void arranca_AD()
{
 ADCON0=0b11010101; //ponemos en marcha el conversor
}

char leer_AD()
{
 char alto,bajo;
 while (ADCON0==0b11010101); //aquí esperamos a que acabe de convertir
 bajo= ADRESL;
 alto = ADRESH;
 return(alto,bajo);
}

void set_PWM(char alto, char bajo)
{
 char aux;
 aux = bajo>>2;
 CCP1CON = CCP1CON&0b11001111;
 CCP1CON = CCP1CON|aux;
 CCPR1L=alto;
}

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #11 en: 24 de Marzo de 2014, 18:44:14 »
Bueno, como no era capaz de hacer funcionar el PWM con el anterior código he vuelto a utilizar el ADC_read() pero sigo intentando sacar los 10 bits al PWM utilizando los registros adecuados, el código ahora es bastante más sencillo, consigo sacar la señal PWM, pero sigue siendo de 8 bits y no entiendo por qué.

El código es el siguiente:
Código: [Seleccionar]
//Programa que recibiendo un voltaje lo convertimos a PWM mediante el módulo ADC
int valor;     //valor al que asignare los 10bits del ADC

void main() {
PORTC=0X00;                  //Inicializacion
TRISC2_bit=0;                //RC2 como salida
PR2 = 0b11111111;            //PR2 = 255
T2CON = 0b00000100;          //Timer2 on; Prescaler = 1; Postscaler = 1:1

 while(1) {
 valor = ADC_read(2);        //Obtengo 10 bits del canal 2
 CCP1CON = ((valor/4) - floor(valor/4))*4*16+12; //Divido entre 4 para separar
 //los 8 bits mas significativos de los 2 menos significativos, resto el entero
 //de la division para quedarme con el valor decimal y vuelvo a multiplicar por
 //cuatro para sacar el valor decimal de los 2LSB. Multiplico por 16 para desplazar
 //cuatro posiciones a la izquierda y sumo 12 para establecer el modo PWM
 CCPR1L = floor(valor/4);      //Asigno los 8MSB al registro CCPR1L
 }
}

Leo una señal de 0 a 5 V por el canal 2, se supone que me da 10 bits por lo que debería tener una sensibilidad de 5/1024 = 4,88mV, sin embargo el PWM varía de 20 en 20 mV, lo que se corresponde a 8 bits. Estoy utilizando un cristal de 20MHz. Creo que es cosa de código porque al simularlo en Proteus me pasa lo mismo, no noto variación del PWM cada 5mV sino cada 20mV. Pero por más que reviso el código y los valores que deben tener los registros no veo nada que pueda estar mal.

¿¿Me podríais ayudar por favor??

Gracias de antemano!!

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #12 en: 24 de Marzo de 2014, 19:36:17 »
has probado a hacer un debuggin y ver donde esta el error de calculo?? Es lo que se suele hacer en estas ocasiones.

Desconectado xexijreil

  • PIC10
  • *
  • Mensajes: 10
Re: 16f877A: Utilizar ADC para generar señal PWM
« Respuesta #13 en: 03 de Abril de 2014, 07:40:00 »
El problema era el haber designado valor como int y no como float, se estaba comiendo los decimales.  :oops:


 

anything