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.
您好!
我尝试在差分模式下使用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
Marko、
根据 DS、TMS320F28375S 器件不支持16位 ADC 模式
http://www.ti.com/document-viewer/TMS320F28377S/datasheet/device-comparison-sprs8814652#SPRS8814652
因此、即使寄存器位设置为16位模式、它也不会被写入、器件将始终以12位模式运行。
您需要获得基于 F28379/7/6的器件才能利用片上 ADC 的16位功能。
最棒的
Matthew