Autor Tema: Duda programa 16f88 para entrada analogica y PWM  (Leído 2886 veces)

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

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Duda programa 16f88 para entrada analogica y PWM
« en: 02 de Septiembre de 2010, 17:39:04 »

Hola amigos,

Estoy aprendiendo poco a poco en esto de programar PIC (basicamente en C), y temas de entradas y salidas digitales, mas o menos lo controlo (al menos lo básico). Pero ahora tenia en mente complicarme un poco mas y creo que me he pasado de complicación.  :?

Me gustaria en un 16f88, tener una entrada analogica con un potenciometro entre 0 y 5v, y una salida PWM con un led que parpadee y varie su velocidad de parpadeo segun el valor del potenciometro.

Me podeis orientar un poco sobre como "diseñar" el programa.  ;-)

Gracias!!!!

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Re: Duda programa 16f88 para entrada analogica y PWM
« Respuesta #1 en: 06 de Septiembre de 2010, 11:30:47 »
Hola,

Tras varias pruebas y lecturas, he decidido ir por pasos.

Primero voy a inentar que me funcione la parte A/D y despues me meto con el codigo PWM.

Tengo este codigo que segun la entrada analogica, enciende 3 Leds (menos 33% enciende Led1, entre 33 y 66% Led2 y mas de 66% Led3)

Pero no me funciona, algun consejo??

Código: [Seleccionar]
#include <16f88.h>
#device adc=10
#use delay(clock=8000000)
#fuses HS, NOWDT, NOLVP, NOMCLR

#define motor PIN_B2
#define on PIN_B0   
#define puff PIN_B1 

int duty;
void main(void){

//CONFIGURACIÓN CONVERSOR AD
SETUP_ADC(ADC_CLOCK_INTERNAL); //TIEMPO DE CONVERSION Fosc/8
SETUP_ADC_PORTS(sAN0);      // CONFIGURACION DE AN0 COMO CANAL ANALÓGICO
SET_ADC_CHANNEL(0);         //SELECCIONAMOS EL CANAL 0 PARA LA CONVERSION

//CONFIGURACION MÓDULO CCP
//setup_timer_2(T2_DIV_BY_16,124,1); //configuramos el timer 2 para una frecuencia de 1000hz
//SETUP_CCP1(CCP_PWM); //CONFIGURAMOS MODULO CCP PARA PWM
//SET_PWM1_DUTY(50);    //DAMOS UN CICLO DE TRABAJO INICIAL DE 50%

while(1){

duty=read_adc();  //leemos canal analogico que nos devuelve un numero entre 0 y 1024

if(duty>=800) { //si el numero es mayor que 100 le asiugnamos el valor 100
   output_high(puff); // Encender LED
   output_low(motor);
   output_low(on); }

if(duty>400 && duty<800) { //si el numero es mayor que 100 le asiugnamos el valor 100
    output_high(on); // Encender LED
   output_low(puff); 
   output_low(motor);  }

if(duty<400) { //si el numero es mayor que 100 le asiugnamos el valor 100
    output_high(motor); // Encender LED
   output_low(on);
   output_low(puff); }

//SET_PWM1_DUTY(duty); //establecemos el nuevo ciclo d etrabajo
}
}

PD: Adjunto codigo en C, hex y simulacion en proteus.
« Última modificación: 06 de Septiembre de 2010, 11:34:41 por sokoloko »

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Duda programa 16f88 para entrada analogica y PWM
« Respuesta #2 en: 06 de Septiembre de 2010, 14:11:58 »
Hola sokoloko, he estado viendo tu programa y por el momento le veo dos errores:

Declaras int duty; y luego pones instrucciones como: if(duty >= 800)  Recuerda que las variables tipo int solo son de 8 bits (0 -->255), por lo que la deberias declarar como: long int duty;.

Luego veo que tienes la siguiente línea en el archivo 16F88_A-D.c del archivo que subiste:
duty = duty * 10;          //dividimos el numero entre 10 para tener un numero entre 0 y 102,4 Me imagino que debe ser un error de tipografía y que quisiste poner:
duty = duty / 10;          //dividimos el numero entre 10 para tener un numero entre 0 y 102,4

Si veo algo más te cuento.

Saludos!

« Última modificación: 06 de Septiembre de 2010, 14:15:58 por bmb »

Desconectado sokoloko

  • PIC12
  • **
  • Mensajes: 77
Re: Duda programa 16f88 para entrada analogica y PWM
« Respuesta #3 en: 06 de Septiembre de 2010, 19:55:22 »
BuuuuFFFFF!!!!!!!   

Mil gracias Bmb, has dado con el problema   :-) :-) :-)

Ha sido cambiar la variable a Long y funcionar a la perfección. La linea que comentas:

Código: [Seleccionar]
duty = duty / 10;          //dividimos el numero entre 10 para tener un numero entre 0 y 102,4
Como bien supones era de unas pruebas y tenia que ir comentada.

Pero por fin puedo continuar con la aplicación.

Muchas gracias  :mrgreen:


 

anything