[原创] TMS320F28027之ADC学习笔记

lambo119   2015-10-24 17:26 楼主
         学习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.ADCINTFLGCLR.bit.ADCINT1 = 1;                //Clear ADCINT1 flag reinitialize for next SOC
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
  return;
}




回复评论 (4)

谢谢分享,期待有更多更深入的内容与大家探讨
点赞  2015-10-26 09:18
支持。。。。。。。。。。。。。。。
点赞  2015-10-26 12:07
引用: maylove 发表于 2015-10-26 09:18
谢谢分享,期待有更多更深入的内容与大家探讨

写的乱,写的浅,怕见笑,也没有别人写的详细
点赞  2015-10-26 19:47
很好啦,刚学这个。感觉DSP比ARM抽象。。
https://home.eeworld.com.cn/static/image/smiley/default/lol.gif
点赞  2017-5-4 21:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复