DSP TMS320F28027 ADC定时采样功能实现

DSP TMS320F28027 ADC定时采样功能实现

一、TMS320F28027 ADC概念

1、ADC特性

       AD 转换器(ADC)将模拟量转换为数字量通常要经过 4 个步骤: 采样、 保持、量化和编码。 所谓采样即是将一个时间上连续变化的模拟量转换为时间上离散变化的模拟量。
       以下为TMS320F28027ADC的一些基本特性。

12位双采样保持电路;
● 同步采样模式或顺序采样模式;
● 模拟输入量:0V~3.3V(固定的),或者VREFHI~VREFLO(比例模式);
● 多路复用输入16个通道;
● 16个SOC(Star-of-Conversion)配置;
● 16个结果寄存器(可单独寻址);
● 多个触发源
	-- S/W 软件立即启动
	-- ePWM 17 
	-- GPIO XINT2
	-- CPU定时器0/1/2
	-- ADCINT1/29个灵活的PIE中断,在任意转换之后可以配置中断请求;

2、ADC主要模块

       ADC主要结构图包括参考电压、外部输入信号、保持器信号、转换器、SOC模块、触发源信号以及转换结果器几个部分,几个模块相互配合,完成ADC数据采集转换工作。接下来对几个重要模块进行说明。
在这里插入图片描述

1)、信号输入

       TMS320F28027的ADC 转换模块有 2 个独立的 8 状态排序器,这两个排序器还可以级联为 1 个 16 状态的排序器 。 因此排序器可以工作在两种状态下,一种是顺序采样,一种是同步采样。简单来说,就是一种是一个一个依次输入转换(顺序采样),一种是一个一个成对转换(同步采样)

2)、SOC配置

       SOC是一种配置设置,它定义的是单通道单转换。包含3个配置:启动转换的触发源、转换通道、采样保持窗口,即每个通道的转换都对应着一个SOC的配置。
在这里插入图片描述

3)、触发源

       ADC采样转换的触发信号可以有多种方式,包括有:
              – S/W 软件立即启动
              – ePWM 1~7
              – GPIO XINT2
              – CPU定时器0/1/2
              – ADCINT1/2

二、代码编写

       通过定时器0周期性触发ADC采样

1、定时器0配置

/**************************************************************
 * @description : InitTimer0
 * @param       : none
 * @return      : none
**************************************************************/
void InitTimer0(void)
{
    EALLOW;
    PieVectTable.TINT0 = &CpuTimer0Isr;
    EDIS;
    InitCpuTimers();
    ConfigCpuTimer(&CpuTimer0, 60, 500000);
    CpuTimer0Regs.TCR.all = 0x4001;                             // Use write-only instruction to set TSS bit = 0
    IER |= M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    EINT;                                                       // Enable Global interrupt INTM
    ERTM;                                                       // Enable Global realtime interrupt DBGM
}

2、ADC单通道采样

/**************************************************************
 * @description : AdcInit
 * @param       : none
 * @return      : none
**************************************************************/
void AdcInit(void)
{
    InitAdc();
    AdcOffsetSelfCal();

    EALLOW;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 0;                     //同时采样
    AdcRegs.ADCSOC0CTL.bit.CHSEL    = 6;                        //set SOC0 channel select to ADCINA6
    AdcRegs.ADCSOC0CTL.bit.ACQPS    = 6;                        //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1;                         //soc触发选择,TIM0
    AdcRegs.ADCCTL1.bit.INTPULSEPOS  = 1;                       //ADCINT1 trips after AdcResults latch 结果存入寄存器才产生中断
    PieVectTable.ADCINT1 = &adc_isr;
    AdcRegs.INTSEL1N2.bit.INT1SEL = 0;                          //中断线1选择soc0
    AdcRegs.INTSEL1N2.bit.INT1E     = 1;                        //Enabled ADCINT1 isr
    AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;                        //Disable ADCINT1 Continuous mode
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;                          // Enable INT 1.1 in the PIE
    EDIS;
    IER |= M_INT1;                                              // Enable CPU Interrupt 1
    EINT;                                                       // Enable Global interrupt INTM
    ERTM;                                                       // Enable Global realtime interrupt DBGM
}

3、ADC多通道采样

