我正在使用 HIL 设置读取12个电压值、其中使用3个具有4个通道的 ADC (总共12个)、每个 ADC (A、B、C)都使用不同的 SOC (SOC0、SOC1、SOC2、SOC3)配置为读取电压值、但问题是每个通道的偏移值不同。 屏幕截图显示了输入电压为2伏时的12个读数、其中 ADC 读数为2.30至2.41伏、而它每1e-3变化一次、因为我每1e-3读取一次。 此外、如果我将 电压值从2伏更改为2.5伏或3伏、则偏移就不同了。 如何调整此 ADC 失调电压?

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.
我正在使用 HIL 设置读取12个电压值、其中使用3个具有4个通道的 ADC (总共12个)、每个 ADC (A、B、C)都使用不同的 SOC (SOC0、SOC1、SOC2、SOC3)配置为读取电压值、但问题是每个通道的偏移值不同。 屏幕截图显示了输入电压为2伏时的12个读数、其中 ADC 读数为2.30至2.41伏、而它每1e-3变化一次、因为我每1e-3读取一次。 此外、如果我将 电压值从2伏更改为2.5伏或3伏、则偏移就不同了。 如何调整此 ADC 失调电压?

感谢您的答复。 我使用 MATLAB Simulink 连接到代码微控制器、但不使用 CCS。 MATLAB 本身生成代码、因为我对该代码不是很熟悉。 MATLAB 生成的代码显示、所有 ADC (A、B、C)都具有相同的触发器和 ACQPS 值、只是通道选择和 SOC 值不同。
什么是 ADC 的基准电压? 我刚刚读取12个外部信号、每个信号的电压范围为2.5V 至3.3V。
void CONFIG_ADCA_SOC0 ()
{
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 2; /*将 SOC0通道选择设置为 ADCIN2*/
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 1;
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 14.0;
/*将 SOC0 S/H 窗口设置为15.0 ADC 时钟周期*/
AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcaRegs.ADCOFFTRIM.bit.OFFTRIM = AdcaRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
void CONFIG_ADCA_SOC1 ()
{
EALLOW;
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 3; /*将 SOC1通道选择设置为 ADCIN3*/
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 1;
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 14.0;
/*将 SOC1 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcaRegs.ADCOFFTRIM.bit.OFFTRIM = AdcaRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
void CONFIG_ADCA_SOC2 ()
{
EALLOW;
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 4; /*将 SOC2通道选择设置为 ADCIN4*/
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 1;
AdcaRegs.ADCSOC2CTL.bit.ACQPS = 14.0;
/*将 SOC2 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcaRegs.ADCOFFTRIM.bit.OFFTRIM = AdcaRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
void CONFIG_ADCA_SOC3 ()
{
EALLOW;
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 5; /*将 SOC3通道选择设置为 ADCIN5*/
AdcaRegs.ADCSOC3CTL.bit.TRIGSEL = 1;
AdcaRegs.ADCSOC3CTL.bit.ACQPS = 14.0;
/*将 SOC3 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcaRegs.ADCOFFTRIM.bit.OFFTRIM = AdcaRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
void CONFIG_ADCB_SOC0 ()
{
EALLOW;
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 2; /*将 SOC0通道选择设置为 ADCIN2*/
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 1;
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 14.0;
/*将 SOC0 S/H 窗口设置为15.0 ADC 时钟周期*/
AdcbRegs.ADCINTSOCSEL1.bit.SOC0 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcbRegs.ADCOFFTRIM.bit.OFFTRIM = AdcbRegs.ADCOFFTRIM.bit.OFFTRIM;//*设置偏移错误纠正值*/
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
void CONFIG_ADCB_SOC1 ()
{
EALLOW;
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 3; /*将 SOC1通道选择设置为 ADCIN3*/
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 1;
AdcbRegs.ADCSOC1CTL.bit.ACQPS = 14.0;
/*将 SOC1 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdcbRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcbRegs.ADCOFFTRIM.bit.OFFTRIM = AdcbRegs.ADCOFFTRIM.bit.OFFTRIM;//*设置偏移错误纠正值*/
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
空 CONFIG_ADCB_SOC2 ()
{
EALLOW;
AdcbRegs.ADCSOC2CTL.bit.CHSEL = 4; /*将 SOC2通道选择设置为 ADCIN4*/
AdcbRegs.ADCSOC2CTL.bit.TRIGSEL = 1;
AdcbRegs.ADCSOC2CTL.bit.ACQPS = 14.0;
/*将 SOC2 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdcbRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcbRegs.ADCOFFTRIM.bit.OFFTRIM = AdcbRegs.ADCOFFTRIM.bit.OFFTRIM;//*设置偏移错误纠正值*/
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
空 CONFIG_ADCB_SOC3 ()
{
EALLOW;
AdcbRegs.ADCSOC3CTL.bit.CHSEL = 5; /*将 SOC3通道选择设置为 ADCIN5*/
AdcbRegs.ADCSOC3CTL.bit.TRIGSEL = 1;
AdcbRegs.ADCSOC3CTL.bit.ACQPS = 14.0;
/*将 SOC3 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdcbRegs.ADCINTSOCSEL1.bit.SOC3 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdcbRegs.ADCOFFTRIM.bit.OFFTRIM = AdcbRegs.ADCOFFTRIM.bit.OFFTRIM;//*设置偏移错误纠正值*/
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*全部处于轮询模式 SOC 优先级*/
EDIS;
}
void CONFIG_ADCC_SOC0 ()
{
EALLOW;
AdccRegs.ADCSOC0CTL.bit.CHSEL = 2; /*将 SOC0通道选择设置为 ADCIN2*/
ADccRegs.ADCSOC0CTL.bit.TRIGSEL = 1;
ADccRegs.ADCSOC0CTL.bit.ACQPS = 14.0;
/*将 SOC0 S/H 窗口设置为15.0 ADC 时钟周期*/
AdccRegs.ADCINTSOCSEL1.bit.SOC0 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdccRegs.ADCOFFTRIM.bit.OFFTRIM = AdccRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
ADccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdccRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*均处于循环模式 SOC 优先级*/
EDIS;
}
void CONFIG_ADCC_SOC1 ()
{
EALLOW;
AdccRegs.ADCSOC1CTL.bit.CHSEL = 3; /*将 SOC1通道选择设置为 ADCIN3*/
ADccRegs.ADCSOC1CTL.bit.TRIGSEL = 1;
AdccRegs.ADCSOC1CTL.bit.ACQPS = 14.0;
/*将 SOC1 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdccRegs.ADCINTSOCSEL1.bit.SOC1 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdccRegs.ADCOFFTRIM.bit.OFFTRIM = AdccRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
ADccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdccRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*均处于循环模式 SOC 优先级*/
EDIS;
}
空 CONFIG_ADCC_SOC2 ()
{
EALLOW;
AdccRegs.ADCSOC2CTL.bit.CHSEL = 4; /*将 SOC2通道选择设置为 ADCIN4*/
ADccRegs.ADCSOC2CTL.bit.TRIGSEL = 1;
AdccRegs.ADCSOC2CTL.bit.ACQPS = 14.0;
/*将 SOC2 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdccRegs.ADCINTSOCSEL1.bit.SOC2 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdccRegs.ADCOFFTRIM.bit.OFFTRIM = AdccRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
ADccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdccRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*均处于循环模式 SOC 优先级*/
EDIS;
}
空 CONFIG_ADCC_SOC3 ()
{
EALLOW;
AdccRegs.ADCSOC3CTL.bit.CHSEL = 5; /*将 SOC3通道选择设置为 ADCIN5*/
AdccRegs.ADCSOC3CTL.bit.TRIGSEL = 1;
AdccRegs.ADCSOC3CTL.bit.ACQPS = 14.0;
/*将 SOC3 S/H 窗口设置为15.0个 ADC 时钟周期*/
AdccRegs.ADCINTSOCSEL1.bit.SOC3 = 0;
/* SOCx 无 ADCINT 中断触发选择。*/
AdccRegs.ADCOFFTRIM.bit.OFFTRIM = AdccRegs.ADCOFFTRIM.bit.OFFTRIM;/*设置偏移错误纠正值*/
ADccRegs.ADCCTL1.bit.INTPULSEPOS = 1;
/*延迟中断脉冲触发 AdcResults lock*/
AdccRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;/*均处于循环模式 SOC 优先级*/
EDIS;
}
我使用的 是 TI 电路板 LaunchXL-F28379D。 具有电压范围(0至3.3伏)的 USB 端口直接连接到 PC、该端口提供5伏电压、然后根据需要在内部将电压进一步分为3.3伏。 由于 VREFLO< ADCINy < VREFHI ,这就是 为什么 ADC 块输出乘以 增益(3.3/4095)得到实际的电压 值。
我的主要问题是 ADC 失调电压、我 从 TI 板引脚读取了1或2伏的固定电压、但 MATLAB Simulink 显示随机失调电压? 这是使用 USB 电缆将 TI 电路板连接到 MATLAB 吗?
什么是 ADC 的基准电压?
它是3.0V。 在 LAUNCHXL-F28379D 的原理图中可以看到一个电压基准 IC REF5030IDGKT。
我建议将模型中的所有增益块改为3.0/4095。