Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Facultad de Ciencias
ndice
Captulo Pgina
Introduccin 3
Practica 1, empezando 5
Practica 2, los puertos de entrada/salida 12
Prctica 3, el problema del Read Modify Write 15
Prctica 4, el temporizador (Timer) 18
Prctica 5, las Interrupciones 21
Prctica 6, el UART 24
Prctica 7, construir un voltmetro digital usando el ADC 29
Prctica 8, haciendo mltiples muestras 37
Prctica 9, haciendo mltiples muestras con el ADC de forma totalmente 45
automtica
Prctica 10, el mdulo PWM 52
Introduccin
Motivacin
Los libros disponibles para ensear microcontroladores y en general la mayora de los cursos a
nivel licenciatura estn basados en microcontroladores de gama baja, que generalmente tienen
baja potencia de clculo, poca memoria, etc. y que por regla general se programan en
ensamblador. Estos cursos cumplen con su objetivo; la enseanza de la teora y la prctica de los
microcontroladores. Sin embargo con estos conocimientos y estos recursos solo se pueden
realizar proyectos pequeos. Por ejemplo, en lenguaje ensamblador calcular la media en punto
flotante de n muestras del convertidor analgico digital y guardar los resultados en un arreglo es
muy complicado, pensar en aplicar filtros a la seal es casi imposible.
Antecedentes sugeridos
Este manual de prcticas est planeado para los cursos de microcontroladores de la carrera de
Ingeniero Electrnico. En este manual se asume que el estudiante conoce los fundamentos
bsicos de electricidad y electrnica tanto analgica como digita, y que tambin saben programar
bien en lenguajes estructurados. Se recomienda conocer el lenguaje c. Sin embargo si conoce
bien algn otro lenguaje estructurado como pascal, java, etc. puede abordar con xito esta
asignatura.
El cpu se comunica con los perifricos a travs de memoria compartida. Por ejemplo si el cpu
necesita arrancar un perifrico cualquiera, la orden la da el cpu modificando un registro de ese
perifrico. Por lo tanto el cpu como el perifrico comparten el acceso a ese registro.
Una caracterstica muy importante y que no esta disponible en otros fabricantes, es que son chips
de alto desempeo que poseen varios encapsulados tales como TQFP, DIP, etc. y que de cara a la
docencia, el encapsulado DIP es muy importante porque fcilmente se monta en protoboards.
Nota: Todo el documento est realizado con software propietario adquirido legalmente
Practica 1, empezando.
El objetivo de esta prctica es que el estudiante se familiarice con el microcontrolador y las
herramientas necesarias para su programacin, as como con su configuracin.
Paso 1.
Armar el sistema mnimo.
Material
Cantidad Descripcin
1 dsPIC30F4013 o similar
1 Resistencia de 10k
1 Resistencia de un k
2 Capacitor 33 pf
1 Cristal 4 mhz
1 Diodo Emisor de luz (Led)
1 Tablilla para prototipo (Protoboard)
Todo proyecto con microcontroladores se divide en dos partes: El diseo y construccin del
hardware y el diseo y construccin del software.
+v
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
dsPIC30F4013
17
10
11
12
13
14
15
16
18
19
20
2
6
7
1
4
5
8
9 +v
10K
1k
+v
GND
Fig. 1.1
Si no tenemos abierta la ventana del proyecto, la abrimos desde el menu windows del
mplab.
Ponemos el apuntador del ratn sobre la carpeta que se llama linker scripts y con el
botn derecho elegimos Add files y le agregamos el script p30f4013.gld que
usualmente est en la ruta C:\archivos de programa\microchip\MPLAB C30\support\ y
buscamos el archivo p30f4013.gld
/*p01.c
*/
#include <p30f4013.h>
Despus que se tenga escrito el archivo, en la ventana del proyecto se sita el apuntador
del ratn sobre la carpeta source files y se le agrega este archivo.
El siguiente paso es compilar el programa. Para ello situamos el apuntador del ratn sobre
el icono Build All y presionamos el botn izquierdo. Si no tenemos errores, vemos en la
ventana de salida el mensaje BUILD SUCCEEDED: seguido de la fecha. Entonces ya
tenemos la versin binaria lista para cargarse en el microcontrolador.
Para cargar o grabar el programa en el microcontrolador se usan unos dispositivos que se conocen
como Programadores. Existen diferentes clases y marcas de programadores. En los apuntes se
describe la construccin de un programador y su forma de usarse.
Este manual lo escribo con el objetivo de que sirva de gua en las practicas de microcontroladores
en los laboratorios de la Facultad. Por lo tanto usaremos un programador/depurador que se
encuentra disponible en el laboratorio de Automatizacin, el ICD2(In circuit Debuguer). El ICD2
es un dispositivo que permite programar los microcontroladores de Microchip estando montados
en el circuito, tambin permite la depuracin de los programas. Es una importante ventaja no
tener que extrae el microcontrolador del circuito(Protoboard o del circuito impreso), debido a que
el estudiante a veces se confunde y pone al microcontrolador al revs o desplazado a la izquierda
o a la derecha, lo que puede ocasionar que se dae.
Para usar el ICD2 se debe conectar al microcontrolador y al puerto usb de la computadora. Para
conectarlo al microcontrolador se hace uso de un conector especial que en seguida se describe.
El ICD2 tiene una entrada (zcalo) para un conector semejante al del telfono, pero con 6
conexiones. El telfono posee solo cuatro conexiones. De las seis conexiones que tiene el ICD2
solo se usan 5:
+V
Estas conexiones se conectan al circuito de acuerdo a la figura 1.2. Es importante mencionar que
las patitas PGC y PGD pueden variar en diferentes microcontroladores. Por ejemplo en el 3011
PGC est en la patita 26 y el PGD en la patita 25.
Figura 1.2: En este diagrama se puede observar la forma de conectar el ICD2 al dsPIC30F4013
PGC y PGD comparten sus patitas con otros mdulos del microcontrolador. Por ejemplo en el
4013 PGC comparte la patita 8 con el EMUC, AN6, OCFA y el RB6 (Ver la hoja de datos del
4013). Cuando EL ICD2 est conectado al circuito, solo PGC y PGD estn en uso y no estn
disponibles los otros mdulos. Cuando se desconecta vuelven a estar disponibles las e/s en esas
patitas de los otros mdulos.
En este documento no describir la instalacin del ICD2, asumimos que ya est instalado y por lo
tanto solo describir la forma de usarse.
Figura 1.4: Barra de herramientas del ICD2 en la que se puede ver el nombre del icono situado a
la derecha y el situado a la izquierda.
Para activar la conexin del ICD2 al circuito, movemos el apuntador del ratn sobre el icono
Reset and Connect to ICD y presionamos el botn izquierdo, y si todo est correcto (armado y
conexiones del ICD2), se activan el resto de iconos. Esto significa que ya podemos grabar el
programa en el 4013. Para grabar el programa, llevamos el apuntador del ratn al icono Program
target device y presionamos el botn izquierdo. Cuando termina el proceso de grabado, el
microcontrolador es reiniciado (reset). Y el programa empieza a ejecutarse.
J. Jess Acosta Elas 9
Manual de Prcticas del Laboratorio de Microcontroladores
Figura 1.5. Este es el cdigo de nuestro primer programa. Lo mostramos as para verlo con
nmeros de lnea
La lnea 3, incluye el archivo de cabecera para el 4013, si fuera otro microcontrolador, por
ejemplo el 3011, el archivo sera p30f3011.h.
Es importante mencionar que cuando se llega al final del programa, ste se reinicia, generndose
un reset. Para verificar esto, se conecta a la patita RD3 un osciloscopio. De esta manera podemos
observar como el diodo emisor de luz (LED) prende y apaga a pesar de que el programa lo
prende y no lo apaga
Paso 1.
Armar el sistema mnimo.
Material
Cantidad Descripcin
1 dsPIC30F4013 o similar
1 Resistencia de 10k
2 Resistencia de un k
2 Capacitor 33 pf
1 Cristal 4 mhz
1 Diodo Emisor de luz (Led)
1 Tablilla para prototipo (Protoboard)
1 Push-button
Todos los puertos tienen tres registros asociados, uno de configuracin, el TRISx, por
ejemplo el del puerto B es TRISB. Uno de entrada PORTx y uno de salida el LATx. Pero el
puerto B, adems tiene otro registro de configuracin, el ADPCFG. Este registro se usa para
configurar si la entrada es analgica digital. Esto es debido a que el puerto B comparte sus
patitas con el Convertido Analgico Digital. Aprovechamos esta prctica para aprender esta
caracterstica del puerto B.
Si cualquier bit del registro ADPCFG es puesto a 1, la patita asociada a ese bit es una entrada
digital. Y Si cualquier bit del registro ADPCFG es puesto a 0, la patita asociada a ese bit es
una entrada analgica. Cada bit del ADPCFG despus de un reset contiene un cero.
Si usamos una varias patitas del puerto B para entrada digital y no ponemos a 1 los bits
adecuados en el registro ADPCFG, el programa tendr respuestas impredecibles.
1K
RB11
RB12
30F4013
1k
Figura 2.1
Es importante observar que si el push-button no est presionado, RB11 recibe +V, esto significa
que recibe un uno lgico, si lo presionamos, entonces +V se va a tierra a travs de la resistencia y
RB11 recibe un cero lgico.
El programa:
/*
p02.c
*/
#include <p30f4013.h>
Esta prctica usa un push-button, y debido a que los contactos de este tipo de dispositivos tardan
un cierto tiempo en estabilizarse cuando se unen (Ver apuntes Cap5). Para reducir este problema
hay varias opciones de hardware y de software que en su momento se estudiarn.
PROYECTOS:
Despus de haber realizado esta prctica, el estudiante est preparado para realizar algunos
proyectos con el objetivo de reforzar los conocimientos adquiridos. Se recomiendan los
siguientes:
Proyecto 1.2: Con un dip-switch dar un nmero binario de 4 bits y mostrarlo en decimal
en un display de 7 segmentos.
Proyecto 1.4: Usando el proyecto 1.3, construir un teclado que permita al usuario escribir
una clave, si es correcta encienda un led mbar y si es errnea, encienda un led rojo.
Se construye un circuito como el de la prctica anterior, pero ahora se conectan 8 leds con su
respectivas resistencia de 1k al puerto B, empezando en RB0, RB1...RB7, las resistencias van
conectadas en serie (Para limitar la corriente). El push.button se conecta al RB11 (igual que en la
prctica pasada).
Si usamos el siguiente programa, los resultados son imprevisibles debido al problema del read
modify write
+
1K
RB11
30F4013
RB0
RB1
RB2 1k
RB3 1k
RB4 1k
RB5 1k
RB9 1k
RB10 1k
1k
1k
Figura 3.1
Programa:
/*
p04.c
*/
#include <p30f4013.h>
if(PORTBbits.RB11 == 0){
PORTBbits.RB12 = 1;
PORTBbits.RB0 = 1;
PORTBbits.RB1 = 1;
PORTBbits.RB2 = 1;
PORTBbits.RB3 = 1;
PORTBbits.RB4 = 1;
PORTBbits.RB5 = 1;
PORTBbits.RB9 = 1;
PORTBbits.RB10 = 1;
}
else{
PORTBbits.RB12 = 0;
PORTBbits.RB0 = 0;
PORTBbits.RB1 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB3 = 0;
PORTBbits.RB4 = 0;
PORTBbits.RB5 = 0;
PORTBbits.RB9 = 0;
PORTBbits.RB10 = 0;
}
}
}
//********************************************************
Es importante observar en un osciloscopio cada uno de las patitas de salida que se activan en el
programa y discutir los resultados en clase.
_FGS(CODE_PROT_OFF);
//*******************************************************
Igual que con el programa anterior, observar la forma de onda en osciloscopio en cada uno de las
patitas de salida activadas por el programa y discutir los resultados y compararlos con el
programa anterior.
Fin de prctica
Fcy = Frecuencia de instruccin. El dspic realiza una instruccin cada 4 Fosc. Por lo tanto
el Fcy=Fosc/4 = 16 Mhz. En este ejemplo. Generalmente a lo largo de todas las
prcticas estos son los valores que usaremos.
Esto significa que el dspic con un cristal de 4 mhz y un multiplicador de frecuencia de 16, es
capaz de realizar 16 millones de instrucciones por segundo. O dicho de otra manera, es capaz de
realizar una instruccin cada 62.5 ns.
El dspic tiene tres timers: Timer 1, Timer 2 y Timer 3. En esta prctica usaremos el timer 1.
El timer 1, es de 16 bits, eso significa que puede contar desde 0 a (2^16)-1, Cada cuenta tarda un
tcy, por lo tanto, contar de 0 a (2^16)-1, tarda 0.001,023 segundos.
Una de las funciones del timer es que el microcontrolador espere un cierto tiempo (retardo o
tiempo muerto) antes de realizar alguna accin. Para poder crear retardos ms largos se usa un
prescaler, que en realidad es un divisor de frecuencia.
Fcy = 16,000,000
Con un prescaler de 256
16,000,000/256 = 62,500
Esto significa que el timer hace 62,500 en un segundo, usando el prescaler de 256
1000 ms = 62500
------ --------
120 x
Algoritmo: Generar una onda cuadrada que dure 120 ms entregando seal (uno lgico) y 120 ms
sin entragar seal (cero lgico).
Programa:
/*
p05.c
*/
#include <p30f4013.h>
while(1){
LATB=0x0001;
retardo120ms();
LATB=0x0000;
retardo120ms();
}
}
//********************************************************
En este ejemplo el cpu se queda esperando a que la bandera T1IF cambie su estado de cero a uno
para salir del ciclo while. En otras palabras la condicin del ciclo while(IFS0bits.T1IF==0);
va a ser verdadera mientras no termine de contar el timer, en el momento que el timer llega a
7500, la bandera cambia a uno, y la condicin del ciclo se vuelve falsa y se sale del ciclo y se
regresa de la funcin al programa principal.
Proyectos:
Proyecto 1: Construir un generador de onda cuadrada. Que tenga dos botones, con el botn 1,
entregue una onda cuadrada con un periodo de 40 ms y con el botn dos una frecuencia de 20 ms
Proyecto 2: Construir un reloj digital que muestre segundos (del 0 al 9) y dcimas de segundo,
tambin del cero al nueve. Es de esta manera para solo usar dos displays de 7 segmentos.
Proyecto 3: Modificar la prctica 3, para que se eviten los rebotes del push-button usando un
retardo de 120 ms.
+
+ 1K
+v
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
Push1
dsPIC30F4013
17
10
11
12
13
14
15
16
18
19
20
2
6
7
1
3
4
5
8
9
1K
10K 1k Led 2
+ 1k
+v
Led 1
GND
+
Push2
Figura 5.1
2 Push-buttons
3 Resistencias de 1k
1 Led
Conexiones
3. Se conecta la patita 18 del 4013 al led1 a travs de una resistencia de 1k. La conexin
restante del led 1 se conecta a tierra
El programa:
//interrupciones:1.c
//Ejemplo interrupciones
#include <p30f4013.h>
#define fcy 16000000
//Bits de Configuracion
_FOSC(CSW_FSCM_OFF & XT_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_16 & MCLR_DIS);
_FGS(CODE_PROT_OFF);
int main(void);
void retardo_ms( unsigned int ms );
void confInterrup(void);
int main(void){
TRISD = 0xfdf7; // 1101 1111 0111
LATDbits.LATD3=1;
retardo_ms(120);
LATDbits.LATD3=0;
confInterrup();
}
}
void __attribute__((__interrupt__)) _INT0Interrupt(void){
LATDbits.LATD3=1;
retardo_ms(2000);
retardo_ms(2000);
LATDbits.LATD3=0;
IFS0bits.INT0IF = 0;
}
void __attribute__((__interrupt__)) _INT1Interrupt(void){
LATDbits.LATD9=1;
retardo_ms(2000);
retardo_ms(2000);
LATDbits.LATD9=0;
IFS1bits.INT1IF = 0;
}
void confInterrup( void ){
INTCON2bits.INT0EP = 1; //Interrupcion 0 Se activa en flanco negativo
INTCON2bits.INT1EP = 1; //Interrupcion 1 Se activa en flanco negativo
El programa
El programa tiene una funcin que configura la interrupcin 0 (INT0) y la interrupcin 1 (INT1).
A INT0 la configura con prioridad 4 y a INT1 con prioridad 6.
La funcin principal tiene un ciclo infinito vaco (Sin instrucciones) que siempre se va a estar
ejecutando. En otras palabras la nica tarea que ejecuta el programa principal es estar dando
vueltas en un ciclo infinito. Pero cuando una interrupcin se activa, El cpu abandona el ciclo
infinito y atiende la interrupcin ejecutando el cdigo que contiene.
Al terminar esta prctica se recomienda hacer un reporte en el que se expliquen los resultados al
presionar en diferente orden los push-buttons 1 y 2..
Es importante comentar que estas son interrupciones externas. Tambin hay interrupciones
usadas por dispositivos como el timer, etc.
Fin de la prctica.
Proyectos:
Construir un robot seguidor de lneas
Prctica 6, el UART
El objetivo de esta prctica es que el estudiante aprenda el uso del UART.
35
34
24
28
39
38
37
33
31
30
29
27
25
23
21
36
32
26
22
Rx
Tx
dsPIC30F4013
17
13
11
12
14
16
18
20
10
15
19
2
6
7
1
4
5
3
8
9
35
34
24
40
28
39
38
37
33
31
30
29
27
25
23
21
36
32
26
22
Rx
Tx
dsPIC30F4013
17
13
10
11
12
14
16
18
20
15
19
7
6
2
8
1
9
3
Figura 6.1. No se muestran el resto de las conexiones para hacer el esquema fcil de entender.
Los leds se conectan en cada 4013 a los puertos RB1 y RB2, el push-button se conecta a RF0. El
Tx de un microcontrolador se conecta al Rx del otro microcontrolador. En ambos chips, se usa el
UART 1
Lista de material
Adems del material requerido para dos sistemas mnimos:
2 Push-button
4 Leds
4 Resistencias de 1k
Como se ve en los apuntes, el 4013, posee dos UARTS, para sta prctica usaremos el UART1, y
por lo tanto es el que vamos a configurar.
El U1BRG es un registro de 16 bits (0-65535). En este registro se pone un nmero calculado con
la siguiente ecuacin:
Baud rate = Fcy/(16*(BRG+1))
Ejemplo:
U1BRG = (16000000/(16*9600))-1
U1BRG = 104.166-1 = 103.166
Error = (9615.38-9600)/9600
Error = 0.160256 %
En las tablas completas se puede ver que con algunos Fcy se puede lograr cero error, pero a
cambio se reducen los mips. En aplicaciones en que es importante tener velocidades de
transmisin exactas, y no es crtico la velocidad de procesamiento, se puede usar el Fcy, para cero
error del Baud rate.
.Figura 6.2
La configuracin siguiente tiene que ver con el modo de transmisin y se realiza usando el
registro U1MODE. Slo configuraremos las opciones usadas en esta prctica y que son 8 bits no
paridad y un bit de parada que es modo de transmisin ms usado y que tambin se le conoce
como N-8-1.
Como se puede ver en los apuntes, el bit 15 de U1MODE habilita el UART1, eso significa que
los otros dispositivos que comparten las mismas patitas quedan deshabilitados.
Los bits del 1 al 2 configuran el tamao en bits del byte y la paridad, como el byte lo
necesitamos de 8 bist y sin paridad, a estos bits les asignamos un cero.
Y por ltimo necesitamos un bit de alto, que se define en el bit cero del U1MODE.
Ya podemos configurar el U1MODE
El UART empieza a transmitir cuando se le asigna un uno a UTXEN (Bit 10) del registro
U1STA
U1STAbits.UTXEN = 1; // Habilita la transmisin
El programa:
/*
uasrt_1.c
Ejemplo de UART
*/
#include <p30f4013.h>
int configura_UART1();
int main(void);
int main(void){
char c1;
ADPCFG = 0xFFFF; //Todas entradas digitales
configura_UART1();
while(1){
if(U1STAbits.URXDA==1){ // Hay datos disponibles en buffer de
recepcion?
c1 = U1RXREG; // Si es verdad, lee el dato
if(c1==1){ // Si es un 1
LATBbits.LATB1=1; // Prende RB1
LATBbits.LATB2=0; // Apaga RB2
}
if(c1==2){ // Si es un 2
LATBbits.LATB1=0; // Apaga RB1
LATBbits.LATB2=1; // Prende RB2
}
}
if(PORTFbits.RF0==0) // Si el pushboton est presionado
if(U1STAbits.UTXBF==0) // If transmit buffer is not full?
U1TXREG = 1; // Pone un 1 en el transmit
buffer
if(PORTFbits.RF0==1) // Si el pushboton es 1
if(U1STAbits.UTXBF==0) // Si hay espacio en el buffer de
transmision
U1TXREG = 2; // Pone un 2 en el buffer de
transmisin
}
}
int configura_UART1(){
U1BRG = 103; // Baudrate 9600 @ 16 Mhz Fcy
U1STA = 0; // Limpar registro de control y status
U1MODE = 0x8000; // Se habilita el uart y N-8-1
Fin de prctica.
Proyectos sugeridos:
1. Construir un mdulo que tenga un microcontrolador y un LCD. La funcin de ste
modulo ser que despliegue en el LCD los caracteres recibidos en el puerto serie.
Conceptos bsicos:
El 30F4013 tiene un DAC de 12 bits, este convertidor est orientado a precisin ms que a
velocidad. En contraste la serie 30F dispone de microcontroladores con DACs de 10 bits. Estos
convertidores analgico-digitales estn orientados a velocidad.
Tiempo de Tiempo de
muestreo conversin
Figura 7.1: En la conversin analgica-digital, el convertidor distingue dos tiempos. El tiempo de
muestreo que es el tiempo que dura le convertidor conectado a la seal, y el tiempo de
conversin, que es el tiempo que le toma al convertidor convertir la seal muestreada a digital.
Configuracin:
Primero definimos como va a iniciar el muestreo, tenemos dos opciones para que comience el
muestreo, cuando ponemos el bit SAMP =1, o que el muestreo inicie inmediatamente despus
que la conversin finaliza. Esta configuracin se define con el bit ASAM del registro ADCON1
Elegiremos el bit SAMP como fuente de disparo de fin del periodo de muestreo e inicio del
periodo de conversin.
ADCON1bits.SSRC =0; //Cuando el bit SAMP == 0, termina el muestreo
// e inicia la conversin.
Se tienen 2 conjuntos de entradas, MUXA y MUXB, Para esta prctica utilizaremos el MUXA.
Por lo tanto estableceremos la configuracin del MUXA, para realizar esta configuracin se usa
el registro ADCHS.
Adems de determinar cero entradas para entrada secuencial, tambin deshabilitamos el muestreo
secuencial.
ADCSSL = 0; //Cero entradas para muestreo secuencial (scanning)
Adems de determinar cero entradas para entrada secuencial, tambin deshabilitamos el muestreo
secuencial.
ADCON2bits.CSCNA =0; //Muestreo secuencial (Scan) deshabilitado.
Se ponen como referencia positiva AVdd y como referencia negativa AVss, que son las
alimentaciones del mdulo ADC.
ADCON2bits.VCFG =0; //Referencia positiva=AVdd, Referencia negativa=AVss.
Los resultados del la conversin se guardan en el registro ADCBUF, que tiene 16 palabras (16
bits). Las palabras se llaman ADCBUF0, ADCBUF1...ADCBUF15. Este registro para algunas
aplicaciones muy particulares se puede dividir en 2 de registros de 8 palabras.
El ADC genera una interrupcin cada n conversiones. Para especificar n, se usa el conjunto de
bits SMPI en ADCON2. Cuando se necesita que el resultado se guarde en la primera palabra
(ADCBUF0), luego la 2 conversin en ADCBUF1, hasta ADCBUF(n-1). Para ir llenando el
ADCBUF, se debe generar una interrupcin cada n conversiones.
Establecemos que cada que se genere una interrupcin despus de cada conversin. De esta
forma, el resultado de cada cada una de las conversiones se guarda en ADCBUF0.
ADCON2bits.SMPI =0; //Despus de una conversin se genera la interrupcin.
Como se tienen dos conjuntos de entradas, el MUXA y el MUXB, se puede elegir que se tomen
muestras en A y luego en B, esto se hace con el bit ALTS.
El convertidor ADC usa un reloj que puede ser derivado del reloj del sistema o del reloj interno
del chip. Para elegirlo se usa el bit ADRC localizado en el ADCON3.
Hacemos la configuracin, para que el reloj del ADC sea derivado del reloj principal del sistema.
ADCON3bits.ADRC =0; //Reloj del ADC es derivado del reloj sistema
Tad = Periodo del reloj del ADC, que se deriva del reloj principal o del reloj interno, pero tiene
un mnimo, que para el 4013 el Tad debe ser mayor a 667 ns.
Al definir el Tad debemos tener mucho cuidado de cumplir con el lmite. Por ejemplo si elegimos
un Tad = 2 Tcy, y tenemos un Fosc = 64Mhz, el Tad = 2*62.5ns = 125ns, que es mucho menor
al mnimo permitido.
Con 32 Tcy, obtenemos un Tad de 32*62.5 = 2000 ns. Que ya est dentro del lmite de 667 ns,
pero que puede ser alto para nuestra aplicacin.
Ejemplo:
Tad = 667ns
Tcy = 33.33 ns
667/33.33 = 20.012
20.012*2 = 40.024
40.024-1
= 39
Por lo tanto en ADCS se pone un 39
Como se puede observar, el Tad calculado es el mnimo posible que cumple la especificacin.
El registro ADCON3 contiene el conjunto de bits SAMC, usados para especificar el tiempo que
dura el muestreo para automatizacin de este proceso, pero como este ejemplo es una conversin
analgicadigital manual, pues estos bits no los usamos. En otra prctica retomaremos la
configuracin de estos bits.
Material
Adems del material del sistema mnimo:
AVSS
AVDD + +
+v
LCD
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
dsPIC30F4013
17
10
11
12
13
14
15
16
18
19
20
2
6
7
1
4
5
10K 1k Led 1
1k
+ GND
+v
Figura 7.2. Diagrama del circuito de la prctica. Se puede observar como el mdulo LCD se
conecta al circuito a travs del uart2.
El circuito se arma de acuerdo a la figura 7.2. El mdulo del LCD es un proyecto anterior que ya
debe estar bien depurado.
Es importante observar que se han conectado AVdd y AVss al voltaje positivo y negativo
respectivamente. AVdd y AVss son la alimentacin del mdulo ADC
El programa:
/* adc_12bits_1.c
Usa UART2
Muestrea el canal AN8/RB8
*/
#include <p30f4013.h>
#include <math.h>
int main(void){
unsigned int letra=0, i=0, ADCValue=0, t;
float volts;
TRISD=0xFFF7; //0111 Solo RD3 como salida
LATDbits.LATD3=1; //Solo se prende el led RD3
retardo_ms(100);
LATD=0x0000; //Apaga el led RD3
retardo_ms(100);
LATD=0x0008; //Solo se prende el led RD3
retardo_ms(5);
configura_UART2();
adc_ini();
ADCON1bits.ADON = 1; //Prende ADC
uart_write(254); // c'odigo para limpiar lcd
while(1){
ADCON1bits.SAMP = 1; //Inicia muestreo
retardo_ms(1);
ADCON1bits.SAMP = 0; //Finaliza muestreo
while(!ADCON1bits.DONE); //Se ha realizado la conversin?
ADCValue = ADCBUF0; //Si entonces copia el valor ADCValue
miles = dato/1000;
digito = miles+48;
uart_write(digito);
retardo_ms(5);
dato = dato-miles*1000;
centenas = dato/100;
digito = centenas+48;
uart_write(digito);
decenas = dato/10;
digito = decenas+48;
uart_write(digito);
retardo_ms(5);
dato = dato-decenas*10;
digito = dato+48;
uart_write(digito);
retardo_ms(5);
}
void adc_ini(void){
//Configura el modulo A/D
TRISB = 0xFFFF; //Todas Entradas
ADPCFG = 0x0000; //Todas Entradas Analgicas
//ADCON1 = 0x0000;
ADCON1bits.ASAM =0; //El muestreo inicia cuando el bit SAMP == 1
ADCON1bits.SSRC =0; //Cuando bit SAMP == 0, termina el muestreo
// e inicia la conversin
ADCHSbits.CH0NA =0; // Entrada negativa del canal 0 es VREF-
ADCHSbits.CH0SA =8; // Entrada positiva del canal 0 es RB8/AN8
//ADCHS = 0x0008; //RB8/AN8 es entrada analogica
ADCSSL = 0; //No hay entradas para muestreo secuencial
ADCON2bits.CSCNA =0; //Muestreo secuencial (Scan) deshabilitado.
ADCON2bits.VCFG =0; //Referencia positiva=AVdd, Referencia
// negativa=AVss.
ADCON2bits.BUFM =0; //Configurado como un buffer de 16 palabras.
ADCON2bits.SMPI =0; //Despus de una conversin se genera la int.
ADCON2bits.ALTS =0; //Slo se muestrea el MUXA.
Proyectos:
1. Construir un termmetro digital usando el LM35 cualquier otro sensor de temperatura y
mostrar la temperatura en un LCD
Para esta prctica usaremos el microcontrolador 30F3011 que est diseado para control de
motores y posee adems de los mdulos de control de motores un convertido analgico de 10
bits.
Material
1 Resistencia variable de 10 k, se recomienda de precisin.
1 Dispositivo de visualizacin para poder observar los resultados. Este dispositivo lo
podemos construir en el mismo protoboardcon un LCD. En ese caso se necesita el LCD
y el cdigo para su control. Otra opcin puede ser mostrar el resultado en forma binaria
usando leds. En esta prctica usaremos un LCD que recibe los datos a mostrar a travs del
UART de un microcontrolador.
Para el armado seguiremos el diagrama de la figura 8.1. Conectaremos a los puertos del
RB0/AN0 al RB8/AN8 aquellos voltajes que pretendamos medir y observar en la LCD. En el
diagrama se puede observar que RB0/AN0, RB1/AN1, RB2/AN2 y RB7/AN7 estn conectados
a la alimentacin positiva, y RB3/AN3, RB4/AN4, RB5/AN5 y RB8/AN8 estn conectados a
tierra. RB8/AN8 est conectado a un divisor de voltaje.
AVSS
AVDD + +
+v
LCD
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
dsPIC30F3011
17
10
11
12
13
14
15
16
18
19
20
2
6
7
1
3
4
5
8
9
10K 1k Led 1
1k
+ GND
+v
Figura 8.1
Primero definimos como va a iniciar el muestreo, tenemos dos opciones para que comience el
muestreo, cuando ponemos el bit SAMP =1, o que el muestreo inicie inmediatamente despus
que la conversin finaliza. Esta configuracin se define con el bit ASAM del registro ADCON1
Elegiremos el bit SAMP como fuente de disparo de fin del periodo de muestreo e inicio del
periodo de conversin.
ADCON1bits.SSRC =0; //Cuando el bit SAMP == 0, termina el muestreo
// e inicia la conversin.
Se tienen 2 conjuntos de entradas, MUXA y MUXB, Para esta prctica utilizaremos el MUXA.
Por lo tanto estableceremos la configuracin del MUXA, para realizar esta configuracin se usa
el registro ADCHS.
Se ponen como referencia positiva AVdd y como referencia negativa AVss, que son las
alimentaciones del mdulo ADC.
ADCON2bits.VCFG =0; //Referencia positiva=AVdd, Referencia negativa=AVss.
Los resultados del la conversin se guardan en el registro ADCBUF, que tiene 16 palabras (16
bits). Las palabras se llaman ADCBUF0, ADCBUF1...ADCBUF15. Este registro para algunas
aplicaciones muy particulares se puede dividir en 2 de registros de 8 palabras.
El ADC genera una interrupcin cada n conversiones. Para especificar n, se usa el conjunto de
bits SMPI en ADCON2. Cuando se necesita que el resultado se guarde en la primera palabra
(ADCBUF0), luego la 2 conversin en ADCBUF1, hasta ADCBUF(n-1). Para ir llenando el
ADCBUF, se debe generar una interrupcin cada n conversiones.
Establecemos que cada que se genere una interrupcin despus de cada conversin. De esta
forma, el resultado de cada cada una de las conversiones se guarda en ADCBUF0.
ADCON2bits.SMPI =0; //Despus de una conversin se genera la interrupcin.
Como se tienen dos conjuntos de entradas, el MUXA y el MUXB, se puede elegir que se tomen
muestras en A y luego en B, esto se hace con el bit ALTS.
Con esto se termina de configurar el registro ADCON1. Se puede observar que para muestreo
manual solamente se usa una entrada analgica, adems podemos observar que todo ADCON1 es
cero, entonces si lo ponemos a cero, no es necesario configurar cada conjunto de bits, sin
embargo, en este ejemplo lo configuramos por partes por cuestin didctica.
El convertidor ADC usa un reloj que puede ser derivado del reloj del sistema o del reloj interno
del chip. Para elegirlo se usa el bit ADRC localizado en el ADCON3.
Hacemos la configuracin, para que el reloj del ADC sea derivado del reloj principal del sistema.
ADCON3bits.ADRC =0; //Reloj del ADC es derivado del reloj sistema
Tad = Periodo del reloj del ADC, que se deriva del reloj principal o del reloj interno, pero tiene
un mnimo, que para el 4013 el Tad debe ser mayor a 667 ns.
Al definir el Tad debemos tener mucho cuidado de cumplir con el lmite. Por ejemplo si elegimos
un Tad = 2 Tcy, y tenemos un Fosc = 64Mhz, el Tad = 2*62.5ns = 125ns, que es mucho menor
al mnimo permitido.
Con 32 Tcy, obtenemos un Tad de 32*62.5 = 2000 ns. Que ya est dentro del lmite de 667 ns,
pero que puede ser alto para nuestra aplicacin.
Ejemplo:
Tad = 667ns
Tcy = 33.33 ns
667/33.33 = 20.012
20.012*2 = 40.024
40.024-1
= 39
Por lo tanto en ADCS se pone un 39
El registro ADCON3 contiene el conjunto de bits SAMC, usados para especificar el tiempo que
dura el muestreo para automatizacin de este proceso, pero como este ejemplo es una conversin
analgicadigital manual, pues estos bits no los usamos. En otra prctica retomaremos la
configuracin de estos bits.
El programa:
/* adc_10bits_5.c
Status = Ok.
Programa ejemplo de 10 bits
Este programa muestrea(SCANNING) de AN0-AN15
De forma secuencial y a traves de SH0
Muestra el resultado en LCD remoto de 6 valores
El inicio de muestreo = Manual
Finalizacin de muestreo = Manual
Usa UART2, para que quede libre PGC y PGD
int main(void){
retardo_ms(100);
miles = dato/1000;
digito = miles+48;
uart_write(digito);
retardo_ms(5);
dato = dato-miles*1000;
centenas = dato/100;
digito = centenas+48;
uart_write(digito);
retardo_ms(5);
dato = dato-centenas*100;
decenas = dato/10;
digito = decenas+48;
uart_write(digito);
retardo_ms(5);
dato = dato-decenas*10;
digito = dato+48;
uart_write(digito);
retardo_ms(5);
}
void mensaje_uart(char texto[]){
int i;
Fin de prctica
El objetivo de esta prctica es que el estudiante se entrene en el uso del convertidor analgico-
digital haciendo mltiples muestras, con todo el proceso totalmente automtico. Esta es la manera
ms adecuada para realizar conversiones analgico-digitales donde se muestrean mltiples
seales y se busca alto desempeo.
Tambin usaremos el microcontrolador 30F3011 que est diseado para control de motores y
posee adems de los mdulos de control de motores un convertido analgico de 10 bits bastante
rpido, Tad mnimo = 84 ns.
Material
1 Resistencia variable de 10 k, se recomienda de precisin.
1 Dispositivo de visualizacin para poder observar los resultados. Este dispositivo lo
podemos construir en el mismo protoboardcon un LCD. En ese caso se necesita el LCD
y el cdigo para su control. Otra opcin puede ser mostrar el resultado en forma binaria
usando leds. En esta prctica usaremos un LCD que recibe los datos a mostrar a travs del
UART de un microcontrolador (mdulo construido como proyecto).
Para el armado seguiremos el diagrama de la figura 8.1 (De la prctica anterior). Conectaremos a
los puertos del RB0/AN0 al RB8/AN8 aquellos voltajes que pretendamos medir y observar en la
LCD. En el diagrama se puede observar que RB0/AN0, RB1/AN1, RB2/AN2 y RB7/AN7 estn
conectados a la alimentacin positiva, y RB3/AN3, RB4/AN4, RB5/AN5 y RB8/AN8 estn
conectados a tierra. RB8/AN8 est conectado a un divisor de voltaje.
Primero definimos como va a iniciar el muestreo, tenemos dos opciones para que comience el
muestreo, cuando ponemos el bit SAMP =1, o que el muestreo inicie inmediatamente despus
que la conversin finaliza. Esta configuracin se define con el bit ASAM del registro ADCON1
Elegiremos el bit SAMP como fuente de disparo de fin del periodo de muestreo e inicio del
periodo de conversin.
ADCON1bits.SSRC =0b111; //Contador interno termina muestreo e inicia
//conversin
Se tienen 2 conjuntos de entradas, MUXA y MUXB, Para esta prctica utilizaremos el MUXA.
Por lo tanto estableceremos la configuracin del MUXA, para realizar esta configuracin se usa
el registro ADCHS.
Se ponen como referencia positiva AVdd y como referencia negativa AVss, que son las
alimentaciones del mdulo ADC.
ADCON2bits.VCFG =0; //Referencia positiva=AVdd, Referencia negativa=AVss.
Los resultados del la conversin se guardan en el registro ADCBUF, que tiene 16 palabras (16
bits). Las palabras se llaman ADCBUF0, ADCBUF1...ADCBUF15. Este registro para algunas
aplicaciones muy particulares se puede dividir en 2 de registros de 8 palabras.
El ADC genera una interrupcin cada n conversiones. Para especificar n, se usa el conjunto de
bits SMPI en ADCON2. Cuando se necesita que el resultado se guarde en la primera palabra
(ADCBUF0), luego la 2 conversin en ADCBUF1, hasta ADCBUF(n-1). Para ir llenando el
ADCBUF, se debe generar una interrupcin cada n conversiones.
Establecemos que cada que se genere una interrupcin despus de cada conversin. De esta
forma, el resultado de cada cada una de las conversiones se guarda en ADCBUF0.
ADCON2bits.SMPI =0xF; // Una interrupcin cada 16 muestras
Como se tienen dos conjuntos de entradas, el MUXA y el MUXB, se puede elegir que se tomen
muestras en A y luego en B, esto se hace con el bit ALTS.
Con esto se termina de configurar el registro ADCON1. Se puede observar que para muestreo
manual solamente se usa una entrada analgica, adems podemos observar que todo ADCON1 es
cero, entonces si lo ponemos a cero, no es necesario configurar cada conjunto de bits, sin
embargo, en este ejemplo lo configuramos por partes por cuestin didctica.
El convertidor ADC usa un reloj que puede ser derivado del reloj del sistema o del reloj interno
del chip. Para elegirlo se usa el bit ADRC localizado en el ADCON3.
Hacemos la configuracin, para que el reloj del ADC sea derivado del reloj principal del sistema.
ADCON3bits.ADRC =0; //Reloj del ADC es derivado del reloj sistema
Tad = Periodo del reloj del ADC, que se deriva del reloj principal o del reloj interno, pero tiene
un mnimo, que para el 4013 el Tad debe ser mayor a 667 ns.
Con 32 Tcy, obtenemos un Tad de 32*62.5 = 2000 ns. Que ya est dentro del lmite de 667 ns,
pero que puede ser alto para nuestra aplicacin.
Ejemplo:
Tad = 667ns
Tcy = 33.33 ns
667/33.33 = 20.012
20.012*2 = 40.024
40.024-1
= 39
Por lo tanto en ADCS se pone un 39
Como se puede observar, el Tad calculado es el mnimo posible que cumple la especificacin.
El registro ADCON3 contiene el conjunto de bits SAMC, usados para especificar el tiempo que
dura el muestreo para automatizar este proceso. En la siguiente figura se muestra un fragmento
de la hoja de datos.
El programa:
/* adc_10bits_6.c
Status Ok
Muestrea 16 canales
De forma secuencial y a traves de SH0 de forma automtica
int main(void){
retardo_ms(100);
LATD=0x0000; //Apaga el led RD3
retardo_ms(100);
LATD=0x0008; //Solo se prende el led RD3
retardo_ms(5);
configura_UART2();
adc_ini();
ADCON1bits.ADON = 1; //Prende ADC
uart_write(254); // c'odigo para limpiar lcd
while(1){
IFS0bits.ADIF = 0;
while(IFS0bits.ADIF); //Se han realizado las muestras?
uart_write(128);
muestra_en_lcd_remoto((ADCBUF3/1024.0)*500);
uart_write(133);
muestra_en_lcd_remoto((ADCBUF4/1024.0)*500);
miles = dato/1000;
digito = miles+48;
uart_write(digito);
retardo_ms(5);
dato = dato-miles*1000;
centenas = dato/100;
digito = centenas+48;
uart_write(digito);
retardo_ms(5);
dato = dato-centenas*100;
decenas = dato/10;
digito = decenas+48;
uart_write(digito);
retardo_ms(5);
dato = dato-decenas*10;
digito = dato+48;
uart_write(digito);
retardo_ms(5);
}
void adc_ini(void){
//Configura el modulo A/D
void configura_UART2(){
U2BRG = 103; // Baudrate 9600 @ Fcy=16Mhz
U2STA = 0; // Limpiar registro de control y status
U2MODE = 0x8000; // N-8-1
U2STAbits.UTXEN = 1; // Activa transmisin
}
void retardo_ms( unsigned int ms ){
unsigned int periodo= 0;
/* ensure Timer 1 is in reset state */
T1CON = 0;
TMR1 = 0;
IPC0bits.T1IP = 1;
periodo = ((fcy/256)*ms)/1000;
PR1 = periodo; //Set Timer 1 period register
IFS0bits.T1IF = 0; //Clear the timer1 interrupt status flag
IEC0bits.T1IE = 0; //Disable Timer1 interrupts
T1CON = 0x8030; //Configura T1CON=1000000000110000
while(IFS0bits.T1IF==0);
}
void retardo_us( unsigned int us ){
unsigned int periodo= 0;
/* ensure Timer 1 is in reset state */
T1CON = 0;
TMR1 = 0;
IPC0bits.T1IP = 1;
periodo = (fcy*us)/1000000;
PR1 = periodo; //Set Timer 1 period register
IFS0bits.T1IF = 0; //Clear the timer1 interrupt status flag
IEC0bits.T1IE = 0; //Disable Timer1 interrupts
T1CON = 0x8000; //Configura T1CON=1000000000000000
while(IFS0bits.T1IF==0);
}
Fin de prctica
Proyectos sugeridos:
Mejorar el robot seguir de lneas, para que sea capaz de aprender y adaptarse a diversas
intensidades de luz.
El mdulo de control de motores mediante PWM simplifica la tarea de generar pulsos modulados
en amplitud. El dsPIC30F3011 posee tres canales PWM cada uno con dos salidas. La familia 30F
posee varios modos de operacin, en sta prctica usaremos el modo Edge Aligned con Free
running, ver figura 10.1. En este modo el funcionamiento es como sigue:
Se guarda un nmero en el registro PTPER, este nmero corresponde al periodo de la seal
generada y se calcula de acuerdo a la siguiente ecuacin Fcy/(Fpwm*PTMR scaler)-1.
En los registros PDCx se guarda un nmero que corresponde al ciclo de trabajo (duty cycle)
deseado.
El temporizador genera pulsos que se van contando y almacenando en PTMR. La cuenta se
realiza de cero hacia hasta alcanzar el nmero guardado en el registro PTPER. Cuando la cuenta
coincide con el nmero almacenado en algn registro PDCx, en la patita de salida de ese canal x,
el voltaje cae a cero y as permanece. Cuando el periodo comienza de nuevo, la seal se eleva a
uno lgico (segn el voltaje de alimentacin), la figura 10.1 puede ayudar a entender este
proceso.
PTPER
PDC1
PDC2
Time
PWM1H
PWM2H
.
Figura 10.1
La prctica consiste en controlar un motor servo de marca parallax, aunque puede funcionar para
motores servo de otros marcas u otros modelos, slo es necesario ajustar el programa a las nuevas
especificaciones.
El motor servo parallax cuando recibe un ancho de pulso de trabajo de 1.5 ms se detiene frenado,
es decir la electrnica de control del motor hace que el motor haga fuerza para mantenerse en esa
posicin. Sin seal tambin se detiene pero sin freno.
1 motor servo
2 push-buttons
Algoritmo
Que el programa enve un pulso pwm de 20 ms (PWM3H), cambiando el ciclo de trabajo desde 0
a 2 ms por medio de dos push buttons. El push-button 1 aumenta el ciclo de trabajo de cero hasta
930 y el push-buton 2 reduce el ciclo de 930 hasta cero, para generar ciclos de trabajo de 0 ms
hasta 1.7 ms.
+
+v
40
39
PWM1L 38
PWM1H 37
PWM2L 36
6 PWM2H 35
7 PWM3L 34
8 PWM3H 33
32
31
30
29
28
27
26
25
24
23
22
21
dsPIC30F3011
17
10
11
12
13
14
15
16
18
19
20
2
1
4
5
10K Led 1
1k
+
+v
GND
Figura 10.2
El conjunto de bits PTOPS (7-4), son usados para definir el valor del postscaler, generalmente
estos bits se usan para cuestiones muy particulares. En esta prctica usaremos un postcaler 1:1
PTCONbits.PTOPS = 0b0000; //Postcaler 1:1
Y por ltimo tenemos los bits PTMOD(1-0) que definen el modo. El modo usado es free
running mode
PTCONbits.PTMOD = 0b00; //Free mode
El registro PTMR guarda el conteo. Para aseguararnos que empiece en un estado de reset, lo
fijamos a cero.
PTMRbits.PTMR = 0; //Time base count value, asegurar el estado de reset
Configurar el periodo:
El periodo est en funcin del Fcy y del prescaler. Para este ejemplo se necesita un periodo de 20
ms, y debido a que en la ecuacin el periodo est expresado en frecuencia, hacemos la
conversin.
Fpwm = 1/0.020 = 50
Ppwm = 50
PTPER = Fcy//(Fpwm*Prescaler))-1
PTPER = (16000000/(50*64))-1
PTPER = 4999
Los bits PEMODx especifca el modo de funcionamiento del par de salidas del canalx, este modo
puede ser en modo independiente en modo complementario. En modo independiente cada
salida PWMxL y PWMxH es independiente entre s, y en modo complementario, cuando una
est en alto, la otra est en bajo. Para el modo complementario es necesario configura el tiempo
muerto para evitar que en un instante de tiempo una seal estar bajando y la otra subiendo al
mismo tiempo.Para esta prctica usaremos el modo independiente
PWMCON1bits.PMOD3 = 1; //Modo independiente
Entonces habilitamos las patitas que nos interesan de canal 3 del mdulo PWM y
las que no las deshabilitamos.
PWMCON1bits.PEN3L = 0; //Se deshabilita la salida PWM3L
PWMCON1bits.PEN3H = 1; //Se habilita la salida PWM3H
El mdulo PWM posee OVDCON que permite que los valores generados por el propio PWM
sean ignorados y sustituidos por otros (Override). El conjunto de bits POVDxHy POVDxL
permiten detreminar que salida est bajo el control de PWM y cuales son sustituidos por
POVDxx. No usaremos la sustitucin de valores.
OVDCONbits.POVD3H = 1; //PWM3H no es sustituida por POUT4H
El programa:
/* pwm03.c
*/
#include <p30f3011.h>
//Bits de Configuracion
_FOSC(CSW_FSCM_OFF & XT_PLL16);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_16 & MCLR_DIS);
_FGS(CODE_PROT_OFF);
//Variables globales
long fcy = 16000000;
int main(void);
while(1){
if(PORTDbits.RD0==0 && PDC3<=950){
retardo120ms();
PDC3 += 50;
}
if(PORTDbits.RD1==0 && PDC3>=50){
retardo120ms();
PDC3 -= 50;
}
}
}
void init_pwm(void){
PTCONbits.PTEN = 1; //PWM time base is ON
PTCONbits.PTSIDL = 0; //PWM time base runs in CPU Idle mode
PTCONbits.PTOPS = 0b0000; //Postcaler 1:1
PTCONbits.PTCKPS = 0b11; //Prescaler = 1:64
PTCONbits.PTMOD = 0b00; //Free mode
PTMRbits.PTMR = 0; //PTMR es puesto a cero
PTPER = 4999; //Periodo = (Fcy/(Fpwm*Prescaler))-1
//Periodo=(fcy/(50*64))-1
//periodo = 20ms
PDC3 = 850; //Duty cycle = 1.7ms
PDC2 = 850; //Duty cycle = 1.7ms
//Config PWM3
PWMCON1bits.PMOD3 = 1; //Modo independiente
PWMCON1bits.PEN3L = 0; //Salida PWM3L deshabilitada
PWMCON1bits.PEN3H = 1; //Salida PWM3H habilitada
PWMCON1bits.PEN2L = 0;
PWMCON1bits.PEN2H = 1;
PWMCON1bits.PMOD2 = 1;
OVDCONbits.POVD2H = 1;
OVDCONbits.POVD2L = 0;
*/
}
Fin de prctica
Proyectos:
Mejorar el robot seguidor de pistas con la posibilidad de modificar las velocidades de los motores
usando PWM
Proyecto Final
Con los conocimientos adquiridos con este laboratorio se pueden ejecutar diversos proyectos
finales con alto grado de complejidad, algunos pueden ser.
Nota final: