Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tutoriales PIC
Fundamentos de microcontroladores aplicados a la familia PIC de Microchip.
Proyectos y Aplicaciones.
240,634
SEARCH IN THIS BLOG
Cargando...
--------------------------------------------------------------------------------------------
2013
(16)
2012
(13)
julio
(3)
junio
(10)
Aplicacin: Audio con
PWM
Modulacin PWM
(Pulse Width
Modulation)
Decodificador de un
mando a distancia
Comunicaciones UART
con paridad
Comunicaciones UART
con interrupciones
Comunicaciones
puerto serie (UART)
Si
usamos
un dispositivo externo con un ancho de banda suficiente (p.e. un osciloscopio)
veremos la
seal al completo, esto es, la modulacin rpida (o portadora) de 10
KHz y las variaciones ms lentas
(seal a transmitir) del ciclo de trabajo.
Si por el
contrario aplicamos un filtro paso-bajo a la seal PWM, los cambios rpidos (10
KHz) de la
seal se eliminarn y simplemente veremos los cambios lentos del
ciclo de trabajo, observando un
Uso de
temporizadores
(timers)
Niveles de prioridad
en interrupciones
Interrupciones
La
programacin del % ON del segundo mdulo es similar pero usando los registros
CCP2CON y
(conceptos bsicos)
Introduccin al BLOG
DATOS PERSONALES
Antonio
Ver todo mi perfil
SEGUIDORES
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 vlidos pueden ser menores que los
1024 posibles.
La razn
es que el valor de DC (duty_cicle) determina el tiempo que la seal se mantiene
alta (ON) de
la forma:
T_on = [ DC x PRE]
x Tosc
Recordando
que el tiempo total del periodo es:
T_pwm = [ (PR2+1) x 4 x PRE
] x Tosc
Comparando
ambas frmulas y siendo obvio que
del periodo tenemos que el valor mximo de DC
DC cualquier valor entre 0 y 1023 est claro
(PR2+1)x4 ]. Valores ms altos van a
hacer que
mantiene alta
todo el rato (100%).
En
resumen, para mantener la mxima resolucin (10 bits) a la hora de especificar
DC es preciso usar
PR2=255. Parauna cierta
frecuencia del oscilador Fosc podemos optar por tres frecuencias con la
mxima
resolucin:
Registro
PR2
255
255
255
F_pwm
Fosc / 1024
Fosc / 4096
Fosc /
16384
Para Fosc = 20
MHz
19.75 KHz
4.88 KHz
1,22 KHz
Frecuencias
por debajo de Fosc/16384 no son posibles porque los valores de PR2 y PRE estn ya en su
mximo posible.
Frecuencias
por encima de Fosc/1024 son posibles pero a costa de bajar PR2 y por lo tanto
disponer de
menor resolucin 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 razn
por la que para frecuencias muy altas no podemos especificar con tanta
precisin el ciclo es
que el periodo empieza a hacerse muy pequeo. En el caso
anterior (Fpwm = Fosc/256) es obvio que
en un ciclo del PWM slo entran 256
ciclos del oscilador. Como es imposible que el micro haga algo
entre ciclos de
reloj, est claro que slo puede bajar la lnea del PWM en 256 puntos como
mucho
(esto es, con una resolucin de 8 bits).
Valores de
frecuencias intermedios son tambin 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 tendrn ningn
efecto extra.
En cuanto
al pin de salida al que se manda la seal 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
configuracin.
Las
rutinas bsicas del compilador C18 para manejar los mdulos PWM son las
siguientes (las
declaraciones se encuentran en pwm.h):
OpenPWM1(uint8
periodo) : habilita el mdulo 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 (cdigo en pwm1.c) pone en marcha ambos mdulos y va
variando el ciclo de
trabajo de PWM1 entre 0 y DC_max (valor mximo = 1023, correspondiente
a un 100%).
Simultneamente el ciclo de PWM2 se establece como el valor complementario.
Tras los #include (no
olvidar aadir pwm.h, timer.h y delays.h) y los #pragma de
configuracin habituales el programa
principal es simplemente:
void main()
{
uint16 DC_max, dd=0;
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 comn 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 variacin 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 despus de un rato. El comportamiento de PWM1 y PWM2 no parece ser el que hemos
programado. La
evolucin del ciclo de trabajo antes describa la funcin de la izquierda (como
La razn
es que al haber bajado PR2 hemos subido la frecuencia (correcto) pero sin
darnos cuenta
tambin hemos alterado el rango de valores posible para DC. El
valor mximo para el que alcanzamos
e 100% es de 4x(200) = 800.Al llegar
dd a 800, la seal PWM alcanza un 100% y se mantiene
mientras dd sigue subiendo
hasta 1023 y vuelve a bajar. Slo cuando volvemos a entrar en el rango [0
800] volvemos
a notar variacin.
En
resumen, recordar que si PR2 no es 255 el valor mximo de DC no ser 1024 sino
DC_max = 4 x
(PR2+1).
Vemos que
slo es cuestin de poner los 2 bits menos significativos del argumento en los
bits DC1b0 y
DC1b1 de CCP1CON y los 8 ms significativos en CCPR1L. Lo mismo
para los registros CCP2CON y
CCPR2L para PWM2.
Obviamente,
estas rutinas no aportan nada sobre las suministradas por C18, slo nos
permiten
confirmar que lo que se est haciendo no es nada complicado.
Veamos una
rutina con algo de "valor aadido". Era un poco incomodo tener que
acordarnos de
configurar y arrancar TMR2 por separado. Vamos a escribir una rutina
que combine la configuracin
del mdulo y el arranque del timer TMR2. Adems,
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 mdulo
y luego usar las rutinas de C18 para
fijar el ciclo de trabajo. El cdigo 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)
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
mdulos PWM, aunque sera fcilmente modificable
para otros casos. El tener una sola funcin para inicializar
todos los canales tiene sentido porque los
parmetros calculados (PR2,
pre-scaler) son comunes entre canales.
La funcin
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. Tambin arranca
el timer por lo que no es necesaria
una llamada adicional.
Si la frecuencia
requerida es demasiado baja se fija la frecuencia permitida ms baja posible.
Como es
posible que en PR2 resulte un valor < 255, la funcin devuelve el
valor de DC que corresponde a un
100% del ciclo ON.
Usando las
nuevas rutinas podramos reescribir el programa anterior como:
void main()
{
uint16 DC_max,dd=0;
int8 inc=1;
DC_max=1023;
// Nominal Value for DC max
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 funcin
setup_PWM.
La
aplicacin ms sencilla que podemos ver del uso de PWM es modular la
luminosidad de un LED. Al
contrario que con una lmpara 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 pequea
variacin de
voltaje. Lo que podemos hacer con PWM es encenderlo y apagarlo muy rpidamente
(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
comn a tierra:
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 estn
equilibradas.
El cdigo (pwm2.c)
es muy similar al anterior, pero ahora los valores del ciclo de trabajo los
sacamos
de un par de tablas (bsicamente una oscilacin sinusoidal dando ms
preferencia a los niveles cerca
del 0). El tamao de ambas tablas corresponde a
dos nmeros primos y se ha elegido as para que se
de una mayor combinacin de
colores, antes de que empiecen a repetirse las combinaciones. Tambin
se han
definido un par de macros que incrementan los respectivos punteros p1 y p2 a las
tablas,
hacindolos voltear al llegar al final.
Como ambas
tablas son de slo lectura una posibilidad sera 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;
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 pelcula 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.
El problema del video es que los sensores de las cmaras digitales son muy sensibles al rojo (de hecho
ms al infrarrojo), saturandose el canal rojo y no apreciandose correctamente los detalles de las
transiciones de color.
Publicado por
Antonio
40 comentarios:
Tony 20 de marzo de 2013, 18:44
Bastante completo, me surge una duda, las seales pwm las pones para que tengan las mismas
caracteristicas, como se podria hacer para que las dos seales esten desfasadas un angulo?
Responder
Respuestas
Antonio
Supongo que te refieres a que las dos seales PWM tengan un desfase entre ellas. Usando el
mdulo PWM del PIC creo que no es posible, ambas seales 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).
Antonio
Cuando dices desfasadas 180 te refieres a que una est desplazada medio ciclo respecto a la
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 seal complementaria sale por otro pin
(RD5 o asi, consulta el datasheet). Adems puedes programar tiempos muertos.
Si es el caso a) no creo que sea posible usando PWM, aunque podras hacerlo
a travs de una interrupcin con un timer. Tambin supongo que con un poco de electrnica
detrs de la salida PWM podras crear una seal retrasada.
Antonio
Antonio
Pero las seales que veo en tu captura de osciloscopio parecen bastante correctas. Tienes
ambas seales 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,
podras modificarlo limitando el valor de los registros correspondientes.
Las formulas relevantes son (pag 155 del manual del 2550-4550):
Imagina que tienes un cristal de 8Mhz (Tosc = 1/8 usec) y programas el PWM con un
TMR2_pre=1 y PR2=255.
Tendras 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 varas duty entre 0 y 768
tendrs dos seales complementarias (fuera del tiempo muerto) y ninguna de las dos ocupara
ms de un 50%.
No se si he entendido lo que queras.
Antonio.
Antonio
Podras hacerlo con software usando timers y las interrupciones asociadas. De hecho solo
necesitaras gastar un timer para controlar hasta 8 servos (asumiendo una frecuencia de 50 Hz
y un mximo pulso de control de 2.5 usec que es lo standard en muchos servos). Obviamente
precisaras 1 pin libre para controlar cada servo.
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.
Responder
Antonio.
No entiendo muy bien a que te refieres con el tamao 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 preescalado (1,4 o 16) del Timer 2.
Respecto a tu segunda pregunta, si el mdulo CCP est en modo PWM no producir
interrupciones asociadas al modo CAPTURE, aunque es posible programar uno de los mdulos
CCP en modo PWM y el otro en modo CAPTURE.
Respecto a lo del sensor de ultrasonidos, una interrupcin de captura saltar cuando la lnea
correspondiente suba o baje. Lo que sea que cause ese cambio es indiferente.
Hay una entrada ms reciente sobre el modo CAPTURE del mdulo CCP que puede aclararte
algunas conceptos:
http://picfernalia.blogspot.com.es/2013/07/modo-de-captura-en-el-modulo-ccp.html
Espero haberte aclarado algo, Antonio
Antonio
POr supuesto en todos los casos para que la interrupcin salte los correspondiente bits IE
(interrupt enable) deben estar a 1, tanto de tipo general como especficos.
Un saludo, Antonio.
Responder
Si vas a usar las funciones del C18 para los TIMERS y el PWM si que deberas usar los
correspondientes #includes.
Respecto a mi fichero ints_C18.h donde defino la posicin de los diferentes bits de
interrupciones, flags, etc no sera necesario. De hecho si quieres usar algo similar por
conveniencia tendras seguramente que modificarlo, ya que es casi seguro que algunos de los
bits asociados a los timers y al PWM estn 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 mdulos PWM usan el mismo
timer TMR2, por lo que la frecuencia PWM es comn en ambos mdulos.
Sin embargo, en los que tu mencionas 18F45K22 he visto que es posible asociar cada mdulo a
un timer distinto, por lo que podrs obtener las 2 frecuencias distintas que te han pedido.
Las frmulas que doy para calcular la frecuencia PWM siguen siendo vlidas, pero ahora, en vez
de usar exclusivamente el registro PR2 (asociado al TMR2) puedes usar un distinto PRx
para el otro mdulo, asocindolo a un segundo timer TRMx.
UN saludo,
Antonio.
Responder
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 electrnica, dar consejos sobre circuitos sera
temerario. Si es un circuito de electrnica de potencia como es tu caso, entrara 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 activacin del triac
estara entre 0 ms (0%) y 10 ms (100%).
Espero que esto te sirva de algo, Antonio
Antonio
La mejor documentacin sobre lo que quieres hacer la encontraras en el datasheet del PIC que
vayas a usar (en la seccin correspondiente a EPWM (Enhanced PWM).
Por ejemplo, en el caso de la familia PIC4520 est en las pginas 147 a 152 del manual.
Bsicamente debes (asumiendo que usar el mdulo PWM1
* Selecciona el mdulo PWM: poner los 4 bits menos significativos de CCP1CON a 11xx
* Configurar el mdulo PWM en modo HalfBridge (poniendo los 2 bits ms 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 seales complementarias sern RC2 y RD5. Ambos tienen que ser
declarados de salida con los correspondientes registros TRISC y TRISD.
Un saludo, Antonio
Responder
Buena pregunta. Yo tambin 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 (opcin B con duty del 50%) es poco intuitiva. Al igual que antes, si lo
hacemos a frecuencias bajas veramos al motor girar en ambos sentidos, pero a medida que
aumentamos la frecuencia el movimiento pasa a ser una vibracin para finalmente
desaparecer cuando el motor es incapaz de seguirlo. En ese caso (motor parado) la situacin
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 ningn 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 vea 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 friccin. 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(opcin A) es la
misma que si invertimos la polaridad (OPcion B) y usamos un duty del 80%. Tambin puedes
comprobar como las oscilaciones dentro de un ciclo van desapareciendo al aumentar la
frecuencia del voltaje aplicado.
Un saludo, Antonio
Responder
Respecto a uint8 y uint16 son efectivamente definiciones para enteros sin signo de 8 (byte) y
16 bits.
El operador >> es un shift hacia la derecha de 1 posicin (equivalente a una divisin entera
por 2).
x>>=1 es una abreviatura de x = (x >>1)
Como comento en el cdigo esos tres comandos calculan y guardan en x el valor (redondeado)
del cociente
(Fosc/4) / F_pwm
Un saludo, Antonio
Antonio
Podras optar por un PIC con ms de 2 PWM por hardware, como por ejemplo el PIC18F45K22
o en su defecto implementar un PWM extra en software usando un timer.
En este enlace:
http://www.microchip.com/stellent/idcplg?
IdcService=SS_GET_PAGE&nodeId=1824&appnote=en524189
dan algunas ideas sobre el tema.
Antonio
Responder
Comentar como:
Publicar
Vista previa
Entrada ms reciente
Avisarme
Pgina principal
Suscribirse a:
Enviar comentarios (Atom)
Entrada antigua