TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: migsantiago en 04 de Junio de 2005, 07:04:00
-
Salu2
Necesito un poco de ayuda para encontrar el error en mi programa.
Uso cristal de 1.25MHz, un PIC16F877A.
setup_timer_2(T2_DIV_BY_16,255,1); //PR2 = 255
Prescaler = 16, PR2 = 255 y Postscaler = 1.
El periodo me da de 13ms...
T=(255+1)4.(1/1.25MHz)(16)=13.1ms
Hasta ahí vamos bien...
Pero cuando escribo el valor de DUTY, el PWM saca otro tiempo...
setup_ccp1(CCP_PWM); //PWM
set_pwm1_duty(0x7e); //126d
//D=(CCP...)(Tosc)(PRStm2)
//D=(0x7e)(1/1.25MHz)(16)=1.616ms
Pero en vez de que 0x7e me saque 1.6ms, me saca 6.25ms.
Y luego con...
set_pwm1_duty(0xc8); //200d
//D=(0xc8)(1/1.25MHz)(16)=2.5ms
No saca 2.5ms, saca 10.5ms.
Y luego con...
set_pwm1_duty(0x113); //275d
//D=(0x113)(1/1.25MHz)(16)=3.52ms
No saca eso, saca 3.75ms.
No sé porque haga eso, seguí las fórmulas bien, incluso el periodo si es el correcto... creo que es error de novato pero no lo hallo... porfas chequen mi mini programa...
Todas las mediciones las emule en PROTEUS.
------------------------
#include "16f877.h"
#use delay(clock=1250000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
#use fast_io (c)
#use fast_io (b)
void main (void)
{
set_tris_c (0x00); //Todo salida
set_tris_b (0xff); //todo entrada
setup_timer_2(T2_DIV_BY_16,255,1); //PR2 = 255
//T=(PR2+1)4.Tosc.PRStm2
//T=(255+1)4.(1/1.25MHz)(16)=13.1ms
setup_ccp1(CCP_PWM); //PWM
while(1)
{
set_pwm1_duty(0x7e); //126d
//D=(CCP...)(Tosc)(PRStm2)
//D=(0x7e)(1/1.25MHz)(16)=1.616ms
delay_ms(5000); //Espera giro
set_pwm1_duty(0xc8); //200d
//D=(0xc8)(1/1.25MHz)(16)=2.5ms
delay_ms(5000); //Espera giro
set_pwm1_duty(0x113); //275d
//D=(0x113)(1/1.25MHz)(16)=3.52ms
delay_ms(5000); //Espera giro
}
}
-
Hola Mig.
Te salen esos números porque en las fórmulas estas considerando el Duty como long, y hay que decirselo al programa.
Prueba con:
long duty_PWM1=126;
set_pwm1_duty(duty_PWM1);
... y te saldran los números correctos.
Así mismo prueba con:
int duty_PWM1=126;
set_pwm1_duty(duty_PWM1);
... y te saldran los otros números.
Un saludo
-
Muchas Gracias POCHER

Vaya error de novato jajaja