tutoriales pic_ modulación pwm (pulse width modulation)

14
11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation) picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 1/14 Fundamentos de microcontroladores aplicados a la familia PIC de Microchip. Proyectos y Aplicaciones. Tutoriales PIC Seleccionar idioma Con la tecnología de Traductor de Google MIÉRCOLES, 27 DE JUNIO DE 2012 Modulación PWM (Pulse Width Modulation) Nuestro controlador (digital) eventualmente tendrá que interactuar con el mundo exterior (analógico). Al margen de usar dispositivos externos (convertidor digital analógico o DAC) muchos microcontroladores cuentan con un módulo PWM (Pulse Width Modulation) que puede usarse (con ciertas limitaciones) para mandar "ordenes" analógicas. En este tutorial describiremos en que consiste la modulación por ancho de pulsos (PWM), veremos las rutinas disponibles en C18 y, como hacemos habitualmente, describiremos los registros asociados y su funcionalidad. Aprovecharemos los conocimientos adquiridos para escribir una rutina para inicializar el módulo PWM especificando la frecuencia deseada y escribiremos un pequeño programa para usar los dos módulos PWM de un PIC para crear transiciones de colores en un LED bicolor. En una entrada posterior aplicaremos lo que hemos aprendido a una aplicación más interesante usando el módulo PWM como conversor DAC para un archivo de audio. Archivos de código asociados a esta entrada: pwm1.c y pwm2.c -------------------------------------------------------------------------------------------- Descripción de la modulación por ancho de pulso (PWM) En algunos de los tutoriales anteriores usábamos un truco para estimar la ocupación del PIC. Consistía en poner a 1 un cierto pin mientras estábamos haciendo una cierta tarea. Luego, nos bastaba con medir el voltaje medio (con un voltímetro) en dicho pin. Dicho voltaje (dividido por los 5V de alimentación) nos daba el % del tiempo que el pin estaba alto. La modulación PWM consiste precisamente en eso. El módulo PWM del micro genera una onda cuadrada con una frecuencia dada (típicamente bastante alta, por ejemplo 10 KHz). Luego nosotros podemos ir cambiando el ciclo de trabajo (% del periodo en ON) de la señal: Si usamos un dispositivo externo con un ancho de banda suficiente (p.e. un osciloscopio) veremos la señal al completo, esto es, la modulación rápida (o portadora) de 10 KHz y las variaciones más lentas (señal a transmitir) del ciclo de trabajo. Si por el contrario aplicamos un filtro paso-bajo a la señal PWM, los cambios rápidos (10 KHz) de la señal se eliminarán y simplemente veremos los cambios lentos del ciclo de trabajo, observando un voltaje "medio" entre 0 y 5V dependiendo del ciclo de trabajo (0% -> 100%) programado. No siempre es necesario implementar un filtro paso-bajo de forma explícita. Muchas veces usamos un dispositivo externo (voltímetro, motor, etc) con suficiente "inercia", de forma que no es capaz de seguir los cambios rápidos de la señal (los 10 KHz). Por así decirlo el dispositivo (motor, altavoz) lleva incorporado su propio filtro paso-bajo. 74,760 PÁGINAS VISTAS EN TOTAL Buscar SEARCH IN THIS BLOG Modulación PWM (Pulse Width Modulation) Conversor ADC Manejo de motores DC usando PWM Controlador PID para posición de un motor DC Comunicaciones puerto serie (UART) LO MÁS VISTO ESTE MES Audio con PWM Brújula electrónica Levitador magnético Medidor de potencia Monitor pulso cardíaco PROYECTOS: 2013 (16) 2012 (13) julio (3) junio (10) Aplicación: Audio con PW M Modulación PWM (Pulse Width Modulation) Decodificador de un mando a distancia Comunicaciones UART con paridad Comunicaciones UART con interrupciones Comunicaciones puerto serie (UART) Uso de temporizadores (timers) Niveles de prioridad en interrupciones Interrupciones (conceptos básicos) Introducción al BLOG ARCHIVO DEL BLOG

Upload: gabriel-ramirez

Post on 23-Oct-2015

279 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 1/14

Fundamentos de microcontroladores aplicados a la familia PIC de Microchip. Proyectos y Aplicaciones.

Tutoriales PIC

Seleccionar idioma

Con la tecnología de Traductor de Google

MIÉRCOLES, 27 DE JUNIO DE 2012

Modulación PWM (Pulse Width Modulation)

Nuestro controlador (digital) eventualmente tendrá que interactuar con el mundo exterior (analógico). Al

margen de usar dispositivos externos (convertidor digital analógico o DAC) muchos microcontroladores

cuentan con un módulo PWM (Pulse Width Modulation) que puede usarse (con ciertas limitaciones) para

mandar "ordenes" analógicas.

En este tutorial describiremos en que consiste la modulación por ancho de pulsos (PWM), veremos las

rutinas disponibles en C18 y, como hacemos habitualmente, describiremos los registros asociados y su

funcionalidad.

Aprovecharemos los conocimientos adquiridos para escribir una rutina para inicializar el módulo PWM

especificando la frecuencia deseada y escribiremos un pequeño programa para usar los dos módulos

PWM de un PIC para crear transiciones de colores en un LED bicolor.

En una entrada posterior aplicaremos lo que hemos aprendido a una aplicación más interesante usando el

módulo PWM como conversor DAC para un archivo de audio.

Archivos de código asociados a esta entrada: pwm1.c y pwm2.c

--------------------------------------------------------------------------------------------

Descripción de la modulación por ancho de pulso (PWM)

En algunos de los tutoriales anteriores usábamos un truco para estimar la ocupación del PIC. Consistía en

poner a 1 un cierto pin mientras estábamos haciendo una cierta tarea. Luego, nos bastaba con medir el

voltaje medio (con un voltímetro) en dicho pin. Dicho voltaje (dividido por los 5V de alimentación) nos

daba el % del tiempo que el pin estaba alto.

La modulación PWM consiste precisamente en eso. El módulo PWM del micro genera una onda cuadrada

con una frecuencia dada (típicamente bastante alta, por ejemplo 10 KHz). Luego nosotros podemos ir

cambiando el ciclo de trabajo (% del periodo en ON) de la señal:

Si usamos un dispositivo externo con un ancho de banda suficiente (p.e. un osciloscopio) veremos la

señal al completo, esto es, la modulación rápida (o portadora) de 10 KHz y las variaciones más lentas

(señal a transmitir) del ciclo de trabajo.

Si por el contrario aplicamos un filtro paso-bajo a la señal PWM, los cambios rápidos (10 KHz) de la señal

se eliminarán y simplemente veremos los cambios lentos del ciclo de trabajo, observando un voltaje

"medio" entre 0 y 5V dependiendo del ciclo de trabajo (0% -> 100%) programado.

No siempre es necesario implementar un filtro paso-bajo de forma explícita. Muchas veces usamos un

dispositivo externo (voltímetro, motor, etc) con suficiente "inercia", de forma que no es capaz de seguir

los cambios rápidos de la señal (los 10 KHz). Por así decirlo el dispositivo (motor, altavoz) lleva

incorporado su propio filtro paso-bajo.

74,760

PÁGINAS VISTAS EN TOTAL

Buscar

SEARCH IN THIS BLOG

Modulación PWM (PulseWidth Modulation)

Conversor ADC

Manejo de motores DCusando PWM

Controlador PID paraposición de un motor DC

Comunicaciones puertoserie (UART)

LO MÁS VISTO ESTE MES

Audio con PWM

Brújula electrónica

Levitador magnético

Medidor de potencia

Monitor pulso cardíaco

PROYECTOS:

► 2013 (16)

▼ 2012 (13)

► julio (3)

▼ junio (10)

Aplicación: Audio conPWM

Modulación PWM(Pulse WidthModulation)

Decodificador de unmando a distancia

Comunicaciones UARTcon paridad

Comunicaciones UARTcon interrupciones

Comunicacionespuerto serie (UART)

Uso detemporizadores(timers)

Niveles de prioridad eninterrupciones

Interrupciones(conceptos básicos)

Introducción al BLOG

ARCHIVO DEL BLOG

Page 2: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 2/14

Lo que hemos conseguido es una especie de conversor digital analógico que nos permite traducir una

orden digital (ciclo de trabajo del periodo PWM) en una variable analógica (el voltaje medio a la salida

entre 0 y 5V).

Obviamente tendremos algunas limitaciones. Como queremos que desaparezca la frecuencia de

modulación (los 10 KHz) de antes los cambios (frecuencia) de la señal que queremos transmitir deben

ser lo suficientemente lentos (frecuencia baja) para que no desaparezcan también en el filtrado paso-bajo

(explícito o implícito) de nuestro dispositivo.

El módulo(s) PWM de un PIC

El parámetro fundamental de una modulación PWM es la frecuencia (o su inverso el periodo) de

modulación. En los PIC dicha frecuencia es programable (con ciertas limitaciones) en base a varias

variables:

· La frecuencia del oscilador principal Fosc

· El pre-scaler (PRE) o divisor previo del timer TMR2 que puede tomar los valores 1:1, 1:4 o 1:16

· El registro PR2 (0-255) asociado al timer TMR2

La frecuencia PWM responde a la fórmula:

F_pwm = F_osc / [4 x PRE x (PR2+1)]

o lo que es lo mismo, el periodo del PWM será el inverso de dicha frecuencia:

T_pwm = [ (PR2+1) x 4 x PRE ] x Tosc

El valor máximo del divisor previo PRE es 16 y el de (PR2+1) es 256. Por lo tanto la frecuencia PWM más

baja posible será Fosc/16384. Para un oscilador de 20 MHz tenemos una Fpwm mínima de 1.22 KHz

(20000/16384).

Notad que el módulo PWM usa el timer TMR2, por lo que éste no podrá usarse como temporizador de

propósito general mientras se esté usando PWM. Si que es posible usarlo (y ahorrarnos gastar otro

timer) si queremos hacer saltar una interrupción cada cierto tiempo. El postscaler del TMR2 no tiene

efecto sobre la frecuencia PWM, pero si influye sobre cuando salta (si está habilitada) la correspondiente

interrupción (TMR2_flag). Si por ejemplo el post-scaler es 1:16 entonces la interrupción del TMR2 saltará

cada 16 periodos del PWM.

Lo primero que tenemos que hacer para usar el módulo PWM es habilitarlo indicando que va a usarse

como generador de una onda PWM, ya que dicho módulo es compartido con otras funciones

(Capture/Compare). La forma de hacerlo es poner a 11XX los 4 bits menos significativos del registro

CCP1CON. Los PIC18 suelen tener 2 módulos PWM por lo que existe un segundo registro CCP2CON.

Podemos habilitar uno o los dos módulos independientemente. Sin embargo, como ambos usan el

registro PR2 y el timer TMR0 como base de tiempos, la frecuencia programada será la misma en ambos

módulos.

Lo que si es posible variar por separado es el ciclo de trabajo (duty cicle o DC) de cada módulo. El ciclo

de trabajo se codifica con un número de hasta 10 bits (0-1023) almacenado de la siguiente forma:

CCPR1L : 8 bits más significativos del ciclo de trabajo.

CCP1CON.DC1B0 y DC1B1 (bits 5 y 6 de CCP1CON): Guardan los 2 bits menos significativos.

La programación del % ON del segundo módulo es similar pero usando los registros CCP2CON y CCPR2L.

Con los 10 bits dados el ciclo de trabajo se podrá especificar en principio con 1024 niveles (0

corresponde a 0% y 1023 al 100%). Sin embargo, los valores válidos pueden ser menores que los 1024

posibles.

La razón es que el valor de DC (duty_cicle) determina el tiempo que la señal se mantiene alta (ON) de la

forma:

T_on = [ DC x PRE] x Tosc

Recordando que el tiempo total del periodo es:

Antonio

