Está en la página 1de 2

/*

*
*
*
*
*

PROBLEMA ADC
Hacer un programa para que lea cinco seeles analogicas a travs de las entradas
ADCA5, ADCA2, ADCB6, ADCB1, ADCA0 en la secuencia enunciada y sacar el promedio y
si el valor supera el valor de 1000 prender un led con el GPIO27.
El ADC debe trabajar en MODO CONTINUO, Y EN CASCADA.
*/

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "lab4.h"
#include "monitorF28335.h"
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/(2*ADC_MODCLK2) = 150/(2*3) = 25.0 MHz
#define ADC_CKPS 0x0 // ADC module clock = HSPCLK/1
= 25.5MHz/(1) = 25.0 MHz
#define ADC_MODO 0x0 // 1 es simultneo 0 es secuencial
#define ADC_SHCLK 0x1 // S/H ancho en periodos ADC = 2 ciclos ADC
long int i,k;
long int A5;
long int A2;
long int B6;
long int B1;
long int A0;
double PROMED;

void main(void)
{
DINT;
//deshabilita interrupciones
DRTM;
//deshabilita interrupciones real time mode
InitSysCtrl();
//inicializa el sistema como PLL,clocks,watcgdog
EALLOW;
// varios registro de control estan protegidos contra la escritura por este mecanismo
// habilitamos este registro para poder escribir algunos otros registros
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // ADC_MODCLK=0x03
// HSPCLK = SYSCLKOUT/ADC_MODCLK = 25MHz
// HISPCP: High-Speed Peripheral Clock (HSPCLK) Prescaler Register
// HISPCP = 000, 001, 010, 011, 100, 110, 111
// HSPCLK = SYSCLKOUT/(HISPCP X 2)=150/(2*3)=25.0 MHz
// HSPCLK = SYSCLKOUT/(2*ADC_MODCLK2) = 150/(2*3) = 25.0 MHz
// HSPCLK : High speed peripheral clock, es el primer divisor de
// SYSCLKOUT, esta seal de
EDIS;

//habilita la proteccion contra escritura, por seguridad, de los registros


// protegidos por EALLOW

InitSciaGpio(); // inicializa los pines scia para ser usados con su funcin sci
InitPieCtrl();
//inicializa el apoyo de interrupcin de perifricos
IER = 0x0000;
//limpia mscara de interrupciones
IFR = 0x0000;
//limpia bandera de interrupciones
InitPieVectTable(); //inicializa tabla de interrupciones por defecto
InitAdc(); // inicializa ADC
GpioCtrlRegs.GPAPUD.bit.GPIO27 = 0; //habilitar resistencia pullup
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0; // activa GPIO27 como entrada o salida digital
GpioCtrlRegs.GPADIR.bit.GPIO27 = 1; // activa la direccion de GPIO27 como salida
// SI: GPADIR.bit.GPIO27 = 0 activa la direccion de GPIO27 como ENTRADA
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS; // ADC_CKPS=0x0 // ADC module clock = 25MHz
// ADCCLKPS: Divide el HSPCLK (High speed peripheral clock), para muestrear (periodo de muestreo)
// HSPCLK/[N*(ADCTRL1[7] + 1)]
// ADCTRL1[7]: 0:ADCCLK = Fclk/1; 1:ADCCLK = Fclk/2
// N=0000; HSPCLK/(ADCTRL1[7] + 1)
// N=0001; HSPCLK/[2*(ADCTRL1[7] + 1)]
// N=0010; HSPCLK/[4*(ADCTRL1[7] + 1)]
// ...
// N=1111; HSPCLK/[30*(ADCTRL1[7] + 1)]
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // ADC_SHCLK=0x1
// Modo Secuencial: Ancho del S/H = (2+ACQ_PS)*ADC clock en ns
// En modo simultneo sera: = (3+ACQ_PS)*ADC clock en ns
AdcRegs.ADCTRL3.bit.SMODE_SEL = ADC_MODO; // Secuencial
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;
// 1 Cascaded mode
// En este caso, como SEC_CASC=1; esta en modo cascada
// por lo que tenemos un solo secuenciador; SEQ1 and SEQ2 operate as a single 16-state sequencer (SEQ).
//Note: Possible values are: Channel select = 0 to 15; ADCMAXCONV = 0 to 15
// si hubise sido en modo dual: SEQ_CASC = 0; SEQ1 and SEQ2 operate as two 8-state sequencers.

AdcRegs.ADCTRL1.bit.CONT_RUN = 0;
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 0;

// Modo contnuo
// Deshabilitar Override, sin wrap around ADCRESULT

//establecemos el orden de conversion con ADCCHSELSEQ1, ADCCHSELSEQ2 (se puede usar hasta el ADCCHSELSEQ4)
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x5;
// 0101 = ADCA5
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2;
// 0010 = ADCA2
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0xE;
// 1110 = ADCB6
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x9;
// 1001 = ADCB1
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x0;
// 0000 = ADCA0
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x5; // Convertir y guardar 5canales
// para los canales ADCA5, ADCA2, ADCB6, ADCB1, ADCA0
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1; // Arranque inicial del ADC // 1111
EINT;
//habilita interrupciones
ERTM;
A5=
A2=
B6=
B1=
A0=

AdcRegs.ADCRESULT5>>4; //Leer resultados y lo almacena en A5


AdcRegs.ADCRESULT2>>4;
AdcRegs.ADCRESULT14>>4;
AdcRegs.ADCRESULT10>>4;
AdcRegs.ADCRESULT0>>4;

IniciarSerial(); //Inicializacin de los parmetros del puerto serial A


PROMED=(A5+A2+B6+B1+A0);
if(PROMED>1000)
{
GpioDataRegs.GPADAT.bit.GPIO27=1; // Salida en valor alto, prende el led
}
else
{
GpioDataRegs.GPADAT.bit.GPIO27=0; // Salida en bajo
// esto deberia funcionar, pero en la practica es necesario usar:
// GpioDataRegs.GPACLEAR.bit.GPIO27 = 1 // apaga el led
}
}