TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: vlad67 en 06 de Mayo de 2004, 15:03:00
-
Hola.. amigos...
Estor realizando un microbot.. y empecé generando la señal pwm para controlar los servos .. generando por decirlo de una manera "Manualmente la señal PWM".. me gustaría ke me ayudaran.. con algún ejemplo sencillo para utilzar los modulos PWM del 16F877... para generar dichas sañales...
Gracias
-
En la página http:/www.microcontroladores.com en la seccion de donwload hay unos cursos practicos donde bien ejemplos de utilizacion de PWM
F.
-
Hola:
El programa del fichero adjunto genera una señal PWM de 10 kHz con un duty de 0"5 inicialmente.
Posteriormente, y conforme se acciona el pulsador conectado en RA0, la fecuencia aumenta o disminuye segun la pulsacion sea par o impar; es decir, se pulsa la primera vez y la frecuencia aumenta. Se pulsa una segunda vez y disminuye y asi sucesivamente.
Espero que te sirva de ayuda. Si tienes alguna duda, comentala en el foro.
Salu2.
-
Hola de nuevo.
Se ha producido un error. No he podido enviar al foro el fichero adjunto con el programa. Intento copiarlo en el cuerpo de este mensaje. Espero que se entienda.
Saludos.
#include "16F877.h"
#use delay (clock=3500000)
#use fast_io(C)
#fusesRC,NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT
#bit RA0 = 0x05.0
main()
{
long int duty; // Definimos dos variables
int periodo;
periodo=86; // La frecuencia deben ser 10kHz.
duty=175; // A esto, le corresponde un periodo de 100us.
// Cargaremos 86 ya que:T = (PR2+1).4.(1/3"5MHz).1
// Definimos el valor del ciclo de trabajo.
// Consideando inicialmente un periodo de 100us, el
// duty deberian ser 50us para mantener la relacion
// pedida.
// 0"5us=(CCPRxL:CCPxCON<5:4>)*Tosc*Prescaler
// Fijando en CCPxCON<5:4> el valor 00 (CCP_PWM)
// resulta un valor en CCPRxL = 175.
setup_timer_2(T2_DIV_BY_1,periodo,1); // Configuramos timer2
setup_ccp1(CCP_PWM); // Configuramos CCP para modo PWM
set_pwm1_duty(duty); // Definimos el duty de la señal PWM
//como el valor de la variable duty
set_tris_c(0b11111011); // Configuramos PORTC
while (TRUE) /* Bucle continuo de ejecuccion */
{
while (RA0); // Espera a que se pulse la tecla
delay_ms(20); // Espera para evitar rebotes
do
{
if(periodo<255) // Comprobamos que el periodo no tiene ya su
// valor maximo
{
periodo=periodo+5; // Incrementamos "periodo" en 5
//unidades. (Podriamos incrementarlo en n)
// Se demuestra que un incremento en 5
//unidades en periodo supone un
// incremento en 10 unidades en duty
// para mantener la relacion.
duty=duty+10; // Redefinimos el duty
setup_timer_2(T2_DIV_BY_1,periodo,1); //Reconfiguramos el
// timer2
set_pwm1_duty(duty); // Reconfiguramos el duty del PWM
delay_ms(50); // Esperamos 50 ms antes de incrementar
}
while (!RA0);
while (RA0); // Espera otra pulsación de la tecla
delay_ms(20); // Esperamos para evitar rebotes
do
{
if(periodo>0) // Comprobamos que el periodo no
// tiene su valor mínimo
{
periodo=periodo-5; // Decrementamos el periodo
duty=duty-10; // Redefinimos el duty
setup_timer_2(T2_DIV_BY_1,periodo,1);
// Reconfiguramos el timer2
set_pwm1_duty(duty); // Reconfiguramos el duty
// del PWM
delay_ms(50); // Esperamos 50 ms antes de
// incrementar
}
}
while (!RA0);
} /* Fin bucle infinuto */
} /* Fin de main */