Ver todo mi perfil

DATOS PERSONALES

Participar en este sitioGoogle Friend Connect

Miembros (18) Más »

¿Ya eres miembro? Iniciar sesión

SEGUIDORES

Page 3: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 3/14

T_pwm = [ (PR2+1) x 4 x PRE ] x Tosc

Comparando ambas fórmulas y siendo obvio que el tiempo total ON no puede exceder el tiempo total del

periodo tenemos que el valor máximo de DC es (PR2+1) x 4. Por lo tanto, aunque podemos dar a DC

cualquier valor entre 0 y 1023 está claro que en realidad debemos limitarnos al rango [ 0, (PR2+1)x4 ].

Valores más altos van a hacer que Ton > Tpwm, o lo que es lo mismo, la señal PWM se mantiene alta

todo el rato (100%).

En resumen, para mantener la máxima resolución (10 bits) a la hora de especificar DC es preciso usar

PR2=255. Para una cierta frecuencia del oscilador Fosc podemos optar por tres frecuencias con la

máxima resolución:

Registro

PR2

PRE (divisor previo de

TMR2)

F_pwm Para Fosc = 20

MHz

255 1 Fosc / 1024 19.75 KHz

255 4 Fosc / 4096 4.88 KHz

255 16 Fosc /

16384

1,22 KHz

Frecuencias por debajo de Fosc/16384 no son posibles porque los valores de PR2 y PRE están ya en su

máximo posible.

Frecuencias por encima de Fosc/1024 son posibles pero a costa de bajar PR2 y por lo tanto disponer de

menor resolución para el ciclo de trabajo. Por ejemplo si aceptamos trabajar con 8 bits (valores de DC de

0 a 255) podemos llegar a una frecuencia de:

F_pwm = F_osc / [PRE x 4 x (PR2+1)] = Fosc/(1 x 256) = 78 KHz

para un oscilador de 20 MHz.

La razón por la que para frecuencias muy altas no podemos especificar con tanta precisión el ciclo es que

el periodo empieza a hacerse muy pequeño. En el caso anterior (Fpwm = Fosc/256) es obvio que en un

ciclo del PWM sólo entran 256 ciclos del oscilador. Como es imposible que el micro haga algo entre ciclos

de reloj, está claro que sólo puede bajar la línea del PWM en 256 puntos como mucho (esto es, con una

resolución de 8 bits).

Valores de frecuencias intermedios son también posibles, pero de nuevo van a exigir PR2<255. Por

ejemplo para conseguir 10 KHz con un oscilador de 20 MHz

Fosc / Fpwm =20000/10 = 2000 = 4 x PRE x (PR2+1) -> PRE x (PR2+1) = 500

lo que puedo conseguir con PRE=2 y PR2 = 249. Pero entonces el valor del ciclo de trabajo (DC) tiene

que moverse en el rango 0 a 4(PR2+1) = 1000. Con DC=1000 ya alcanzamos un 100% del ciclo de

trabajo y valores superiores no tendrán ningún efecto extra.

En cuanto al pin de salida al que se manda la señal PWM, usualmente la salida PWM1 va al pin RC2 y la del

PWM2 al RC1 (notad el cambio 1-2). En algunos dispositivos (consultar datasheet) es posible cambiar la

salida de PWM2 a otro pin mediante un bit de configuración.

Las rutinas básicas del compilador C18 para manejar los módulos PWM son las siguientes (las

declaraciones se encuentran en pwm.h):

OpenPWM1(uint8 periodo) : habilita el módulo y hace PR2=periodo

SetDCPWM1(uint16 duty_cicle) : establece ciclo de trabajo 0% -> 100%

ClosePWM1(); : deshabilita modulo PWM

Notad que las rutinas anteriores no tocan el timer TMR2. Es responsabilidad del usuario invocar a la rutina

OpenTimer2 para fijar el valor del divisor o pre-scaler y arrancar el temporizador.

El siguiente programa (código en pwm1.c) pone en marcha ambos módulos y va variando el ciclo de

trabajo de PWM1 entre 0 y DC_max (valor máximo = 1023, correspondiente a un 100%).

Simultáneamente el ciclo de PWM2 se establece como el valor complementario. Tras los #include (no

olvidar añadir pwm.h, timer.h y delays.h) y los #pragma de configuración habituales el programa principal

es simplemente:

void main()

{

uint16 DC_max, dd=0;

Page 4: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 4/14

int8 inc=1;

DC_max=1023;

OpenPWM1(255); OpenPWM2(255); // Set PWM1 and PWM2 with PR2 = 255

OpenTimer2(TIMER_INT_OFF & T2_PS_1_1); // Starts TMR2 with 1:1 prescaler

while(1)

{

SetDCPWM1(dd); SetDCPWM2(DC_max-dd); // Set complementary DC in PWM1 and PWM2

dd+=inc; // Increase duty cicle

if ((dd==DC_max) || (dd==0)) inc=-inc; // If we get to DC_max or 0 reverse direction.

Delay10KTCYx(5);

}

}

Vemos que hemos usado PR2=255 y pre-scaler = 1. Esto nos da una frecuencia PWM de :

Fpwm = Fosc/(4 x 256 x1) = 20000 KHz / 1024 = 19.5 KHz

El siguiente video es una captura de pantalla del osciloscopio monitorizando PWM1 y PWM2. Se observa

que el periodo del PWM (unos 51 usec, correspondientes a 19.5 KHz) no cambia y es común a ambos

canales. El tiempo en ON de PWM1 (arriba) es justo el tiempo OFF del PWM2 (abajo) ya que los hemos

programado para ser complementarios: dd y (DC_max-dd)

Los saltos que se observan en las transiciones del duty_cicle son debidas a la frecuencia (baja) con la que

se refrescan en pantalla los datos del osciloscopio. En el osciloscopio se ve una variación gradual, como

corresponde a un incremente de 1 en 1 en el ciclo de trabajo.

Vamos a cambiar la frecuencia haciendo OpenPWM1(199);OpenPWM2(199); lo que corresponde a

