[摘要] 本文基于TI TMS320F28335芯片,深入讲解其ADC模块的SOC(Start-of-Conversion)触发机制,涵盖软件触发、ePWM硬件触发等模式,并提供完整的配置代码与实验验证方法。
1. ADC模块与SOC概述
DSP28335的ADC模块为12位精度、16通道模数转换器,支持8个独立的SOC(Start-of- Conversion)配置。每个SOC可独立配置以下参数:
-
触发源(软件/ePWM/外部引脚等)
-
采样通道
-
采样保持窗口时间
SOC工作流程:
-
触发信号到达
-
启动指定通道的采样保持(ACQPS决定采样时间)
-
自动启动AD转换
-
转换完成触发中断(可选)
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 关键检查点
-
时钟配置:确保ADC时钟频率在4.5-25MHz范围内
-
触发信号:使用示波器检查ePWM的SOCA信号是否正常
-
中断响应:在中断内设置断点验证是否进入
-
采样时间:根据信号源阻抗调整ACQPS值
4.2 常见问题排查
现象 | 可能原因 | 解决方法 |
---|---|---|
ADC结果全为0 | 采样时间过短 | 增大ACQPS值 |
无法进入中断 | 未使能PIE中断 | 检查IER/PIEIER寄存器配置 |
转换结果跳动大 | 参考电压不稳定 | 增加电源去耦电容 |
ePWM触发不生效 | 触发源选择错误 | 检查TRIGSEL寄存器配置 |
5. 实验验证
建议通过以下步骤验证:
-
使用电位器提供0-3V模拟信号至ADCINA0
-
在CCS中观察AdcResult变量值
-
改变电位器位置,确认ADC值在0-4095范围内线性变化
-
用示波器同时捕捉ePWM波形与ADC触发信号