Autor Tema: PWM y L293  (Leído 8566 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
PWM y L293
« en: 30 de Marzo de 2008, 06:36:37 »
Buenas,

Antes de postear me he querido leer todo lo referido al PWM, y he de decir que no ha aclarado mis dudas, nunca he usado éste módulo, se la teoría del PWM, pero no consigo entender el funcionamiento en el PIC ni leyendo el datasheet, ni mirando por el foro, como controlo la velocidad desde el máximo (la salida PWM todo el tiempo a 5v si se puede) hasta un mínimo, que sea distinto de 0v, pero que sea una velocidad muy baja (aun por definir), se que tengo que conectar las CCP1 Y CCP2 a los correspondientes enable del L293 para controlar mis dos motores DC, pero no paso de ahí, no entiendo que dice del TMR2 para usar el PWM, si alguien es tan amable de explicarmelo haber si consigo entenderlo...

Muchas gracias!

Desconectado fjalex

  • PIC18
  • ****
  • Mensajes: 405
    • Proteus - Hubor
Re: PWM y L293
« Respuesta #1 en: 30 de Marzo de 2008, 08:34:53 »
Estimado superprp:

No me extraña tus dificultades. Yo tamibén tardé en entenderlo. Voy a tratar de explicarte los pasos a seguir para generar una salida pwm.

1.- Fijar el periodo (recuerda la inversa de la frecuencia) de la salida PWM. Para ello se utiliza el registro T2CON y el registro PR2. La frecuencia va a estar en función del reloj utilizado (por ejemplo 16MHZ), del preescalar que selecciones en T2CON (admite 1, 4 y 16) y del valor que asignemos a PR2 según la siguiente fórmula:

PWM PERIODO = [ (PR2 + 1) * 4 * Tosc *  (preescalar seleccionado en T2CON)

Ejemplo: reloj 16MHZ --> frecuencia de pwm = 972Hz --> periodo = 1.028mseg.
T2CON = 0b10000011   //* pre-escalar = 16.
PR2 = 0xFF;


2.- Selecconar el tiempo que va a estar alto el PWM (duty cycle). Para ello se utiliza el registro CCPR1L y dos bits el 0 y el 1 del registro CCP1CON.

Ejemplo: 100% del ciclo alto:
CCP1RL =  0b11111111
CCP1CONbits.DC1B1 = 1;
CCP1CONbits.DC1B0 = 1;
Ejemplo: 50% del ciclo alto:
CCP1RL =  0b10000000
CCP1CONbits.DC1B1 = 0;
CCP1CONbits.DC1B0 = 0;
Ejemplo: 0% del ciclo alto:
CCP1RL =  0b00000000
CCP1CONbits.DC1B1 = 0;
CCP1CONbits.DC1B0 = 0;

3.-Seleccionar el pin como salida.
TRISCbits.TRISC2 = 0;

Y ya tienes tu PWM. Espero que te haya ayudado.


Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: PWM y L293
« Respuesta #2 en: 30 de Marzo de 2008, 09:30:25 »
y el registro CCP1RH para que se usa????

Desconectado fjalex

  • PIC18
  • ****
  • Mensajes: 405
    • Proteus - Hubor
Re: PWM y L293
« Respuesta #3 en: 31 de Marzo de 2008, 09:53:35 »
El registro CCP1RH en modo PWM es de solo lectura.

Literalmente en el manual dice:

The CCPRxH register and a 2-bit internal latch are used to double-buffer the PWM duty cycle. This double-buffering is essential for glitchless PWM
operation.

En versión muy libre y de quien no lo ha entendido a fondo (:D :D) , significa que lo utiliza internamente para vigilar de posibles fallos en las operaciones PWM.

Yo no lo he usado nunca y mi salida PWM funcionó correctamente.

Un saludo.


Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: PWM y L293
« Respuesta #4 en: 31 de Marzo de 2008, 11:21:53 »
Segun tengo entendido yo, el registro "doble" ese se usa para que si cambiamos el duty PWM mientras éste esta en marcha, aguante al menos un ciclo con el duty anterior, y empiece en el siguiente con el duty establecido. Porque al final, el PWM funciona en base a un timer dado, y si cambiamos el duty a un valor y el timer justo entonces equivale al valor que hemos introducido, cambiará de estado el PWM, y tendremos una onda de duty "falso" durante ese ciclo PWM.

salu2

Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: PWM y L293
« Respuesta #5 en: 22 de Abril de 2008, 13:51:00 »
¿en que afecta la frecuencia que le pongas al PWM? lo que importa es el duty (para controlar la velocidad de los motores) que es lo que hace que esté mas tiempo alimentado o menos y con ello más o menos velocidad, no? que mas dará la frecuencia a la que configurar el PWM? como puedo calcular la frecuencia máxima del pwm que puedo ponerle? cual es la mejor frecuencia?

Desconectado manex_1987

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1127
Re: PWM y L293
« Respuesta #6 en: 22 de Abril de 2008, 14:55:45 »
El funcionamiento del PWM viene estrictamente ligado a un timer. Para definir la frecuencia PWM, se configura el periodo y el prescaler del timer.

Asi, un ciclo entero PWM estara enmarcado dentro del periodo que hemos definido. Luego, ajustando el duty, estamos definiendo un "sub-periodo" dentro de ese periodo, que definirá cuando debe cambiar de estado el pin.

Por ejemplo, si ajustamos el periodo del timer en "100" y el duty a la mitad, tendriamos:
0...50 BAJO
50..100 ALTO

El problema de poner una frecuencia PWM alta es, que necesitamos un prescaler bajo y periodos del timer bajos (para que el ciclo pwm sea lo mas bajo posible). Ello hace, que a la hora de definir el duty, tengamos menos resolucion, osea menos "estados posibles" para nuestro PWM.

Si la frecuencia de nuestro PWM es tan alta que un periodo entero es definido en 8 pasos de timer, solo dispondremos de 8 estados posibles para el PWM. Y eso son 3 bits de resolucion.

Aun asi, mira el datasheet de tu PIC, o su family reference manual, pues ahi tendras informacion muy detallada, con formulas incluidas.

espero haberme explicado bien...


Desconectado superprp

  • PIC16
  • ***
  • Mensajes: 137
Re: PWM y L293
« Respuesta #7 en: 22 de Abril de 2008, 15:11:57 »
Perfectamente, entonces es como suponía, y lo malo de poner una frecuencia baja es que al ser los cambios de estado cada más tiempo se nota en el motor como perchones, cambios bruscos de velocidad, no? sacrificar resolución por ruido en la señal de salida... no?

¿que sucede si pongo 0 en PR2??? o 1 y el duty al 50%? para donde redondea?