(PR2+1)=200 y a una frecuencia de 20000/(4x200) = 25 KHz. En el siguiente video vemos la captura

del osciloscopio:

La frecuencia son justo los 25 KHz esperados. Sin embargo, se aprecia que algo va mal. Ahora ambos

canales no son complementarios. El canal PWM1 llega al 100% y permanece allí, no empezando a bajar

hasta después de un rato. El comportamiento de PWM1 y PWM2 no parece ser el que hemos

programado. La evolución del ciclo de trabajo antes describía la función de la izquierda (como

correspondía a nuestro programa), y ahora parece describir la de la derecha.

Page 5: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 5/14

La razón es que al haber bajado PR2 hemos subido la frecuencia (correcto) pero sin darnos cuenta

también hemos alterado el rango de valores posible para DC. El valor máximo para el que alcanzamos e

100% es de 4x(200) = 800. Al llegar dd a 800, la señal PWM alcanza un 100% y se mantiene mientras

dd sigue subiendo hasta 1023 y vuelve a bajar. Sólo cuando volvemos a entrar en el rango [0 800]

volvemos a notar variación.

En resumen, recordar que si PR2 no es 255 el valor máximo de DC no será 1024 sino DC_max = 4 x

(PR2+1).

Nuestras propias rutinas

Ahora que entendemos como funciona el módulo PWM y conocemos los registros involucrados, vamos a

escribir nuestras propias rutinas de manejo del PWM. En primer lugar las rutinas para ajustar el duty cicle:

void set_pwm1(uint16 duty)

{

CCP1CONbits.DC1B0=(duty& 0x01); duty>>=1; //Least Significant bit

CCP1CONbits.DC1B1=(duty& 0x01); duty>>=1; // 2nd Least Significant bit

CCPR1L=(duty); // 8 Most Significant bits

}

void set_pwm2(uint16 duty)

{

CCP2CONbits.DC2B0=(duty& 0x01); duty>>=1;

CCP2CONbits.DC2B1=(duty& 0x01); duty>>=1;

CCPR2L=(duty);

}

Vemos que sólo es cuestión de poner los 2 bits menos significativos del argumento en los bits DC1b0 y

DC1b1 de CCP1CON y los 8 más significativos en CCPR1L. Lo mismo para los registros CCP2CON y

CCPR2L para PWM2.

Obviamente, estas rutinas no aportan nada sobre las suministradas por C18, sólo nos permiten confirmar

que lo que se está haciendo no es nada complicado.

Veamos una rutina con algo de "valor añadido". Era un poco incomodo tener que acordarnos de

configurar y arrancar TMR2 por separado. Vamos a escribir una rutina que combine la configuración del

módulo y el arranque del timer TMR2. Además, en vez de aportar como argumentos los valores de PR2 y

del prescaler de TMR2 vamos a especificar la frecuencia Fpwm deseada (en KHz) y dejar que la rutina

calcule y configure los registros adecuados. Como siempre está rutina puede ser combinada con las del

C18. Podemos usar esta rutina para inicializar el módulo y luego usar las rutinas de C18 para fijar el ciclo

de trabajo. El código es el siguiente:

uint16 setup_PWM(uint16 Fosc, uint8 Fpwm, uint8 ch)

//Fosc -> F oscillator in KHz, Fpwm -> desired Fpwm in KHz

// ch -> configure channel 1 (1), 2 (2) or both (3)

// Returns max posible value of duty cicle

{

uint16 x, DC_max;

uint8 pre;

uint8 log2,pr2;

x = Fosc>>1; x=(x/Fpwm)+1; x>>=1; // Computes round((Fosc/4)/Fpwm)

if (x>16384) {pre=16; pr2=255;} // Requested Fpwm too low -> set Fpwm = Fosc/16384

else

{

pre=0;

while(x>256) {x>>=2; pre++;} // Find pr2 and pre so that (pr2+1)*pre=(Fosc/4)/Fpwm

pr2=(x-1); // pre 0,1,2 -> 1:1, 1:4, 1:16

Page 6: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 6/14

}

if (ch&1) { TRISCbits.TRISC2=0; CCPR1L=0; CCP1CON = 0b00001100; } // SET channel 1

if (ch&2) { TRISCbits.TRISC1=0; CCPR2L=0; CCP2CON = 0b00001100; } // Set channel 2

PR2=pr2;

T2CON = 0b00000100 | pre; // start TMR2 with prescaler pre and postscaler 1:1

// T2CON = 0b0 1111 1 00 ;

// | | | |

// | | | |_ Prescale: 00 (1) 01 (4) 1X(16)

// | | |____ TIMER2 on/off (1=on, 0=off)

// | |______ PostScaler: 1:(bbbb+1) 0000: 1:1 1111: 1:16

// |___________ Not used

DC_max = pr2; DX_max++; DC_max<<=2; // 4 x (PR2+1) // MAX value for Duty cicle

return DC_max;

}

La rutina recibe la frecuencia del oscilador y la frecuencia PWM deseada (ambas en KHz, uint16 para Fosc

y uint8 para Fpwm) y el canal PWM que deseamos inicializar (1 para PWM1, 2 para PWM2 o 3 para

ambos). Todo esto pensando en PICs con dos módulos PWM, aunque sería fácilmente modificable para

otros casos. El tener una sola función para inicializar todos los canales tiene sentido porque los

parámetros calculados (PR2, pre-scaler) son comunes entre canales.

La función calcula el valor de PR2 y PRE que consiguen la frecuencia pedida y los usa para el registro PR2

y para configurar el divisor previo del TMR2. También arranca el timer por lo que no es necesaria una

llamada adicional.

Si la frecuencia requerida es demasiado baja se fija la frecuencia permitida más baja posible. Como es

posible que en PR2 resulte un valor < 255, la función devuelve el valor de DC que corresponde a un

100% del ciclo ON.

Usando las nuevas rutinas podríamos reescribir el programa anterior como:

void main()

