TMS320F28027之ADC学习笔记
学习tms320f28027已经有几个星期了,总结一些学习的经验来分享一下,之前也没写过博客,有些东西可能表达的不清楚,又因为是刚刚学习出错在所难免,现在学着试着写一下玩玩。
首先进入正题,我个人认为学习ADC需要的手册有以下几个,最重要的是《TMS320x2802x, 2803x Piccolo Analog-to-Digital Converter (ADC) and Comparator》,寄存器的讲解和操作都在这个手册里面,无论ADC怎么配置都离不开这个手册,一切答案都在这个手册中。另一个手册是《TMS320F2802xTMS320F2802xx Piccolo System Control and Interrupts》,这里面主要用到的是ADC中断的配置。
下面我就以一个简单的例子配置ADC单通道软件强制转换 ,配合程序来解释ADC配置的思路。
step 1:
InitSysCtrl(); // 系统初始化子程序,在DSP28_sysctrl.c中,PLL,关闭看门狗,使能外围模块
step 2:
InitPieCtrl(); //初始化PIE控制寄存器,恢复默认设置
IER = 0x0000;//CPU禁止使能
IFR = 0x0000;//清楚CPU所有中断标志
InitPieVectTable();//初始化PIE向量表
step 3:
//初始化ADC
EALLOW; //使能ADC模块的时钟
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();
EDIS;
step 4:
EALLOW; //这部分官方手册建议就按这个顺序配置
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference
AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG
EDIS;
DELAY_US(ADC_usDELAY); // Delay before converting ADC channels step 5:
EALLOW; AdcRegs.INTSEL1N2.bit.INT1E = 1; //使能 ADCINT1
//ADCSOCxCTL x可设置0--15,CHSEL 选择AD输入通道
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; //set SOC0 channel select to ADCINA0 选择AD通道
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0; //set SOC0 start trigger on software only 选择AD触发方式
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1) 配置转换时间
EDIS;
step 6:
// Enable ADCINT1 in PIE
PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable INT 1.1 in the PIE
IER |= M_INT1; // Enable CPU Interrupt 1
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
//Force start of conversion on SOC0
AdcRegs.ADCSOCFRC1.all = 0x01;
DELAY_US(1000000);//delay 1s 在死循环里面这样写就可以每1S就会强制ADC转换一次
}
//以下是中断服务函数
interrupt void adc_isr(void)
{
Voltage = AdcResult.ADCRESULT0; //读取AdcResult的值要与自己相对应配置的SOCx相对应,这个程序配置的是SOC0,所以要读取ADCRESULT0。
vol=Voltage*3.3/4096;
AdcRegs.ADCINT**CLR.bit.ADCINT1 = 1; //Clear ADCINT1 flag reinitialize for next SOC
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
return;
}
|