如题所示,下面一段采样程序在FLASH与在RAM中运行不一致,由于是对电池电压采样,所以要求误差不能太大。在RAM中采用时读数为:2.14V,在FLASH中运行时为3.29V。不知道是什么原因:
float CellVoltageDetect(void)
{ float SampleValue = 0;
int32 Sum = 0,AveValue = 0;
int i,n;
_iq Temp; for(i=0;i<8;i++){ /*-------------------------------- 软件触发,启动第一次ADCINA0转换 --------------------------------- */
EALLOW;
AdcRegs.ADCSOCFRC1.bit.SOC9 =1; // 采用SOC9,SOC0同时触发ADCINA0,目的是丢弃第一个采样值, // PiccoloB版有此BUG,A AdcRegs.ADCSOCFRC1.bit.SOC0 =1; // 版该问题已经解决;
EDIS;
for(n=1;n<=1000;n++); //延时,等待转换结束。为什么延时:60MHz,一条指令是约为17ns,"28035—adc"datasheetP11 //Table 1.描述了常见的采样保护时间,所以此处需要延时1us以上。
Sum = Sum + AdcResult.ADCRESULT0; }
AveValue = ( Sum>>3 ); //求平均值
Temp = _IQmpyI32(_IQ(K_Vcell),AveValue);
SampleValue = _IQtoF(Temp-_IQ(0.014)); // -0.04v为蓄电池电压修正值,该数据是通过实验得出。 return SampleValue; }