我是靠谱客的博主 自信帽子,最近开发中收集的这篇文章主要介绍DSP TMS320F28027 ADC定时采样功能实现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;
}

最后

以上就是自信帽子为你收集整理的DSP TMS320F28027 ADC定时采样功能实现DSP TMS320F28027 ADC定时采样功能实现的全部内容,希望文章能够帮你解决DSP TMS320F28027 ADC定时采样功能实现DSP TMS320F28027 ADC定时采样功能实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部