热度 15
2012-9-20 09:23
5014 次阅读|
0 个评论
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次ADCRESULT0 值 //Voltage2 最后的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 ; uint16 voltagel2 ; 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 = adcregs.ADCRSULT0 ﹥﹥4; voltage2 = 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内部方框图】