This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
平台:TMS320F28335
问题描述:长时间没有给板子上电,第一次上电后其ADC采集到的电压不正常,之后的上电程序运行正常
尝试过的手段:1、怀疑是实际端口电压确实存在问题,使用示波器采集端口电压发现实际电压很快到位的(大致50ms),程序中已经做了6S的延时处理,分别是外设初始化后延时5S,检测前延迟1S。
2、怀疑是使用的PWM没有产生SOC信号导致ADC没有进行转换,在每一次发送ADC结果寄存器的原始数值前,手动触发一次ADC转换
下图为上电第6秒后,ADC结果寄存器采集的原始数值通过串口打印整理后的ADC数变化波形:
下面是ADC初始化设置:出现问题的ADC端口为A4
AdcRegs.ADCTRL3.all = 0x00E0; // Power up bandgap/reference/ADC circuits
DELAY_US(ADC_usDELAY); // Delay before converting ADC channels
EALLOW;
SysCtrlRegs.HISPCP.all = 0x3; // HSPCLK = SYSCLKOUT/2*3 = 150/(2*3) = 25.0 MHz
EDIS;
AdcRegs.ADCTRL1.all = 0x4000; // Reset the ADC Module
DELAY_US(ADC_usDELAY); // after reset, must delay according to test
AdcRegs.ADCTRL3.all = 0x00E0u; // Power up bandgap/reference circuitry
DELAY_US(ADC_usDELAY);
/* 配置 ADC 采样速度 */
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
/* 触发配置 */
/* 配置EWPM模块生成SOCA触发信号 */
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;
/* 配置EWPM模块生成SOCB触发信号 */
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; // 写1复位排序器到初始化状态
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 0u; // 启动转换器,开始响应触发信号
AdcRegs.ADCTRL2.bit.RST_SEQ2 = 1u; // 写1复位排序器到初始化状态
AdcRegs.ADCTRL2.bit.SOC_SEQ2 = 0u; // 启动转换器,开始响应触发信号
下面是ADC打印以及检测程序:
AdcRegs.ADCTRL2.bit.SOC_SEQ1 = 1;
if(++Protect.Count.CheckDlyCnt >= Protect.Delay.CheckDly) // 上电1S检测
{
if((Cnt++ <= 50000) && (Cnt_flag == 1))
{
if((Smit_Cnt++ % 5) == 0)
{
SciaRegs.SCITXBUF = (((AdcRegs.ADCRESULT4 >> 4) /4095.0) * 0xff);
}
}
else
{
Cnt_flag = 0;
}
Hi
感谢您对TI产品的关注! 关于您的咨询,我看您在英文E2E与我们的工程师Ben Collier在沟通。 那这边的帖子我就关闭了。 有疑问请继续与Ben Collier直接沟通。