Source: https://controlautomaticoeducacion.com/microcontroladores-pic/pwm-modulacion-por-ancho-de-pulso/
Timestamp: 2019-04-24 17:58:33+00:00

Document:
▷ PWM PIC - Modulación por Ancho de Pulso - Fácil
Hola controleros y controleras, en esta entrada aprenderemos a usar el PWM con PIC (Modulación por Ancho de Pulso), la cual es una de las señales más utilizadas para realizar control con nuestros microcontroladores. Con lo que vamos a ver aqui aprenderás a configurar las velocidades del PWM PIC y al final del post te dejaré un código de implementación de ejemplo que puedes usarlo en cualquier microcontrolador PIC que tu uses. El código se encuentra en PIC C Compiler.
1 PWM PIC
2 MODULO CCP EN C PARA PWM – Modulación por Ancho de Pulso
3 Como uso estas instrucciones?
4 Ejemplo 1 del uso del PWM – Modulación por Ancho de Pulso
5 Ejemplo 2 del uso del PWM – Modulación por Ancho de Pulso
6 Código de Implementación del PWM – Modulación por Ancho de Pulso
7 Código – PWM PIC C Compiler:
El módulo PWM (Pulse Width Modulation), permite obtener de los pines CCP1 (Pin 17) y CCP2 (Pin 16) una señal periódica (Es decir que se repite en el tiempo) la cual podemos modificar su ciclo de trabajo (Duty Cycle en ingles). Dicho PWM o Modulación por Ancho de Pulso, puede tener una resolución máxima de 10 BITS. En otras palabras. Como sabemos que el PIC trabaja con voltajes binarios (0V o +5V), podemos configurar el PWM para que trabaje un determinado tiempo en +5V (Ton) frente al tiempo que está en nivel bajo 0V (Toff), tal y como lo podemos apreciar en la siguiente figura.
MODULO CCP EN C PARA PWM – Modulación por Ancho de Pulso
Prescaler determina el tiempo de interrupción. El Postcaler sólo dice cuántas veces el Timer2 tiene que desbordarse para llamar a la interrupción.
Por ejemplo, si se determina con el Prescaler y el Periodo del Timer2 un tiempo de 1s para el desbordamiento pero se quieren 2s, entonces se coloca el Postcaler en 2.
Para generar una señal de Modulación por Ancho de Pulso con el PIC, tenemos que utilizar el TIMER 2, el cual es un Timer de 8 Bits.
Internamente el PIC, usa el TIMER 2 como base de tiempo para la Modulación por Ancho de Pulso (PWM) utilizando el módulo CCP.
Ahora vamos a calcular la Resolución que vamos a usar en nuestro PWM. Para eso, sabemos que la máxima resolución del PWM es 10 bits o 1024 bytes. Si observamos la ecuación de frecuencia del PWM
en su denominador los dos parámetros
hacen referencia a la resolución que se puede alcanzar con el PWM, note que si la carga del timer2 fuera su valor máximo (255) el resultado de esa operación nos daría 1024 (
). Entonces para saber cuantos bits tenemos en una señal PWM a la frecuencia que nosotros deseamos, podriamos representar ese termino como
, donde n es el numero de bits que como máximo sería 10 bits.
Ejemplo 1 del uso del PWM – Modulación por Ancho de Pulso
Ejemplo 2 del uso del PWM – Modulación por Ancho de Pulso
Código de Implementación del PWM – Modulación por Ancho de Pulso
Existen muchos procesos electrónicos o industriales donde necesitamos controlar la velocidad de un Motor DC. Una manera simple de lograr este objetivo es utilizar un control por PWM. Para esto vamos a diseñar el siguiente circuito y el código del microcontrolador por medio del compilador CCS C con el fin de poder regular la velocidad de un Motor DC por medio de un potenciometro conectado al Terminal RA0 (Para esto sera necesario utilizar el concepto de conversión análogo digital visto en el Post anterior).
En el post de interrupciones PIC encontrarás una mejora de esta práctica donde además de regular la velocidad del motor, se mide la velocidad del mismo a través de un encoder. (Click aqui para ir al post de Interrupciones PIC).
Conseguir Componentes en AMAERICA Conseguir Componentes en Europa
👉 Microcontrolador PIC
👉 Motor DC
👉 MOSFET 👉 Microcontrolador PIC
👉 MOSFET
Código – PWM PIC C Compiler:
A continuación se presenta el código de uso del PWM PIC (Modulación por Ancho de Pulso) para que lo copies y lo pegues en tu compilador y puedas reproducirlo. Recuerda que para ver el código debes compartir o darle me gusta al contenido de este post para que más personas se beneficien de esta información.
El ejemplo esta en PWM PIC16f887, sin embargo te muestro como usar el programa PWM PIC 16F877A e incluso como usar el programa en el PIC18F4550. En conclusión te sirve para cualquier PIC.
Si desean utilizar el PWM PIC 18F4550 CCS o cualquier otro de la familia 18, debes cambiar el encabezado por:
Si desean utilizar el PWM PIC 16F877A o cualquier otro de la familia 16, debes cambiar el encabezado por:
Tags: ancho por modulacion de pulso, configurar pwm en PIC, control de velocidad de motor dc, Moculación por Ancho de Pulso, pic16f887, PWM, PWM CCS C, PWM PICC
Siguiente entradaComunicación Serial con PIC
tengo una duda si se quiere hacer el uso de los dos pines ccp pero quiero configurarlos con frecuencias distintas que es los que puedo hacer, también uso el timer 2 pero lo configuro para que trabaje de formas distintas cada vez que se tenga que utilizar o se utiliza otro timer o que es lo que se hace si ademas de ello las frecuencias siempre quiero que sean continuas y no se vean afectadas una u otra por la configuracion del timer 2
Hola Diego, para trabajar con dos frecuencias diferentes deberás emplear dos timers diferentes, y no todos los chips soportan ese tipo de aplicación por ejemplo el pic18f8722 permite hacer eso que pretendes. Siempre toca mirar primero en el datasheet porque varios pics traen diferentes TIMERs, sin embargo muchas veces esos timers no estan directamente relacionados con el modulo CCP, entonces no sirven para ese objetivo.
voy a estudiar el codigo, despues comparto experiencia
Hola, estoy haciendo un proyecto, el cual tengo que controlar dos servomotores que simulan una antena parabólica. Utilizo el micro-controlador 18F4550, y el CCS C Compiler. El problema es que el timer 2 de este micro es de 8 bits y no consigo que sea preciso. Me gustaría saber si hay algún método parecido al del ADC utilizando 10 bits o mas pero sin utilizar potenciometros. Muchas gracias por tu tiempo.
Hola David, no entendi tu pregunta. En el post estamos usando un PIC16f887 donde el tiemer 2 también es de 8 bits. El 18F4550 es muy parecido, solo que es más poderoso, con más memoria y ambos tienen el conversor ADC de 10 bits. No entiendo tu pregunta de los potenciometros. En el ADC debe llegar un voltaje con valores entre 0 y 5 VDC independiente de donde vengan, pueden venir de un sensor, una fuente, algún circuito, un potenciometro, etc.
Hola Sergio, lo que necesito es algun metodo para acortar la diferencia entre dos “ticks”. Es decir, con los 8 bits del T2, que serian 255 ticks como maximo, la diferencia de un tick a otro en un servomotor es mas de 1º. Necesito aumentar la carga del timer para poder ganar mas precisión. En el ejemplo , dices que “donde si valor vale 0, tendre un ciclo de trabajo del 0%, si valor vale 1000, tendré un ciclo de trabajo de 100%, si valor vale 500, tendré un ciclo de trabajo de 50%”. El problema es que la señal solo me funciona en el rango de 0 a 255.
solo que esa señal de 0 a 1000 solo es valida para generar un pwm de 1khz, con un cristal de 4000MHz y un preescaler de 4 para que nuestra resolución llegue a 1000. Si observas el ejemplo 2, se desea tener una frecuencia mayor de 4Khz, aqui cambiamos el prescaler para 16, y con lo cual nuestra resolución máxima nos dio 63. Por lo que la señal solo funciona en el rango de 0 a 63. Es decir si valor vale 0, tendre un ciclo de trabajo del 0%, si valor vale 63, tendré un ciclo de trabajo de 100%, si valor vale 32, tendré un ciclo de trabajo de 50%
Hola, que tendria q cambiar para controlar el duty por teclado matricial y no por potenciometro
Edisson puedes ver la entrada de teclado matricial click aqui, tomar el numero que digitaste en el teclado, validando que sea de 0 a 1000, convirtiendo aquel numero de caracter a double, y colocandolo en la variable duty del PWM. Saludos.
John Leni Mancheno Freire
De antemano excelente explicación Muchas gracias por la colaboración de estos cursos
Un saludo especial amigo Sergio C, tengo que realizar un proyecto de Universidad para el control de una caminadora con 4 pulsadores, que al seleccionar el pulsador1 arranque con un 25 %, al seleccionar pulsador 2 suba al 50%, 3 al 75% y 4 al 100%, con encoder para calcular la velocidad del motor y se refleje en pantalla, si me puedes ayudar te estaré colaborando por paypal, mi correo es [email protected]
Hola John, con lo que hemos visto acá en la pagina se puede hacer ese proyecto que requieres. Saludos y muchos éxitos.
Hola Sergio que tal, te envío un cordial saludo y agradecerte por la valiosa información que nos compartes.
quiero hacerte una pregunta: ¿cual sería la lógica para programar una secuencia con pulsadores, es decir, con un P/B1 activo una salida cualquiera, con otro P/B2 activo otra salida y así sucesivamente; y si vuelvo a presionar cualquier P/B se desactiva la salida correspondiente.
Hola Samuel, para hacer ese proyecto, basta con usar los comandos que vimos en las primeras entradas del curso, te dejo el link con todo el curso:
Ingresa al post numero 2, Alli aprenderás como preguntar por una entrada (pulsadores) y para activar y desactivar usaria el comando output_toggle(pin_x); el cual puedes ver como funciona entrando al post numero 3.
Es solo clickar en cada imagen. Saludos.

References: resolución 
 Resolución 
 resolución 
 resolución 
 resolución 
 resolución