Ayuda PWM PIC16F877A

Ir abajo

Ayuda PWM PIC16F877A

Mensaje por tony8a87 el Lun 2 Mayo 2011 - 1:23

Hola necesito ayuda con el PWM en un pic 16f877a, a una frecuencia de 1khz para un led,
el codigo es el siguiente la verdad me es dificil identificar si esta bien con el simulador proteus.
la intension es ocupar un potenciometro para el puerto analogo digital y dependiento si esta al maximo (1023) controlar la intensidad de luz del led.
Código:
/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include <pic16f877a.h>
#include <pic/adc.h>
/* ----------------------------------------------------------------------- */
/* Configuration bits: adapt to your setup and needs */
typedef unsigned int word;
word at 0x2007 CONFIG = _RC_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;
//**********Funciones Usadas*************
void pwm1_send(unsigned int valor);
void pwm2_send(unsigned int valor);
void main() {   
int valor=0;
TRISA=1;
TRISB=0;
TRISC=0;
PORTA=0;
PORTB=0;
PORTC=0;
//Habilito TMR0
TMR0=0;
   adc_init(FOSC_2, A1_R0, INT_OFF); //Uso de Rutina ADC de PIC, iniciacion
OPTION_REG=135;    //Configuro preescaler de TMR0 
//****************PWM 1 Volt**********************************
T2CON=1;    //PreScaler 4
PR2=249;      //PR2 249, parA 1KHZ
//PWM1 RC2
CCPR1L=0;  //Ancho del Ciclo debe ser 1ms
CCP1CON=12;
//PWM2 RC1
CCPR2L=0;  //Ancho del Ciclo debe ser 1ms
CCP2CON=12;
TMR2ON=1;//Tmr2 Encendido
   while(1) {
      valor=adc_read(0);
      pwm1_send(valor); //valor del analogo-digital
      pwm2_send(1023); //siempre al maximo
      }
   }
/*****************PWM 1  RC2****************/
void pwm1_send(unsigned int valor)
{
unsigned char temp,temp1 ;
temp=valor>>2;
temp1=(valor & 0x03)<<4;
//******Valor de PWM*******
CCPR1L=temp;
CCP1CON=temp1|12;
//************************
}
/******PWM 2  RC1****************/
void pwm2_send(unsigned int valor)
{
unsigned char temp,temp1 ;
temp=valor>>2;
temp1=(valor & 0x03)<<4;
//******Valor de PWM*******
CCPR2L=temp;
CCP2CON=temp1|12;
//************************
}

El codigo original es de risanti modificado.
Quedo en espera de su apoyo.
Saludos cordiales!!!
avatar
tony8a87
Participante Activo
Participante Activo

Mensajes : 34
Fecha de inscripción : 10/08/2010

Volver arriba Ir abajo

Re: Ayuda PWM PIC16F877A

Mensaje por tony8a87 el Dom 8 Mayo 2011 - 18:44

Saludos quiero compartir mi primer codigo usando pwm con exito, aun tengo algunas pequeñas dudas y necesito mejorar mi codigo y apartir de ello generar una libreria para su facil uso.
En este codigo hago encender un led por el cpp1 del 100% al 0% con decremento de 10%.

Código:
/* ----------------------------------------------------------------------- */
/* Template source file generated by piklab */
#include <pic16f877a.h>
#include <pic/delai.h>
/* ----------------------------------------------------------------------- */
/* Configuration bits: adapt to your setup and needs */
typedef unsigned int word;
word at 0x2007 CONFIG = _XT_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF & _CP_OFF;
//PWM registers configuration
//Fosc = 4000000 Hz
//Fpwm = 250.00 Hz (Requested : 250 Hz)
//Periodo PWM = 1/Fpwm = 4*10exp-3=0.004
//PR2 = (Periodo PWM/4*Tosc*Prescaler) - 1= 249
////////Calculo de CCPR1L:CCP1CON<5:4>:////////////////
//PWM duty cycle = %Ciclo de trabajo*Periodo PWM
//CCPR1L:CCP1CON<5:4> = (% Ciclo/ Fpwm)/(Tosc*Prescaler)
void pwm1_send();
void main() {   
   TRISC=0;
   PORTC=0;
   PR2=249;
   T2CON = 0b00000111;
   CCPR1L=0; 
   CCP1CON=12;
   TMR2ON=1;
   while(1) {
      pwm1_send();
      }
   }
void pwm1_send(){
CCPR1L = 0b11111001;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b11100000;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b11000111;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b10101110;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b10010101;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b01111100;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b01100011;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b01001010;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b00110001 ;
CCP1CON = 0b00111100 ;
delay_ms(100);
CCPR1L = 0b00011000;
CCP1CON = 0b00111100;
delay_ms(100);
CCPR1L = 0b00000000;
CCP1CON = 0b00111100;
delay_ms(100);
}

Mi gran duda es el famoso duty cycle, porque entiendo que el valor maximo debe 1023 que deberia ser 100% de trabajo sin embargo usando el link:
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
me da otros valores para diferentes porcentajes.
La simulación funciona bien y en la vida real también, caresco de un osiloscopio para comprar en realidad si respeta la frecuencia que defini, asi que en uno de estos días ire de visita a mi vieja escuela y realizare mis pruebas.

Saludos cordiales!!!!!!
avatar
tony8a87
Participante Activo
Participante Activo