{

uint16 DC_max,dd=0;

int8 inc=1;

DC_max=1023; // Nominal Value for DC max

DC_max=setup_PWM(20000,10,3); // Set both channels @ Fpwm=10 KHz for a 20 MHz oscillator

while(1)

{

set_pwm1(dd); set_pwm2(DC_max-dd);

dd+=inc; // Increase duty cicle

if ((dd==DC_max) || (dd==0)) inc=-inc;// Reverse direction.

Delay10KTCYx(5);

}

}

Vemos como para DC_max no usamos el valor nominal 1023 sino el que nos devuelve la función

setup_PWM.

La aplicación más sencilla que podemos ver del uso de PWM es modular la luminosidad de un LED. Al

contrario que con una lámpara incandescente no podemos atenuar un LED bajando su voltaje ya que al

ser esencialmente un diodo, pasará de no conducir (OFF) a conducir (ON) con una muy pequeña

variación de voltaje. Lo que podemos hacer con PWM es encenderlo y apagarlo muy rápidamente (a la

frecuencia del PWM). El tiempo ON del ciclo (duty) determinará la luminosidad aparente del LED (en este

caso el elemento integrador o paso bajo es nuestro ojo, que es incapaz de apreciar como el LED se

enciende y se apaga).

En el ejemplo siguiente usamos la salida de PWM1 y PWM2 para modular el color e intensidad de un Led

bicolor RG. Usaremos RC1 y RC2 conectados al positivo de los leds R y G y pondremos el negativo

común a tierra:

Page 7: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 7/14

El diferente valor de las resistencias usadas (800K, 100K) es para compensar la mayor eficiencia del LED

rojo e intentar que la luminosidad de ambos LED estén equilibradas.

El código (pwm2.c) es muy similar al anterior, pero ahora los valores del ciclo de trabajo los sacamos de

un par de tablas (básicamente una oscilación sinusoidal dando más preferencia a los niveles cerca del 0).

El tamaño de ambas tablas corresponde a dos números primos y se ha elegido así para que se de una

mayor combinación de colores, antes de que empiecen a repetirse las combinaciones. También se han

definido un par de macros que incrementan los respectivos punteros p1 y p2 a las tablas, haciéndolos

voltear al llegar al final.

Como ambas tablas son de sólo lectura una posibilidad sería colocarlas en la memoria de programa

(usando el calificador const rom) para no gastar memoria de datos.

#define N1 61

#define N2 59

uint16 duty1[N1]={

121, 153, 192, 239, 294, 357, 428, 507, 590, 676, 761, 840, 909, 964,1001,1018,

1012, 985, 939, 876, 801, 719, 633, 548, 467, 392, 324, 265, 215, 172, 137, 108,

84, 65, 50, 38, 29, 22, 16, 11, 8, 5, 3, 2, 1, 0, 0, 0,

1, 2, 4, 6, 9, 13, 18, 25, 33, 44, 57, 74, 95};

uint16 duty2[N2]={

121, 155, 195, 244, 302, 369, 444, 526, 613, 702, 789, 867, 934, 983,1012,1018,

1000, 961, 902, 829, 746, 658, 569, 484, 405, 334, 272, 219, 174, 137, 107, 83,

64, 49, 37, 27, 20, 14, 10, 7, 4, 2, 1, 0, 0, 0, 1, 2,

3, 5, 8, 12, 17, 24, 32, 42, 56, 73, 95};

uint8 p1=0;

uint8 p2=0;

#define inc_p1 {p1++; if(p1==N1) p1=0; }

#define inc_p2 {p2++; if(p2==N2) p2=0; }

void main()

{

setup_PWM(20000,5,3);

while(1)

{

set_pwm1(duty1[p1]); inc_p1;

set_pwm2(duty2[p2]); inc_p2;

Delay10KTCYx(5);

}

}

En la siguiente película podemos ver el resultado. A la derecha, los LEDs de la placa EasyPic6

correspondientes a RC1 y RC2 se van encendiendo y apagando. A la izquierda el LED Red-Green

conectado a ambas salidas va cambiando de color.

Page 8: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 8/14

Publicado por Antonio

El problema del video es que los sensores de las cámaras digitales son muy sensibles al rojo (de hecho

más al infrarrojo), saturandose el canal rojo y no apreciandose correctamente los detalles de las

transiciones de color.

Recomendar esto en Google

Respuestas

28 comentarios:

Tony 20 de marzo de 2013 18:44

Bastante completo, me surge una duda, las señales pwm las pones para que tengan las mismas

caracteristicas, como se podria hacer para que las dos señales esten desfasadas un angulo?

Responder

Antonio 20 de marzo de 2013 19:33

Supongo que te refieres a que las dos señales PWM tengan un desfase entre ellas. Usando el

módulo PWM del PIC creo que no es posible, ambas señales van guiadas por el mismo timer y

se ponen en alto en el mismo instante (aunque dependiendo del duty cycle programado para

cada una de bajan en instantes distintos).

Tony 20 de marzo de 2013 20:11

Gracias por responder tan rapido. Si, es mi problema, habia pensado en usar interrupciones

para intentar controlarlo, pero no le encuentro solucion correcta. Mirare a ver si se puede hacer

de otras maneras.

Alvaro Tasco 10 de julio de 2013 20:00

Si tambien tengo ese problema necesito generar 2 señales PWM desfasada 180 y adicionarle un

tiempo muerto...

Alvaro Tasco 10 de julio de 2013 20:00

Si tambien tengo ese problema necesito generar 2 señales PWM desfasada 180 y adicionarle un

tiempo muerto...

Antonio 11 de julio de 2013 10:13

¿Cuando dices desfasadas 180º te refieres a que una está desplazada medio ciclo respecto a la

Page 9: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 9/14

otra (caso a) o a que la segunda es la complementaria de la primera (caso b)?

Si es el caso b) es muy sencillo con un PIC con EPWM (enhanced PWM). Solo programas el PWM

normalmente y la señal complementaria sale por otro pin

(RD5 o asi, consulta el datasheet). Además puedes programar tiempos muertos.

