打印
[MCU]

TMS320F28027之ADC学习笔记

[复制链接]
6320|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2020-12-2 09:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  学习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;
}

使用特权

评论回复
评论
18320836563 2022-7-5 09:36 回复TA
点赞 

相关帖子

沙发
kararingo| | 2022-5-10 17:39 | 只看该作者
感谢lz

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2038

主题

7363

帖子

10

粉丝