Mensajes : 34
Fecha de inscripción : 10/08/2010

Volver arriba Ir abajo

Yo tmb quiero hacer un PWM

Mensaje por martincruz el Sáb 28 Mayo 2011 - 3:02

Hola, soy nuevo en el foro, estaba aprendiendo a programar con PCWH, con ccs, y me artaron los problemas con windows, entonces me estoy mudando a ubuntu, y estoy en la tarea de empezar a programar pic con piklab. Quiero hacer lo mismo que vos tengo un 16F887, y quero con un potenciómetro variar el ancho del pulso y a una frecuencia de 1kHz, mis dudas son: ¿Qué es el preescaler? ¿Dónde puedo conseguir algun libro o cuál es la manera que uds recomiendan para aprender SDCC? Y yo tengo armado un clon de propic para grabar los pic, a piklab lo configuro como programador directo?, ¿me sirve este grabador? Desde ya muchas gracias me parece muy copado el foro, y bueno, todavía no entiendo bien el codigo del PWM, pero le pondremos ganas para poder hacerlo Saludos

PD: Ahi estoy leyendo el datasheets, y sale algo del preescaler, lo que se es que en el ejemplo de arriva vale 16, si después puedo aportar algo interesante del datasheet lo agrego


Última edición por martincruz el Sáb 28 Mayo 2011 - 3:37, editado 1 vez (Razón : editado para agregar información)

martincruz
Nuevo Usuario
Nuevo Usuario

Mensajes : 6
Fecha de inscripción : 27/05/2011

Volver arriba Ir abajo

Re: Ayuda PWM PIC16F877A

Mensaje por Pikitin el Sáb 28 Mayo 2011 - 22:19

Hola martincruz, bienvenido al foro.

Respecto al prescaler: el funcionamiento es sencillo, el timer normalmente (sin prescaler o con prescaler=1) se incrementa en cada ciclo de reloj, si pones el prescaler a 2, entonces se incrementa cada 2 ciclos de reloj, si lo pones a 16 pues cada 16 ciclos de reloj.

Para SDCC no hay ningun libro que yo sepa, puedes empezar por ir mirando ejemplos, por el foro seguro que encuentras unos pocos, mira en la sección Herramientas de compilación - SDCC.

No conozco el Propic, pero si es por puerto paralelo no debería haber problema en Piklab, si no te funciona puedes probar linea a linea, en la configuración del programador, en el botón New/Test, ahí puedes ir poniendo cada linea alta/baja e ir midiendo tensiones a ver si están correctas, también puedes cambiar las lineas del puerto paralelo que corresponde a cada linea del programador en caso de que la configuración que trae Piklab no corresponda con la de tu programador.


Saludos

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Re: Ayuda PWM PIC16F877A

Mensaje por martincruz el Dom 29 Mayo 2011 - 0:59

Si estuve viendo de hacer eso del new test, pero no cambia nada, parece estar muerto.... el propic2 dos tiene luces que indican si hay comunicación, pero nada.... parece que no esta haciendo nada el propic, por las dudas me voy a poner a medir con el tester... pero la verdad ya me estoy resignando... no! Hasta que no lo haga andar tengo que seguir jajaj. Gracias por la respuesta.

martincruz
Nuevo Usuario
Nuevo Usuario

Mensajes : 6
Fecha de inscripción : 27/05/2011

Volver arriba Ir abajo

Re: Ayuda PWM PIC16F877A

Mensaje por tony8a87 el Dom 29 Mayo 2011 - 3:25

martincruz escribió:Si estuve viendo de hacer eso del new test, pero no cambia nada, parece estar muerto.... el propic2 dos tiene luces que indican si hay comunicación, pero nada.... parece que no esta haciendo nada el propic, por las dudas me voy a poner a medir con el tester... pero la verdad ya me estoy resignando... no! Hasta que no lo haga andar tengo que seguir jajaj. Gracias por la respuesta.

Saludos te sugiero revisar el siguiente link, se trata de realizar tu propio programador usb hardware libre, tiene versión para linux, yo tengo compre un ensamble mexicano y me ha funcionado muy bien. Con respecto al pwm el preescaler es parte de una formula para realizar el ancho de pulso. He estado algo detenido con los pics de momento también mi intención es ocupar un pwm variable.

http://usbpicprog.org/?page_id=193
http://sourceforge.net/projects/usbpicprog/files/usbpicprog-hardware/usbpicprog-0.3.2-hardware/

Saludos cordiales!!!
avatar
tony8a87
Participante Activo
Participante Activo

Mensajes : 34
Fecha de inscripción : 10/08/2010

Volver arriba Ir abajo

Re: Ayuda PWM PIC16F877A

Mensaje por martincruz el Dom 29 Mayo 2011 - 4:27

Muchas gracias por responder. Con respecto al preescaler, ya lo entendí Wink El programador USB del link se ve muy bonito y el software también. En un futuro lo armaré, pero hoy por hoy quisiera hacer andar este propic2 es una lástima que lo reemplace, con el poco funcionamiento que tiene.... y puede programar una gran variedad de pics, y solo por un proiblema de configuración no quisiera cambiarlo todavía muchas gracias saludos

martincruz
Nuevo Usuario
Nuevo Usuario

Mensajes : 6
Fecha de inscripción : 27/05/2011

Volver arriba Ir abajo

Re: Ayuda PWM PIC16F877A

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.