Si es el caso a) no creo que sea posible usando PWM, aunque podrías hacerlo

a través de una interrupción con un timer. También supongo que con un poco de electrónica

detrás de la salida PWM podrías crear una señal retrasada.

Antonio

Alvaro Tasco 15 de julio de 2013 06:28

Muchas graacias antonio por tu respuesta tan pronta. Las señales las necesito complementaria,

Ando trabajando con el 18F4550 y trae ese modulo ECCP, la aplicacion que esto haciendo es

controlar un puente H, al cual le pueda variar la frecuencia pwm y el ciclo de trabajo.

Obligatoriamente estas señales no pueden tener un ciclo de trabajo superior al 50%..

He hecho unas simulaciones [URL=http://imageshack.us/photo/my-images/842/pxj.png/]

[IMG]http://imageshack.us/a/img842/4375/pxj.th.png[/IMG][/URL] esa es la imagen..

Y realizando el programa.. me sale esto..[URL=http://imageshack.us/photo/my-

images/51/kf4m.jpg/][IMG]http://imageshack.us/a/img51/4980/kf4m.th.jpg[/IMG][/URL]

Alvaro Tasco 15 de julio de 2013 06:29

Este comentario ha sido eliminado por el autor.

Antonio 15 de julio de 2013 16:28

Pero las señales que veo en tu captura de osciloscopio parecen bastante correctas. Tienes

ambas señales complementarias con un "deadband" entre ellas.

Es cierto que, a ojo, tu ciclo de trabajo es del orden de un 78%, pero si ese es el problema,

podrías modificarlo limitando el valor de los registros correspondientes.

Las formulas relevantes son (pag 155 del manual del 2550-4550):

Period_pwm = 4 x Tosc x (PR2+1) x TMR2_pre

T_Duty_on = Tosc x (valor duty) x TMRpre max(valor_duty) = 4*(PR2+1) = 100%

Delay (tiempo muerto) = 4 x Tosc x ECCP1DEL (7 bits)

Imagina que tienes un cristal de 8Mhz (Tosc = 1/8 usec) y programas el PWM con un

TMR2_pre=1 y PR2=255.

Tendrías un periodo de 4 x 1/8 x 256 x 1 = 128 usec = 7.8KHz de frecuencia PWM.

Si ahora programas un delay de 32 usec (con ECCP1DEL=64) y varías duty entre 0 y 768

tendrás dos señales complementarias (fuera del tiempo muerto) y ninguna de las dos ocupara

más de un 50%.

No se si he entendido lo que querías.

Antonio.

ricardo lara 22 de agosto de 2013 00:28

Buena respuesta... tengo una duda, tengo el pic 18f4550 este posee solo 2 salidas pwm, Como

se pueden generar mas salidas ya sea por software o hatware?, pues necesito controlar 6

servos

Agradecería tu respuesta

Antonio 28 de agosto de 2013 13:46

Podrías hacerlo con software usando timers y las interrupciones asociadas. De hecho solo

necesitarías gastar un timer para controlar hasta 8 servos (asumiendo una frecuencia de 50 Hz

y un máximo pulso de control de 2.5 usec que es lo standard en muchos servos). Obviamente

precisarías 1 pin libre para controlar cada servo.

Page 10: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 10/14

Responder

Respuestas

Responder

Respuestas

Estaba pensando escribir una entrada sobre el tema explicando los detalles. Con tu pregunta,

la subiré de prioridad en mi cola de cosas para hacer.

Antonio.

Anónimo 4 de abril de 2013 01:39

Es decir, si deseo hacer un PWM de 100KHz tendría que poner el PR2 a 50 con lo cual 4x50=200 si todo

el periodo son 1024 entonces ¿sólo tendría un duty "útil" o "con tensión positiva en la salida" un 19,5%

del periodo total?

Gracias por tu artículo, me ha parecido muy interesante :)

Responder

Antonio 4 de abril de 2013 11:16

Asumiendo que tienes un cristal de 20 MHz y que programas un PRESCALER=1 entonces

efectivamente obtendrás un PWM de 100 KHz si usas PR2=49 (PR2+1=50).

Lo que no es cierto es que solo puedas conseguir un duty máximo del 19% (200/1024).

Puedes alcanzar un duty del 100% si pones 200 en el resistro del duty cycle. No has perdido

rango del duty, ya que puedes ir desde 0% (duty=0) hasta 100% (duty=200).

Lo que has perdido es resolución al especificar el duty. Todo el rango posible (de 0 a 100%) lo

cubres en 200 pasos, en vez de en los 1024 pasitos posibles si hubieras optado por una

frecuencia PWM más baja.

Espero haberte aclarado algo,

Antonio.

Anónimo 6 de abril de 2013 00:52

Todo claro, muchas gracias :)

Anónimo 22 de agosto de 2013 19:47

Hola, tengo una duda, una tontería más bien pero no me termina de quedar claro. En modo PWM, el

periodo de la señal generada, ¿está limitado por el tamaño del Timer 2 o no?. Sé que el periodo depende

del timer, pero no tengo claro exactamente de qué característica del timer depende.

Otra pregunta que tengo, por si alguien la sabe es si, El módulo CCP en modo PWM sólo produce

interrupción en modo captura con un sensor de ultrasonidos o no tiene nada que ver.

Muchas gracias.. Un saludo..

Responder

Antonio 28 de agosto de 2013 13:38

No entiendo muy bien a que te refieres con el tamaño del Timer 2. El Timer 2 siempre es de 8

bits.

El periodo del PWM es: 4 * Tosc * (PR2+1) * TMR2_PREESCALER

y por lo tanto depende del valor del registro PR2 (asociado al Timer 2) y del valor de pre-

escalado (1,4 o 16) del Timer 2.

Respecto a tu segunda pregunta, si el módulo CCP está en modo PWM no producirá

interrupciones asociadas al modo CAPTURE, aunque es posible programar uno de los módulos

CCP en modo PWM y el otro en modo CAPTURE.

