// TI File $Revision: /main/6 $
// Checkin $Date: April 30, 2009 14:53:24 $
//###########################################################################
//
// FILE: Example_2803xAdcSoc.c
//
// TITLE: DSP2803x ADC Start-Of-Conversion (SOC) Example Program.
//
// ASSUMPTIONS:
//
// This program requires the DSP2803x header files.
//
// Make sure the CPU clock speed is properly defined in
// DSP2803x_Examples.h before compiling this example.
//
//
// $Boot_Table:
//
// While an emulator is connected to your device, the TRSTn pin = 1,
// which sets the device into EMU_BOOT boot mode. In this mode, the
// peripheral boot modes are as follows:
//
// Boot Mode: EMU_KEY EMU_BMODE
// (0xD00) (0xD01)
// ---------------------------------------
// Wait !=0x55AA X
// I/O 0x55AA 0x0000
// SCI 0x55AA 0x0001
// Wait 0x55AA 0x0002
// Get_Mode 0x55AA 0x0003
// SPI 0x55AA 0x0004
// I2C 0x55AA 0x0005
// OTP 0x55AA 0x0006
// eCANA 0x55AA 0x0007
// SARAM 0x55AA 0x000A <-- "Boot to SARAM"
// Flash 0x55AA 0x000B
// Wait 0x55AA Other
//
// Write EMU_KEY to 0xD00 and EMU_BMODE to 0xD01 via the debugger
// according to the Boot Mode Table above. Build/Load project,
// Reset the device, and Run example
//
// $End_Boot_Table
//
//
// Description:
//
// This example sets up the PLL in x12/2 mode.
//
// For 60 MHz devices (default)
// (assuming a 10Mhz input clock).
//
// Interrupts are enabled and the ePWM1 is setup to generate a periodic
// ADC SOC - ADCINT1. Two channels are converted, ADCINA4 and ADCINA2.
//
// Watch Variables:
//
// Voltage1[10] Last 10 ADCRESULT0 values
// Voltage2[10] Last 10 ADCRESULT1 values
// ConversionCount Current result number 0-9
// LoopCount Idle loop counter
//
//
//###########################################################################
// $TI Release: 2803x C/C++ Header Files V1.21 $
// $Release Date: December 1, 2009 $
//###########################################################################
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
// Prototype statements for functions found within this file.
interrupt void adc_isr(void);
void Adc_Config(void);
// Global variables used in this example:
Uint16 LoopCount;
Uint16 ConversionCount;
Uint16 Voltage1[10];
Uint16 Voltage2[10];
main()
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2803x_SysCtrl.c file.
InitSysCtrl();
// Step 2. Initialize GPIO:
// This example function is found in the DSP2803x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// Step 3. Clear all interrupts and initialize PIE vector table:
// 禁止所有中断
DINT;
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2803x_PieCtrl.c file.
InitPieCtrl();//关闭所有PIE中断,清除所有PIE标志
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in DSP2803x_DefaultIsr.c.
// This function is found in DSP2803x_PieVect.c.
InitPieVectTable();
// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
EALLOW; // This is needed to write to EALLOW protected register
PieVectTable.ADCINT1 = &adc_isr;
EDIS; // This is needed to disable write to EALLOW protected registers
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2803x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
InitAdc(); // For this example, init the ADC
// Step 5. User specific code, enable interrupts:
// Enable ADCINT1 in PIE
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable INT 1.1 in the PIE
IER |= M_INT1; // 打开中断1
EINT; // 允许全球中断 INTM
ERTM; //ST1中的DBGM清零允许实时调试
LoopCount = 0;
ConversionCount = 0;
// Configure ADC
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //ADCINT1 trips after AdcResults latch
//ADCCTL1:ADC控制寄存器1
//(15)RESET:写1复位ADC模块
//(14)ADCENABLE:ADC模块允许(写0禁止但不断电ADC,写1允许ADC转换)
//(13)ADCBSY:为1说明ADC忙
//(12~8)ADCBSYCHN:用来确定ADC当前正在转换的通道
//(7)ADCPWDN:为0时ADC时钟除bandgap&referencce全部断电
//(6)ADCBGPWD:为0:bandgap断电
//(5)ADCREFPWD,为0:Reference buffers断电
//(3)ADCREFSEL:内外部参考选择,为0为内部参考
//(2)INTPULSEPOS:中断何时产生(为0 :ADC开始转换时产生,为1:ADC转换完之前1个时钟周期产生)
//(1)VREFLOCONV:为1内部VREFLO连接到ADCINB5
//(0)TEMPCONV:为1内部温度传感器接到ADCINA5
AdcRegs.INTSEL1N2.bit.INT1E = 1; //Enabled ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //Disable ADCINT1 Continuous mode
AdcRegs.INTSEL1N2.bit.INT1SEL = 1; //setup EOC1 to trigger ADCINT1 to fire
//INTSELxNy:ADC中断来源选择寄存器
//(14)INTyCONT:中断脉冲产生设置(为0:除非ADCINTy flag清零ADCINTy产生中断;为1:只要有EOC信号就中断)
//(13)INTyE:INTy中断允许(为1允许)
//(12~8)INTySEL:ADCINTy的EOC信号来源
//(6)INTxCONT:中断脉冲产生设置(为0:除非ADCINTx flag清零ADCINTx产生中断;为1:只要有EOC信号就中断)
//(5)INTxE:INTx中断允许(为1允许)
//(4~0)INTxSEL:ADCINTx的EOC信号来源
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; //set SOC0 channel select to ADCINA4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 2; //set SOC1 channel select to ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; //set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts first then SOC1
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; //set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
//ADCSOCxCTL:ADCSOC0 - SOC15控制寄存器
//(15~11)TRIGSEL:SOC产生来源(软件,CPUtimer中断,PWM,XINT)
//(9~6)CHSEL:当SOCx产生的时候ADC转换通道选择(SIMULENx=0时单通道选择,SIMULENx = 1时,两对通道选择)
//(5~0)ACQPS:SOCx的采样保持窗口大小。(06h Sample window is 7 cycles long (6 + 1 clock cycles).)
EDIS;
// Assumes ePWM1 clock is already enabled in InitSysCtrl();
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group
EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount
//ETSEL:事件触发选择寄存器
//(15)SOCBEN:SOCB允许(为1:允许ADC在SOC脉冲来临时转换)
//(14~12)SOCBSEL:EPWMxSOCB来源选择(DCBEVT1,TBCTR = 0x0000,TBCTR = TBPRD,equal to CMPA,equal to CMPB)
//(11)SOCAEN:SOCA允许(为1:允许ADC在SOC脉冲来临时转换)
//(10-8)SOCASEL:EPWMxSOCA来源选择(DCBEVT1,TBCTR = 0x0000,TBCTR = TBPRD,equal to CMPA,equal to CMPB)
//(3)INTEN:EPWMx_INT中断产生允许(为1:允许)
//(2~0)INTSEL:EPWMx_INT中断来源选择(TBCTR = 0x0000,TBCTR = TBPRD,equal to CMPA,equal to CMPB)
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event
//ETPS:时间产生预分频寄存器
//(15~14)SOCBCNT:计数有多少次SOCB事件(一到3次)
//(13~12)SOCBPRD:设定多少次SOCB事件产生一个SOCB的脉冲
//(11~10)SOCACNT:计数有多少次SOCA事件(一到3次)
//(9~8)SOCAPRD:设定多少