DSP28335 ADC模块SOC触发机制详解(附完整代码)

[摘要] 本文基于TI TMS320F28335芯片,深入讲解其ADC模块的SOC(Start-of-Conversion)触发机制,涵盖软件触发、ePWM硬件触发等模式,并提供完整的配置代码与实验验证方法。


1. ADC模块与SOC概述

DSP28335的ADC模块为12位精度、16通道模数转换器,支持8个独立的SOC(Start-of- Conversion)配置。每个SOC可独立配置以下参数:

  • 触发源(软件/ePWM/外部引脚等)

  • 采样通道

  • 采样保持窗口时间

SOC工作流程

  1. 触发信号到达

  2. 启动指定通道的采样保持(ACQPS决定采样时间)

  3. 自动启动AD转换

  4. 转换完成触发中断(可选)


2. SOC触发源配置详解

2.1 触发源类型

通过ADC_TRIGSEL寄存器选择SOC触发源:

  • ePWM触发:ePWM1-4的SOCA/SOCB信号

  • 外部引脚触发:GPIO/XINT2等

  • 其他外设触发:如CPU定时器

2.2 关键寄存器配置

ePWM1触发SOC0为例:

(1) 配置ADC模块
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;    // 开启模拟电路电源
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;     // 开启ADC数字电路
AdcRegs.ADCCTL1.bit.ADCCLKPS = 0x0;  // 分频系数=1
AdcRegs.ADCCTL1.bit.CPS = 0;         // 预分频=1
AdcRegs.ADCCTL1.bit.ACQ_PS = 0xF;    // 采样窗口=16个周期
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;    // SOC0选择ADCINA0通道
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;  // 触发源=ePWM1 SOCA
AdcRegs.ADCSOC0CTL.bit.ACQPS = 63;   // 采样窗口=64个ADCCLK周期
(2) 配置ePWM1产生周期触发
EPwm1Regs.ETSEL.bit.SOCAEN = 1;       // 使能SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = 1;      // 当TBCTR=0时触发
EPwm1Regs.ETPS.bit.SOCAPRD = 1;       // 每个事件产生一次触发
EPwm1Regs.TBPRD = 6000;               // 设置PWM周期

3. 完整代码示例

3.1 初始化函数

void InitAdc(void)
{
    AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;     // Power up analog
    AdcRegs.ADCCTL1.bit.ADCPWDN = 1;      // Power up digital
    DELAY_US(1000);                       // 等待电源稳定

    // 基准电压配置
    AdcRegs.ADCCTL2.bit.REFBUFEN = 1;
    AdcRegs.ADCCTL2.bit.REF_SEL = 0;      // 内部3.3V参考

    // SOC0配置:ePWM1触发,通道A0
    AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;     // ADCINA0
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;   // EPWM1_SOCA
    AdcRegs.ADCSOC0CTL.bit.ACQPS = 63;    // 64周期采样窗

    // 中断配置
    AdcRegs.INTSEL1N2.bit.INT1E = 1;      // 使能INT1
    AdcRegs.INTSEL1N2.bit.INT1CONT = 0;   // 单次触发模式
    AdcRegs.INTSEL1N2.bit.INT1SEL = 0;    // SOC0完成触发INT1
    IER |= 0x0002;                        // 使能ADCINT1中断
}

3.2 中断服务程序

interrupt void ADCINT1_ISR(void)
{
    AdcResult = AdcRegs.ADCRESULT0 >> 4;  // 读取12位结果(右移4位对齐)
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除中断标志
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

3.3 主函数配置

void main(void)
{
    InitSysCtrl();
    InitPieCtrl();
    DINT;
    InitPieVectTable();
    EALLOW;
    GpioCtrlRegs.AIOMUX1.bit.ADCINA0 = 0; // ADCINA0配置为模拟输入
    EDIS;

    // 初始化ADC和ePWM
    InitAdc();
    InitEPwm();

    // 启动ePWM
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;      // 递增计数模式

    while(1)
    {
        // 主循环可添加数据处理逻辑
        __asm(" NOP");
    }
}

4. 调试技巧与常见问题

4.1 关键检查点

  1. 时钟配置:确保ADC时钟频率在4.5-25MHz范围内

  2. 触发信号:使用示波器检查ePWM的SOCA信号是否正常

  3. 中断响应:在中断内设置断点验证是否进入

  4. 采样时间:根据信号源阻抗调整ACQPS值

4.2 常见问题排查

现象可能原因解决方法
ADC结果全为0采样时间过短增大ACQPS值
无法进入中断未使能PIE中断检查IER/PIEIER寄存器配置
转换结果跳动大参考电压不稳定增加电源去耦电容
ePWM触发不生效触发源选择错误检查TRIGSEL寄存器配置

5. 实验验证

建议通过以下步骤验证:

  1. 使用电位器提供0-3V模拟信号至ADCINA0

  2. 在CCS中观察AdcResult变量值

  3. 改变电位器位置,确认ADC值在0-4095范围内线性变化

  4. 用示波器同时捕捉ePWM波形与ADC触发信号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值