Respecto a lo del sensor de ultrasonidos, una interrupción de captura saltará cuando la línea

correspondiente suba o baje. Lo que sea que cause ese cambio es indiferente.

Hay una entrada más reciente sobre el modo CAPTURE del módulo CCP que puede aclararte

Page 11: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 11/14

Responder

Respuestas

algunas conceptos:

http://picfernalia.blogspot.com.es/2013/07/modo-de-captura-en-el-modulo-ccp.html

Espero haberte aclarado algo, Antonio

Alisanz 29 de agosto de 2013 13:23

Este comentario ha sido eliminado por el autor.

Anónimo 29 de agosto de 2013 13:24

Sí, muchas gracias. A lo que me refería con el módulo CCP era si sólo produce interrupciones en

modo captura, pero he leído que es en modo comparación dónde si las produce, no?

Antonio 29 de agosto de 2013 16:59

El modulo CCP (Capture/Compare/PWM) puede producir interrupciones en sus tres modos:

* En modo Capture la interrupción CCPxIF saltara cuando la linea suba, baje, o cada 4 o 16

subidas (se puede programar).

* En modo Compare CCPxIF se levanta cuando el valor del Timer asociado (TMR1/TMR3)

coincide con el valor del registro CCPRx.

* El modo PWM no provoca interrupciones CCP, pero como por debajo usar el timer TMR2,

disparará la interrupción asociada al Timer TMR2.

POr supuesto en todos los casos para que la interrupción salte los correspondiente bits IE

(interrupt enable) deben estar a 1, tanto de tipo general como específicos.

Un saludo, Antonio.

Anónimo 13 de noviembre de 2013 07:42

Hola, buenas noches soy estudiante de Biomedica en la universidad, me piden que genere un programa

en C utilizando el PIC18F45K22, y un LCD para representar los datos manejando los 2 modulos PWM del

pic, mi pregunta es , tengo que ingresar todas las declaraciones y definiciones que manejas para poder

ejecutarlo, claro aparte de la interfaz LCD al microcontrolador, ya que el maestro nos solicita generar 2

frecuencias, una de 38.53KHz y otra de 63.75Khz con cada modulo PWM respectivamente.

Gracias por su respuesta!!!!

Responder

Antonio 13 de noviembre de 2013 11:11

Si vas a usar las funciones del C18 para los TIMERS y el PWM si que deberías usar los

correspondientes #includes.

Respecto a mi fichero ints_C18.h donde defino la posición de los diferentes bits de

interrupciones, flags, etc no sería necesario. De hecho si quieres usar algo similar por

conveniencia tendrías seguramente que modificarlo, ya que es casi seguro que algunos de los

bits asociados a los timers y al PWM estén en registros/posiciones diferentes.

De hecho, lo de generar 2 frecuencias distintas en ambos canales es algo que no es posible en

los PIC (18F4520) que yo estoy usando. En estos PICs ambos módulos PWM usan el mismo

timer TMR2, por lo que la frecuencia PWM es común en ambos módulos.

Sin embargo, en los que tu mencionas 18F45K22 he visto que es posible asociar cada módulo a

un timer distinto, por lo que podrás obtener las 2 frecuencias distintas que te han pedido.

Las fórmulas que doy para calcular la frecuencia PWM siguen siendo válidas, pero ahora, en vez

de usar exclusivamente el registro PR2 (asociado al TMR2) puedes usar un distinto PRx

para el otro módulo, asociándolo a un segundo timer TRMx.

UN saludo,

Page 12: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 12/14

Responder

Respuestas

Responder

Respuestas

Antonio.

Gabriel Iñiguez 22 de noviembre de 2013 06:54

Hola buenas noches,, espero me puedas ayudar, estoy realizando un proyecto con el PIC16F887 en el

que debo controlar con el PWM un foco convencional, solo que este prende y apaga en lugar de ir

subiendo la intensidad, para ello tengo un led a la salida del PWM del micro para monitorear y este si lo

hace como debe de ser, solo que con el foco conectado prende y apaga solamente.

Como el foco lleva corriente alterna, hice un circuto analogico de un optocoplador (MOC3011) con un

triac (MAC15A6G).

Gracias!!

Responder

Antonio 22 de noviembre de 2013 09:49

Si en el LED de control ves la subida y bajada gradual de intensidad es que la parte del

programa del PIC es correcta. Lo que estariá fallando en tu caso seria el circuito interfaz con el

foco.

Dados mis casi nulos conocimientos de electrónica, dar consejos sobre circuitos sería

temerario. Si es un circuito de electrónica de potencia como es tu caso, entraría en el terreno

de la negligencia criminal.

De todas formas si busco en google con PWM, dimmer, TRIAC me salen numerosos ejemplos,

aunque no se si en tu caso es obligado hacerlo con los componentes que indicas.

De hecho en varios ejemplos que he visto no usan PWM. Simplemente detectan los pasos por

cero del voltaje de la red y en ese momento activan el TRIAC con un pin de control,

manteniendolo alto durante el porcentaje adecuado del medio ciclo de la red.

Si la red va a 50 Hz un ciclo son 20 ms y medio ciclo 10 ms. El tiempo e activación del triac

estaría entre 0 ms (0%) y 10 ms (100%).

Espero que esto te sirva de algo, Antonio

Antonio

Gabriel Iñiguez 23 de noviembre de 2013 05:43

Gracias por tu respuesta Antonio, me sirvió de mucho, de hecho voy a empezar a detectar los

cruces por cero de la señal alterna y saber el periodo de la señal, para así saber donde activar el

TRIAC. Si logro terminar este proyecto te comparto la solución.

Muchas gracias y saludos.

Anónimo 24 de noviembre de 2013 10:52

buenas noches soy nuevo en esto de los microcontroladores, tengo un proyecto es un inversor

monofasico medio puente y debo controlar la conmutación de los 2 transistores he leido que puedo

generar mi señal PWM y que hay una función en el pic que me genera la señal complementaria, y tambien

he leido que se le puede asignar ya los tiempos muertos y ya con esas señales pienso enviarlas a un

