DSP TMS320F28027 ADC定时采样功能实现

本文详细介绍了TMS320F28027 ADC的特性,包括12位双采样保持、多路复用输入和多种触发源等,并探讨了其信号输入、SOC配置和触发源等关键模块。通过代码示例展示了如何使用定时器0周期性触发ADC单通道和多通道采样,以及中断处理函数的实现,为理解和应用该ADC提供了清晰的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值