大家好,我最近在使用stm32f103rct6做一个小测试。测试程序中需要使用到7个ADC采样,其中6个ADC采集到的数值作为彼此独立的六个控制功能的数据,由串口中断输出。剩下的那个ADC 用于采集给设备电压值,当采集到的电压低于某个值得时候就报警。现在我遇到了一个棘手的问题,这个问题所产生的现象是如下:
如果我在为设备上电后,通过摇动摇杆或旋动旋钮改变相应控制功能的输出值,操作完后,改变设备电压,当电压低于设置的报警值得时候,设备也不报警。此时其余的控制设备的功能的6个ADC工作正常,产生的数据也正常。
如果在设备上电之后,不作任何改变控制设备功能输出数值的操作(就是不摇动摇杆,旋动旋钮),直接调整设备的电源电压,当采集的ADC低于报警值时候,就会马上报警,电源电压调高时,就不报警。
注:这7个ADC采样是放在一个函数中的,这个函数是在一个定时器中断中调用,因此,无论设备上电后,是否进行摇杆或者旋钮的操作,7个ADC都在进行数据采集,每次进入定时器中断后这个包含有7个ADC采集的函数都会被调用一次。
针对用于上面的现象我做了一个测试。我在main函数中的低压报警处检用于采集电源电压的那个ADC采集到的值和在定时器中断中检测同样的那个ADC采集到的值,结果发现---如果在上电后,不操作其他的功能,只是单纯调低电源电压,低压报警功能正常,在main中检测到的值和在定时器中断中检测到的值相同,都会随着电源电压的调整而相应变化。可是如果上电后,进行了其他操作(如:摇动摇杆),那么在main中检测到的值会不变一直大于报警临界值。而在中断检测到的值,则会随着电源电压的变化而变化。
请问一下各位大哥,这是什么原因阿?如果有哪位大哥知道还请指点指点,谢谢。
下面有我的代码:
//包含有7个ADC采集操作的函数,在定时器中断中被调用
void ADC_calibrationl(void)
{
unsigned short int _adc1;
unsigned short int _adc2;
unsigned short int _ch1_max;
unsigned short int _ch3_max;
unsigned short int _ch1_meddle;
unsigned short int _ch3_meddle;
unsigned short int _ch1_min;
unsigned short int _ch3_min;
unsigned short int AD_aile=0;
unsigned short int AD_rudd=0;
unsigned short int AD_thro=0;
unsigned short int AD_elev=0;
unsigned short int AD_aux1=0;
unsigned short int AD_aux2=0;
unsigned short int Origin_max_aile_S;
unsigned short int Origin_min_aile_S;
unsigned short int Origin_max_rudd_S;
unsigned short int Origin_min_rudd_S;
unsigned short int Origin_max_aux1_S;
unsigned short int Origin_min_aux1_S;
unsigned short int Origin_max_aux2_S;
unsigned short int Origin_min_aux2_S;
//设备功能数据ADC采集,共6组ADC
AD_rudd=AdcConvert(ADC_Channel_13)/4;
AD_aile=AdcConvert(ADC_Channel_10)/4;
if(Thro_r_l_fg==1)
{
AD_thro=AdcConvert(ADC_Channel_11)/4;
AD_elev=AdcConvert(ADC_Channel_12)/4;
}
else
{
AD_thro=AdcConvert(ADC_Channel_12)/4;
AD_elev=AdcConvert(ADC_Channel_11)/4;
}
AD_aux1=AdcConvert(ADC_Channel_15)/4;
AD_aux2=AdcConvert(ADC_Channel_14)/4;
Origin_max_aile=1024;
Origin_max_rudd=1024;
Origin_max_thro=1024;
Origin_max_elev=1024;
Origin_max_aux1=1024;
Origin_max_aux2=1024;
Origin_ADC_aile=511;
Origin_ADC_rudd=511;
Origin_ADC_thro=511;
Origin_ADC_elev=511;
Origin_ADC_aux1=511;
Origin_ADC_aux2=511;
Origin_min_aile=63;
Origin_min_rudd=63;
Origin_min_thro=63;
Origin_min_elev=63;
Origin_min_aux1=63;
Origin_min_aux2=63;
Origin_max_aile_S=Origin_max_aile-30;
Origin_min_aile_S=Origin_min_aile+30;
Origin_max_rudd_S=Origin_max_rudd-30;
Origin_min_rudd_S=Origin_min_rudd+30;
Origin_max_aux1_S=Origin_max_aux1-30;
Origin_min_aux1_S=Origin_min_aux1+30;
Origin_max_aux2_S=Origin_max_aux2-30;
Origin_min_aux2_S=Origin_min_aux2+30;
_ch3_max=Origin_max_thro-30;
_ch3_meddle=Origin_ADC_thro;
_ch3_min=Origin_min_thro+30;
_ch1_max=Origin_max_elev-30;
_ch1_meddle=Origin_ADC_elev;
_ch1_min=Origin_min_elev+30;
//-----------------------------------------------------
if(AD_thro>=_ch1_meddle)
{
AD_thro=AD_thro-_ch1_meddle;
AD_thro=AD_thro*(448.000f/(_ch1_max-_ch1_meddle));
AD_thro=AD_thro+512;
if(AD_thro>959)
{AD_thro=959;}
}
else
{
AD_thro=_ch1_meddle-AD_thro;
AD_thro=AD_thro*(448.000f/(_ch1_meddle-_ch1_min));
if(AD_thro>448)
{AD_thro=448;}
AD_thro=511-AD_thro;
}
//----------------------------------------------
if(AD_elev>=_ch3_meddle)
{
AD_elev=AD_elev-_ch3_meddle;
if(AD_elev<14)
{AD_elev=0;}
else
{AD_elev=AD_elev-14;}
AD_elev=AD_elev*(448.000f/(_ch3_max-_ch3_meddle));
AD_elev=AD_elev+512;
if(AD_elev>959)
{AD_elev=959;}
}
else
{
AD_elev=_ch3_meddle-AD_elev;
if(AD_elev<14)
{AD_elev=0;}
else
{AD_elev=AD_elev-14;}
AD_elev=AD_elev*(448.000f/(_ch3_meddle-_ch3_min));
if(AD_elev>448)
{AD_elev=448;}
AD_elev=511-AD_elev;
}
//----------------------------------------------
if(AD_aile>=Origin_ADC_aile)
{
AD_aile=AD_aile-Origin_ADC_aile;
if(AD_aile<14)
{AD_aile=0;}
else
{AD_aile=AD_aile-14;}
AD_aile=AD_aile*(448.000f/(Origin_max_aile_S-Origin_ADC_aile));
AD_aile=AD_aile+512;
if(AD_aile>959)
{AD_aile=959;}
}
else
{
AD_aile=Origin_ADC_aile-AD_aile;
if(AD_aile<14)
{AD_aile=0;}
else
{AD_aile=AD_aile-14;}
AD_aile=AD_aile*(448.000f/(Origin_ADC_aile-Origin_min_aile_S));
if(AD_aile>448)
{AD_aile=448;}
AD_aile=511-AD_aile;
}
//----------------------------------------------
if(AD_rudd>=Origin_ADC_rudd)
{
AD_rudd=AD_rudd-Origin_ADC_rudd;
if(AD_rudd<14)
{AD_rudd=0;}
else
{AD_rudd=AD_rudd-14;}
AD_rudd=AD_rudd*(448.000f/(Origin_max_rudd_S-Origin_ADC_rudd));
AD_rudd=AD_rudd+512;
if(AD_rudd>959)
{AD_rudd=959;}
}
else
{
AD_rudd=Origin_ADC_rudd-AD_rudd;
if(AD_rudd<14)
{AD_rudd=0;}
else
{AD_rudd=AD_rudd-14;}
AD_rudd=AD_rudd*(448.000f/(Origin_ADC_rudd-Origin_min_rudd_S));
if(AD_rudd>448)
{AD_rudd=448;}
AD_rudd=511-AD_rudd;
}
//----------------------------------------------
if(AD_aux1>=Origin_ADC_aux1)
{
AD_aux1=AD_aux1-Origin_ADC_aux1;
if(AD_aux1<14)
{AD_aux1=0;}
else
{AD_aux1=AD_aux1-14;}
AD_aux1=AD_aux1*(448.000f/(Origin_max_aux1_S-Origin_ADC_aux1));
AD_aux1=AD_aux1+512;
if(AD_aux1>959)
{AD_aux1=959;}
}
else
{
AD_aux1=Origin_ADC_aux1-AD_aux1;
if(AD_aux1<14)
{AD_aux1=0;}
else
{AD_aux1=AD_aux1-14;}
AD_aux1=AD_aux1*(448.000f/(Origin_ADC_aux1-Origin_min_aux1_S));
if(AD_aux1>448)
{AD_aux1=448;}
AD_aux1=511-AD_aux1;
}
//----------------------------------------------
if(AD_aux2>=Origin_ADC_aux2)
{
AD_aux2=AD_aux2-Origin_ADC_aux2;
if(AD_aux2<14)
{AD_aux2=0;}
else
{AD_aux2=AD_aux2-14;}
AD_aux2=AD_aux2*(448.000f/(Origin_max_aux2_S-Origin_ADC_aux2));
AD_aux2=AD_aux2+512;
if(AD_aux2>959)
{AD_aux2=959;}
}
else
{
AD_aux2=Origin_ADC_aux2-AD_aux2;
if(AD_aux2<14)
{AD_aux2=0;}
else
{AD_aux2=AD_aux2-14;}
AD_aux2=AD_aux2*(448.000f/(Origin_ADC_aux2-Origin_min_aux2_S));
if(AD_aux2>448)
{AD_aux2=448;}
AD_aux2=511-AD_aux2;
}
ADC_elev=AD_elev;
ADC_thro=AD_thro;
ADC_aile=AD_aile;
ADC_rudd=AD_rudd;
ADC_aux1=AD_aux1;
ADC_aux2=AD_aux2;
ADC_batt=AdcConvert(ADC_Channel_8);//电源电压ADC采集
ADC_batt=ADC_batt/4;
}
//main函数部分
int main(void)
{
----------------------------------------------
-----------------------------------------------
while(1)
{
if(ADC_thro<600)//电源电压报警临界值,低于这个值报警,同时亮红灯
{
BZ_DAT=3;
_BB_2();
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
}
else//高于临界值不报警,亮黄灯
{
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_7);
}
}
}
//定时器中断部分, 调用ADC_calibrationl()
void TIM4_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
sei();
ADC_calibrationl();
----------------------------
-------------------------
}
|