我将使用 MSP430F5172 uC 并以500ms 的间隔读取电池电压。 以下是用于对电池电压进行采样的电路:
当 EN_VBATT_READ 变为高电平时、分压器激活。 分压器以1:0.7848的比率进行分频 、以便 VBATT = 3.2V 的最大输入电压导致 VBATT_DIV 上的输出电压为~2.5V。 MSP430的设置 VREF=2.5V、因此3.2V 输入提供满量程10位0x3FFF 输出。 当 EN_VBATT_READ 变为低电平时、分压器关闭、不消耗电流。
电容 C32可用作 LPF、但也有助于在 ADC 采样时间内保持电压。 分压器中相对较低的电阻值可让我实现到 ADC 的低输入阻抗。
在3.2V ~ 2.1V 之间的 VBATT 输入电压下、ADC 读数在1或2个计数内均为点对点。 很好。 下面的示波器屏幕截图显示了电阻分压器打开(黄色迹线为 VBATT_DIV)。 在 C32上建立电荷的时间存在延迟; 然后绿色线迹变为高电平(ADC 转换开始),然后绿色线迹变为低电平(ADC 转换结束)
随着 VBATT 输入电压降低、VBATT_DIV 波形变得怪异。 奇怪的是、它没有达到我期望的稳态值、当转换完成时、会有一点嗡嗡声。 以下示波器快照的 VBATT 输入为2.0V:
在1.9V 电压下、VBATT_DIV 波形完全不稳定并且有一个很大的下降:
最终结果是 VBATT 输入电压读数的低端远低于预期。 我猜 ADC 对模拟输入引脚的加载比我预期的要多。 数据表指出、ADC 输入阻抗介于36k 至96k 和3.5pF 之间、远高于分压器的~887 Ω 阻抗。 因此、我看不到这种情况是怎样的。
此外、我不明白为什么在更高的输入电压下也不会看到这种影响。 我已经尝试了所有采样时间和转换 clock...in 的组合、但最终这并不重要。 较低的输入电压也会在 VBATT_DIV 模拟输入引脚中产生这种颠簸的波形。
在所有这些波形中、uC 的电源电压稳定且在3.3V 时正常。 通过在 AVCC 和 DVCC 上进行探测、可以看到稳定且无噪声的3.3V 电压。
MCLK 由外部产生的16MHz 并且无条件稳定。
设置模拟输入引脚 P3.7并使 ADC 读取:
// P3.7 -> VBATT_DIV/A6 ADC 通道
P3DIR &=~(BIT7);
P3SEL |= BIT7;
P3REN &=~(BIT7);
//解锁端口映射控制器
PMAPKEYID = PMAPKEY;
//禁止进行任何进一步的重映射
PMAPCTL &=~(PMAPRECFG);
//将 P3.7设置为 A6模拟输入引脚
P3MAP7 = 31;
//重新锁定端口映射控制器
PMAPKEYID = 0x00;
ADC10CTL0 = 0x00; //重置寄存器内容
ADC10CTL0 |= ADC10SHT_4 + ADC10ON; // S&H=64 ADC CLKS、ADC10ON
ADC10CTL1 = 0x00; //重置寄存器内容
// ADCCLK = MCLK;SAMPCON 源自采样定时器;输入时钟/8
ADC10CTL1 |= ADC10SSEL_2 + ADC10SHP + ADC10DIV_7;
ADC10CTL2 = 0x00; //重置寄存器内容
ADC10CTL2 |= ADC10RES; // 10位转换结果
ADC10MCTL0 = 0x00;
ADC10MCTL0 |= ADC10SREF_1; //选择 V (R+)=VREG 和 V (R-)=AVSS
ADC10MCTL0 |= ADC10INCH_6; // A6 (P3.7) ADC 输入选择
ADC10IE |= ADC10IE0; //启用 ADC 转换完成中断
内联 void takeAdcRad_Ch6 (void)
{
//启用 VBATT 分频器
//下面的线路将 EN_VBATT_READ 拉为高电平
P3OUT |= BIT4;
//等待 C32至少75us
//滤波电容器以充电至采样值
_DELAY_CYCLES (2400);
//采样和转换开始
// ADC ISR 在结果就绪时触发
P1OUT |= BIT5; //这是被拉高的绿色迹线
ADC10CTL0 |= ADC10SC + ADC10ENC;
}
// ADC10中断服务例程
#pragma vector = ADC10_vector
__interrupt void ADC10_ISR (void)
{
switch (__event_in_range (ADC10IV、12))
{
情况0:中断; //无中断
案例2:中断; //转换结果溢出
案例4:中断; //转换时间溢出
案例6:中断; // ADC10HI
案例8:中断; // ADC10LO
案例10:中断; // ADC10IN
情况12: //转换完成、ADC10IFG0已被置位、
// ADC10MEM0已就绪
P1OUT &=~BIT4; //这是被拉低的绿色迹线
//存储新结果
ADC_Ch6_Result = ADC10MEM0;
//关闭电阻分压器,我们使用电流 ADC 采样帧来完成
//此行会将 EN_VBATT_READ 拉为低电平
P3OUT &=~(BIT4);
//告知 main()我们有一个要处理的新 ADC 样本
sysFlags.adcSampleReady = 1;
中断;
默认值:break;
}
}
是否有任何想法可能会是什么问题? 当 ADC 打开且电压低于2.1V 时、为什么 ADC 引脚似乎正在加载输入引脚?