您好!
我尝试在差分模式下使用3 16位 ADC 同时对3个信号进行采样。
我的设置:
差分部分连接到:A2、A3和 B2、B3和 C2、C3
我的信号链的计算值为0v、因此在 ADC 引脚上、我测量的是差分电压为0.04mVac (噪声)的1.498Vdc (VCM)。
但我得到 的 ADC 结果是2047、2048、2047…
然后、我尝试查看我是否可以测量单端。 我将 ADCA 设置为 DIFF、将 ADCB 设置为单端以测量 B2、将 ADCC 设置为单端以测量 C4 (保持浮动)。
我得到 ADCA 2047、2048、2047、ADCB 2047、2047、2047、2047、2047、... ADCC 506、232、34、0、0、 0、...
我的代码基于 ADC_SoC_ePWM_cpu01示例:
void Init_ADC (void){ ConfigureADC(); ConfigureEPWM(); SetSOCs(); } void ConfigureEPWM (void) { EALLOW; //假设 ePWM 时钟已启用 EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的 SOC EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲 EPwm1Regs.CMPA.bit.CMPA = 0x0800; //将比较 A 值设置为2048个计数 EPwm1Regs.TBPRD = 0x1000; //将周期设置为4096个计数 EPwm1Regs.TBCTL.bit.CTRMODE = 3; //冻结计数器 EDIS; } void ConfigureADC (void){ EALLOW; // //写入配置 // AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4 AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4 AdccRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4 AdcSetMode (ADC_ADCA、ADC_Resolution_16BIT、ADC_SIGNALMODE_differential); AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE); AdcSetMode (ADC_ADCC、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE); // //将脉冲位置设置为晚期 // AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1; AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1; AdccRegs.ADCCTL1.bit.INTPULSEPOS = 1; // //为 ADC 加电 // AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1; AdccRegs.ADCCTL1.bit.ADCPWDNZ = 1; // //延迟1ms 以允许 ADC 加电时间 // DELAY_US (1000); EDIS; } void SetSOC (void){ EALLOW; AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2;//SOC0将转换引脚 A0 AdcbRegs.ADCSOC0CTL.bit.CHSEL = 2;//SOC0将转换引脚 A0 AdccRegs.ADCSOC0CTL.bit.CHSEL = 4;//SOC0将转换引脚 A0 AdcaRegs.ADCSOC0CTL.bit.ACQPS = 63;//采样窗口为100个 SYSCLK 周期 AdcbRegs.ADCSOC0CTL.bit.ACQPS = 63;//采样窗口为100个 SYSCLK 周期 AdccRegs.ADCSOC0CTL.bit.ACQPS = 63;//采样窗口为100个 SYSCLK 周期 AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发 AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发 AdccRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发 AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志 AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志 AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除 EDIS; }
中断:
_interrupt void adca1_ISR (void) { LED_7_PIN_TOGGLE (); AdcAResults[resultsIndex]= AdcResultRegs.ADCRESULT0; AdcBResults[resultsIndex]= AdcbResultRegs.ADCRESULT0; AdcResults[resultsIndex++]= AdcResultRegs.ADCRESULT0; if (results_buffer_size <= resultsIndex) { resultsIndex = 0; bufferFull = 1; } AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; }
在 main 中运行:
操作
{
EALLOW;
//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式
//
//等待、而 ePWM 导致 ADC 转换、然后导致中断、
//填充结果缓冲区,最终设置 bufferFull
//flag
//
while (!bufferFull);
bufferFull = 0;//清除缓冲区已满标志
//
//停止 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
//
//此时,AdcaResults[]包含一系列转换
//从所选通道
//
//
//软件断点,再次点击运行以获取更新的转换
//
asm (" ESTOP0");
} while (1);
我缺少什么?
此致、
Marko