/**************************************************************
 * @description : AdcInit
 * @param       : none
 * @return      : none
**************************************************************/
void AdcInit(void)
{
    InitAdc();
    AdcOffsetSelfCal();

    EALLOW;
    AdcRegs.ADCSAMPLEMODE.bit.SIMULEN0 = 0;                     //同时采样
    AdcRegs.ADCSOC0CTL.bit.CHSEL    = 4;                        //set SOC0 channel select to ADCINA6
    AdcRegs.ADCSOC1CTL.bit.CHSEL = 12;
    AdcRegs.ADCSOC0CTL.bit.ACQPS    = 6;                        //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC1CTL.bit.ACQPS    = 6;                        //set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1;                         //soc触发选择,TIM0
    AdcRegs.ADCCTL1.bit.INTPULSEPOS  = 1;                       //ADCINT1 trips after AdcResults latch 结果存入寄存器才产生中断
    PieVectTable.ADCINT1 = &adc_isr;
    AdcRegs.INTSEL1N2.bit.INT1SEL = 1;                          //中断线1选择soc1
    AdcRegs.INTSEL1N2.bit.INT1E     = 1;                        //Enabled ADCINT1 isr
    AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;                        //Disable ADCINT1 Continuous mode
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;                          // Enable INT 1.1 in the PIE
    EDIS;
    IER |= M_INT1;                                              // Enable CPU Interrupt 1
    EINT;                                                       // Enable Global interrupt INTM
    ERTM;                                                       // Enable Global realtime interrupt DBGM

}

4、中断处理函数

/**************************************************************
 * @description : adc_isr
 * @param       : none
 * @return      : none
**************************************************************/
interrupt void adc_isr(void)
{
    uint16_t tmp = AdcResult.ADCRESULT0;
    uint16_t tmp2 = AdcResult.ADCRESULT1;

    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

  • 9
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个示例代码,演示如何在TMS320F28035微控制器上使用定时触发ADC采样: ```c #include "F2803x_Device.h" #include "F2803x_Examples.h" void InitSystem(void); void InitADC(void); void InitTimer(void); Uint16 adcResult; void main(void) { InitSystem(); InitADC(); InitTimer(); while(1) { // 在这里处理ADC采样结果 // 可以将结果存储到变量中或进行其他处理 } } void InitSystem(void) { // 禁用看门狗定时器 DisableDog(); // 初始化系统时钟 InitSysCtrl(); // 选择外部时钟源,例如晶体振荡器 // 这里假设使用20MHz的晶体振荡器 InitPll(10, 3); // 设置时钟分频,这里设置SYSCLK为100MHz // EPWM1时钟频率为100MHz/2 = 50MHz // ADC采样时钟为50MHz/4 = 12.5MHz InitPeripheralClocks(); } void InitADC(void) { // 先初始化GPIO引脚,将其配置为ADC输入引脚 // 配置GPIO引脚为模拟输入 EALLOW; // 这里假设使用的是GPIO0和GPIO1作为ADC输入引脚 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // 禁用拉电阻 GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // 配置GPIO引脚为ADC引脚 GpioCtrlRegs.AIOMUX1.bit.AIO0 = 2; GpioCtrlRegs.AIOMUX1.bit.AIO1 = 2; EDIS; // 初始化ADC模块 InitAdc(); // 配置ADC采样窗口 AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // ADCINA0作为采样通道0 AdcRegs.ADCSOC1CTL.bit.CHSEL = 1; // ADCINA1作为采样通道1 // 配置采样窗口触发源为定时AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 选择ePWM1 SOC-A作为触发AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // 选择ePWM1 SOC-A作为触发源 // 配置采样窗口触发方式为软件触发 AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // 采样保持窗口为7个周期 AdcRegs.ADCSOC1CTL.bit.ACQPS = 6; // 采样保持窗口为7个周期 // 启用ADC模块和采样窗口 AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // 内部参考电压为AVDD-AVSS AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // 中断延迟一个周期 AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // 上电使能ADC模块 AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 上电使能ADC参考电压 AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // 上电使能ADC参考电压 AdcRegs.ADCSOC0CTL.bit.ACQEN = 1; // 启动采样通道0 AdcRegs.ADCSOC1CTL.bit.ACQEN = 1; // 启动采样通道1 AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // 中断延迟一个周期 AdcRegs.ADCINTSEL1N2.bit.INT1SEL = 0; // ADCINT1触发源为采样窗口0 AdcRegs.ADCINTSEL1N2.bit.INT1E = 1; // 使能ADCINT1中断 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除ADCINT1中断标志位 // 启用全局中断 IER |= M_INT1; EINT; } void InitTimer(void) { // 初始化ePWM模块 InitEPwm1Gpio(); InitEPwm2Gpio(); // 配置ePWM模块 EPwm1Regs.TBPRD = 5000; // 定时器周期为5000个周期 EPwm1Regs.CMPA.half.CMPA = 2500; // 占空比为50% EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 停止计数 // 配置ADC SOC触发源 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能ePWM1 SOC-A EPwm1Regs.ETSEL.bit.SOCASEL = 2; // 选择计数器等于零时触发 // 配置ePWM模块的时钟源 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟分频为1 EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 时钟分频为1 EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; // 禁用同步输出 // 启动ePWM1计数 EPwm1Regs.TBCTL.bit.CTRMODE = 0x3; // 上升沿计数模式 } ``` 请注意,这只是一个示例代码,具体的配置和功能可能需要根据您的应用进行调整。确保在使用该代码之前,您已经阅读并理解了TMS320F28035的参考手册和数据表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值