TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: vlad67 en 06 de Mayo de 2004, 15:03:00

Título: Ayuda.. PWM...
Publicado 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
Título: RE: Ayuda.. PWM...
Publicado por: Fer_TACA en 06 de Mayo de 2004, 15:57:00
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.
Título: RE: Ayuda.. PWM...
Publicado por: Mon_ en 06 de Mayo de 2004, 18:23:00
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.
Título: RE: Ayuda.. PWM...
Publicado por: Mon_ en 06 de Mayo de 2004, 18:36:00
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 */