工具与软件:
平台:TMS320F28335
问题描述:
在电路板长时间不通电后、ADC 电压读数在首次上电期间异常。 但是、后续上电显示了正常的程序操作和 ADC 读数。
尝试的措施:
- 怀疑实际端口电压存在问题:
使用示波器测量了端口电压、发现实际电压快速稳定(大约50ms)。
该程序已经包括6秒延迟:外设初始化后的5秒延迟和电压检查之前的1秒延迟。 - 怀疑 PWM 未生成 SOC 信号、导致 ADC 未执行转换:
为了验证这一点、在每次传输原始 ADC 结果寄存器值之前手动触发 ADC 转换。
附图:
下图显示了上电6秒后的 ADC 结果寄存器值、经过处理并根据串行输出数据绘制出来。 
ADC 初始化设置:
有问题的 ADC 端口是 A4 .
AdcRegs.ADCTRL3.all = 0x00E0;//加电带隙/参考/ADC 电路
DELAY_US (ADC_usDELAY);//转换 ADC 通道之前延迟
EALLOW;
SysCtrlRegs.HISPC.all = 0x3;// HSPCLK = SYSCLKOUT/2*3 = 150/(2*3)= 25.0 MHz
EDIS;
AdcRegs.ADCTRL1.all = 0x4000;// Reset the ADC Module (重置 ADC 模块)
DELAY_US (ADC_usDELAY);//复位后、必须根据测试进行延迟
AdcRegs.ADCTRL3.all = 0x00E0u;//上电带隙/基准电路
DELAY_US (ADC_usDELAY);
AdcRegs.ADCTRL3.bit.ADCCLKPS = 1;
AdcRegs.ADCTRL1.bit.cps = 0;
AdcRegs.ADCTRL1.bit.ACQ_PS = 5;
AdcRegs.ADCTRL1.bit.SUSMOD = 0U;
AdcRegs.ADCTRL1.bit.CONT_run = 0U;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 0U;
AdcRegs.ADCTRL3.bit.SMODE_SEL = 0U;
AdcRegs.ADCREFSEL.ALL = 0;
/* SEQ 1 */
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = ADC_DMA1_CHANNAL - 1;
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = adcChannal_0;// A0
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = adcChannal_1;// A1
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = adcChannal_2;// a2
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = adcChannal_3;// a3
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = adcChannal_4;// A4
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_PRD;
EPwm1Regs.ETPS.bit.SOCAPRD = 2;
EPwm1Regs.ETCLR.bit.SOCA = 1;
AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2 = 1;
EPwm6Regs.ETSEL.bit.SOCBEN = 1;
EPwm6Regs.ETSEL.bit.SOCBSEL = ET_CTR_PRD;
EPwm6Regs.ETPS.bit.SOCBPRD = 1;
EPwm6Regs.ETCLR.bit.SOCB = 1;
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1U;
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0U;
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1U;
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 0U;
下面是 ADC 打印和检测程序:
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
if (++protect.Count.CheckDlyCnt >= protect.delay.CheckDLy)
{
if ((Cnt++<= 50000)&&(Cnt_FLAG == 1))
{
if (((Smit_Cnt ++% 5)== 0)
{
SciaRegs。 SCITXBUF =(((AdcRegs. ADCRESULT4 >> 4)/4095.0)* 0xff);
}
}
设计
{
CNT_FLAG = 0;
}
