TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micro_pepe en 22 de Julio de 2006, 16:06:10
-
Hola, estoy haciendo un programa de prueva que genere dos señales PWM, pero no consigo un ciclo del 100%.
El retardo simula las instrucciones que formarian el resto del programa.
# include <16F876a.h>
# use delay(clock=4000000)
# fuses HS,NOWDT,NOPUT,PROTECT,NODEBUG,NOBROWNOUT,NOLVP,CPD
# USE FAST_IO(A)
# USE FAST_IO(B)
# USE FAST_IO(C)
long var1, var2;
void main(){
Setup_Timer_2(T2_DIV_BY_1,124,2);
Setup_CCP1(CCP_PWM);
Setup_CCP2(CCP_PWM);
var1=100;
var2=1023;
While(1){
Set_PWM1_Duty(var1);
Set_PWM2_Duty(var2);
delay_ms(100);
}
}
Saludos y gracias.
-
Por que no sacas los set_pwm fuera del bucle while. Si no cambias los ciclos sacalo fuera.
Un saludo
-
Hola, hace exactamente lo mismo. ¿No será el proteus? estoy usando la version 6.7
Saludos y gracias.
-
Puedes poner una imagen del osciloscopio con los PWM's
Saludos
-
Hola, esta es la imagen:
(http://img161.imageshack.us/img161/7572/dibujoef0.gif)
la señal de arriba es la pwm1 y la de abajo es la pwm2
Saludos y gracias.
-
Ahora mismo no tengo delante el CCS pero parece ser que no esta definido el PWM a 10 bits.
Un saludo
-
te cuento lo que me paso a mi: estuve probando con diferentes tipos de variables y opte por usar int8 con el valor de periodo de 255 en el timer2
lo que hace es esto : en el modulo de la variable , el 0 representa 0 de duty y el 255 el 100 del duty . tiene que llegar. Si usas 124 en el timer 2 ese va a ser tu 100 %.
otro dato : cuidado con el oosciloscopio ya que yo tengo uno ( real ) y para algunas frecuencias no puedo visualizar la totalidad de la variacion del duty sin retocar el triger ( o no veo parte del duty bajo o no veo parte del alto)
otra cosa que podes hacer es probar con distintos valores del duty y de periodo del timer 2 pero sin usar variables, cargale numeros al valor del duty y fijate que hace. pero despues tenes que adaptar esos valores a los lacances de la variable.
-
Hola, asunto solucionado, he probado a poner esto: Setup_Timer_2(T2_DIV_BY_1,255,1);
y puedo regular el duti-cicle del 0 al 100% con una variable de tipo int16.
Gracias por vuestra ayuda.