driver IR2111 que me haran el cambio de referencia a tierra e invertiran la polarizacion de la señal

complementaria logrando asi el desfase a 180ª que se necesita para que no conmuten al mismo tiempo

los transistores y con el tiempo muerto asignado para que no se corto circuiten, te agradecería mucho

me pudieras orientar un poco cualquier informacion de verdad seria de gran ayuda ya que no encuentro

ni ejemplos de como implementar estas señales, muy poca información de lo que he investigado justo lo

que necesito es aplicar este modo HALF-BRIDGE OUTPUT MODE ojala me puedas orientar gracias

Responder

Antonio 25 de noviembre de 2013 09:40

La mejor documentación sobre lo que quieres hacer la encontraras en el datasheet del PIC que

vayas a usar (en la sección correspondiente a EPWM (Enhanced PWM).

Por ejemplo, en el caso de la familia PIC4520 está en las páginas 147 a 152 del manual.

Básicamente debes (asumiendo que usar el módulo PWM1

* Selecciona el módulo PWM: poner los 4 bits menos significativos de CCP1CON a 11xx

Page 13: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 13/14

Responder

Respuestas

* Configurar el módulo PWM en modo HalfBridge (poniendo los 2 bits más significativos de

CCP1CON a 10)

* Configurar periodo y duty del PWM (esto es igual que lo explicado en esta entrada).

* Configurar tiempos muertos usando los 7 bits menos significativos de PWM1CON: delay =

4*Tosc*PWM1CON

Los pines de salida para las señales complementarias serán RC2 y RD5. Ambos tienen que ser

declarados de salida con los correspondientes registros TRISC y TRISD.

Un saludo, Antonio

Anónimo 4 de diciembre de 2013 17:23

Buenas tardes, Antonio:

Felicidades en primer lugar por tu trabajo.

Mi pregunta está relacionada con el control PWM de un motor de continua mediante un hardware half-

bridge. La idea es utilizar un pic y configurar dos salidas PxA y PxB en modo half-bridge y con una

banda de retraso (dead-band delay mode) para evitar cortos.

Pero tengo una duda sobre el control del puente. Entiendo que cuando PxA está a nivel alto y PxB a

nivel bajo el motor gira en un sentido y con PxA a nivel bajo y PxB a nivel alto se invierte el sentido. Sin

embargo no entiendo el comportamiento cuando estas conmutaciones son a alta frecuencia, supongo

que será porque depende de la amplitud de la señal PWM, si PxA está más tiempo a nivel alto que a nivel

bajo gira en un sentido y si está más tiempo a nivel bajo girará en el contrario pero no entiendo muy

bien como se adapta el motor a esos cambios tan rápido en la polarización. Entiendo los cambios en

amplitud que el motor ve como un promedio pero no los cambios en la polarización.

Te agradecería que me confirmases mi sospecha o me indiques como funciona realmente esta

configuración.

Saludos.

José Ángel.

Responder

Antonio 8 de diciembre de 2013 15:04

Buena pregunta. Yo también entiendo mejor el concepto de modular la velocidad con PWM

usando el montaje que llamo A) en el post. Encendemos el motor durante un rato (% del ciclo)

y lo apagamos durante el resto, dejando que siga girando por inercia. Si la frecuencia del PWM

es lenta veremos que la velocidad baja, pero a las frecuencias que estamos usando (del orden

de 10KHz) ese efecto será inapreciable.

En cambio la idea de "decirle" al motor que gire en un sentido y luego en otro para que se

mantenga quieto (opción B con duty del 50%) es poco intuitiva. Al igual que antes, si lo

hacemos a frecuencias bajas veríamos al motor girar en ambos sentidos, pero a medida que

aumentamos la frecuencia el movimiento pasa a ser una vibración para finalmente desaparecer

cuando el motor es incapaz de seguirlo. En ese caso (motor parado) la situación es como

alimentar un circuito LR (Inductancia y Resistencia del motor) con corriente alterna de alta

frecuencia.

La forma en que yo lo visualizo es que si en esas circunstancias subo p.e. el duty a 80% (esto

es, durante un 80% aplico V al motor y durante 20% aplico -V) durante un 40% del ciclo tengo

una corriente alterna equilibrada (20% + y 20% -) que no produce ningún efecto. El resto del

ciclo (60%) estoy aplicando una corriente DC positiva, que provoca el giro en el sentido

correspondiente.

No se si esto tiene mucho sentido o te aclara algo. Estoy de acuerdo contigo en que lo de

invertir polaridades es mucho menos intuitivo. De hecho, la primera vez que vi este enfoque (en

una app note de microchip) como no lo veía claro acudí a las ecuaciones diferenciales de un

motor DC:

L dI/dt = V - R I - K w

J dw/dt = K I - b w

donde I es intensidad, V voltaje aplicado, R Y L resistencia e inductancia del motor, J =

momento de inercia, K = cte motor (V/rads) y b un coeficiente de fricción. w es la velocidad

angular del motor.

Con este modelo puedes resolver las ecs. diferenciales para diferentes voltajes y comprobar por

ejemplo que la velocidad alcanzada por el motor al 60% en modo unipolar(opción A) es la

misma que si invertimos la polaridad (OPcion B) y usamos un duty del 80%. También puedes

comprobar como las oscilaciones dentro de un ciclo van desapareciendo al aumentar la

frecuencia del voltaje aplicado.

Un saludo, Antonio

Page 14: Tutoriales PIC_ Modulación PWM (Pulse Width Modulation)

11/12/13 Tutoriales PIC: Modulación PWM (Pulse Width Modulation)

picfernalia.blogspot.mx/2012/06/modulacion-pwm-pulse-width-modulation.html 14/14

Entrada más reciente Entrada antiguaPágina principal

Suscribirse a: Enviar comentarios (Atom)

Responder

Introduce tu comentario...

Comentar como: Cuenta de Google

Publicar

Vista previa

Plantilla Picture Window. Con la tecnología de Blogger.