TMS320CF2812 ADC模块具有16路12位流水线模数转换模块(ADC).TMS320CF2812 DSP内部就有ADC转换资源。包含前段模拟多路复用器(MUX)采样保持S/H电路、转换内核、稳压器以及其他模拟支持电路。
数字电路包含可编程序列发生器、结果寄存器、模拟电路接口、器件外围总线接口已经其他片上模块的接口。模数转换
(ADC)模块可以直接用于电机或运动控制场合。
软件:软件立即启动(使用SOC的SEQn位)。
EVA:事件管理器A(在EVA中有多个事件源)。
EVB:事件管理器B(在EVB中有多个事件源)。
排序器可工作在启动/停止模式,允许多个按时间排序的触发源使转换同步。
EVA和EVB可分别独立地触发SEQ1和SEQ2(仅用在双排序器模式)。
外部:(ADC SOC)引脚。
模拟输入:0V―3V
初始化TMS320CF2812 DSP的ADC模块,以及转换程序。并且对所有模拟输入通道进行转换,转换的结果可以在RESULTSn寄存器中获得。使用的用户可以访问该寄存器。ADC以16状态排序器来实现操作,一旦排序到达EOS(序列的结束)时,转换结束,ADC转换程序实现如下:
//
//文件 Example_281xAdcSOC.c
//
//DSP2812 ADC 应用程序
//本学习应用程序,中断是要被使能,并且EVA设置SEQ1为产生一个周期的ADC SOC信号。
//
//变量:
//Voltage1[10] 最后的10次ADCRESULT0 值
//Voltage2[10] 最后的10次ADCRESULT1 值
//conversioncount 当前的转换结果计数次数0-9
//loopcount 空闲循环计数器
#include 〝DSP281x_Device.h 〞 //DSP281x headerfile
include file
#include 〝DSP281x_examples.h 〞 //DSP281x examples
include file
//程序中函数类型声明
interrupt vold adc_isr(void);
//本程序全局中变量:
uint16 loopcount;
uint16 conversioncount;
uint16 voltagel1[10];
uint16 voltagel2[10];
main()
{
//第一步:初始化系统控制PLL,watchDog,使能外设时钟
//本程序中的初始化系统控制函数可以在DSP281x_sysctrl.c找到
initsysctrl();
//对于本程序,设置HSPCLK为SYSCLKOUT/6(假设SYSCLKOUT为150Mhz,HSPCLK为25Mhz)
EALLOW;
//第二步:初始化GPIO
//该程序函数可以在DSP281x_piectrl.c文件中找到
initGpio();//本程序不需要这一步
//第三步清除所有中断,并初始化PIE向量表
//禁止CPU中断
DINT;
//初始化PIE控制寄存器到默认状态,所有PIE中断的默认状态为禁止,并且标志位被清除
//该程序函数可以在DSP281x_piectrl.c文件中找到
initipiectrl();
//禁止CPU中断,清除所有CPU中断标志
IER ﹦ 0X0000;
IER ﹦ 0X0000;
-
//使用指向外部中断服务程序(ISR)的指针初始化PIE向量表
//这将对所有表单元进行操作,即使本程序不使用的中断。这对于调试是很有用的
//外部中断服务程序(ISR)可以在DSP281x_defaultisr.c文件中找到
initipiectrl();
//在本程序使用的中断被重新影射到文件中的ISR函数
EALLOW; //在写EALLOW保护寄存器,该语句是必须的
pievecttable.ADCINT = &adc_isr;
EDIS; //当禁止写EALLOW保护寄存器,该语句是必须的
//第四步:初始化元件的外设
//下面的函数可以在DSP281x_initperipherals.c文件中找到
//initperipherals(); //本程序是不必需要的
initadc(); //本程序是要初始化ADC
//第五步:用户代码,使能中断
//使能PIE中的ADCINT
piectrlregs.PIEIER1.bit.INTx6 = 1;
IER ︳﹦M_INT1; //使能CPU中断1
EINT; //使能全局中断INTM
ERTM; //使能全局实时中断DBGM
Loopcount = 0;
conversioncount = 0;
//配置ADC
Adcregs.ADCMAXCONV.all = 0x0001; // 在设置SEQ1设置2个转换
Adcregs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // 设置ADCINA3作为第一次SEQ1转换
Adcregs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // 设置ADCINA2作为第二次SEQ1转换
Adcregs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // 设置EVASOC,从而开始SEQ1
Adcregs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // 设置SEQ1中断,(每一个EOS)
//配置EVA
//假如EVA时钟已经在initsysctrl()被使能
Evaregs.T1CMPR = 0x0080; // 设置T1比较值
Evaregs.T1PR = 0xFFFF; // 设置周期寄存器
Evaregs.T1CON.all = 0x1042; // 使能定时器1比较(向上计数模式)
//等待ADC中断
while(1)
﹛
loopcount++;
﹜
﹜
interrupt void adc_isr(void)
﹛
voltage1[conversioncount] = adcregs.ADCRSULT0 ﹥﹥4;
voltage2[conversioncount] = adcregs.ADCRSULT1 ﹥﹥4;
//如果已经记录40次转换,则需要重新开始
if(conversioncount == 9)
﹛
conversioncount = 0;
﹜
else conversioncount++;
//重新初始化下一个ADC序列
adcregs.ADCTRL2.bit.RST_SEQ1 = 0; //复位SEQ1
adcregs.ADCST.bit.INT_SEQ1_CLR = 1; //清除INT SEQ1 位
piectrlregs.PIEACK.all = PIEACK_GROUP1; //应答PIE的中断
return;
﹜
请点击链接下载【TMS320CF2812 DSP_ADC内部方框图】
文章评论(0条评论)
登录后参与讨论