芯片:MSP430FR6972
IDE:IAR6.14
问题描述:
我的程序平时在一直采集电流,接收到读取电池电压指令后关闭采样定时器,重新配置ADC通道采集电池电压。调试过程发现采集完后读取的电压值老是不正确,进入IAR调试定位到temp = ADC12MEM0;这一句发现此时ADC12MEM0的值是对的,但是全速跑然后将断电定位到Indicator_Status.Voltage_Bat = temp;这一句发现temp值不正确,通过调试框看寄存器值ADC12MEM0值却对的。这是什么原因导致的呢?
相关程序:
{
TimerB0_Stop(); //暂停电流采样
For_Real_Sample();
while(ADC12IFGR0 & ADC12IFG1 == 0);
temp = ADC12MEM0;//这里
Indicator_Status.Voltage_Bat = temp;
}
void For_Real_Sample(void)
{
PowerSwitch(ADC_CAP,ENABLE); PowerSwitch(ADC_BAT,ENABLE);
while(REFCTL0 & REFGENBUSY); // If ref generator busy, WAIT
REFCTL0 |= REFVSEL_2 | REFON; // Select internal ref = 2.5V, Internal Reference ON
ADC12CTL0 &= ~ADC12ENC;
ADC12CTL0 = ADC12ON | ADC12SHT0_2 | ADC12MSC; // Turn on ADC12, 采样周期64 ADC12CLK,采样保持时间尽量长
ADC12CTL1 = ADC12SHP |ADC12SHS_0 | ADC12CONSEQ_1 | ADC12SSEL_3 | ADC12PDIV_1; // ADC12SC触发采样,序列通道采样 0-1,SMCLK/4
ADC12MCTL0 = ADC12VRSEL_1 | ADC12INCH_14; //ADC_BAT
ADC12MCTL1 = ADC12VRSEL_1 | ADC12INCH_15 | ADC12EOS; //ADC_CAP
ADC12IER0 = 0; //关闭中断
while(!(REFCTL0 & REFGENRDY)); // Wait for reference generator to settle ADC12CTL0 |= ADC12ENC + ADC12SC; }
灰小子:
建议提供下采集电池电压的外部电路,怀疑你的adc阻抗不匹配
JIUGEN LI:
回复 灰小子:
就这个我怀疑是之前的ADC采样还在执行,导致本次读取到的转换值不对。
JIUGEN LI:
怎么没人看呢?别沉了。
gaoyang9992006:
回复 JIUGEN LI:
如果只是你那两句的问题,你为何不直接Indicator_Status.Voltage_Bat= ADC12MEM0;
JIUGEN LI:
回复 gaoyang9992006:
直接也是这样,我这情况是程序运行到这的时候此时读取的数据没有更新还是之前的(不知道为什么),我后来的处理办法是不等转换完成标志了,而是直接延时1ms然后再去读取,这样做就没问题了。我猜测是因为切换通道之前ADC还在转换,即使切换完成了还是会产生 ADC12IFG1标志,但是我在切换前各种清标志都不行。
灰小子:
回复 JIUGEN LI:
这两个分压电阻太大了。建议:方法一:采样时间间隔;方法二:都换成10k~20k欧姆的电阻
JIUGEN LI:
回复 灰小子:
我这要低功耗所以电阻都选的比较大,延时读取好像没出问题,只是这样做实时性太差了。
灰小子:
回复 JIUGEN LI:
这个没有太好的办法。msp430内部adc的输入阻抗只有十几到几十k欧姆。你这里有mos管,控制好通断时间应该问题不大。
或者结合应用场景,看看还有没有更优的方法。