OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4320|回复: 2

STM32 多个ADC采样,出现异常情况

[复制链接]

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
发表于 2015-1-27 22:35:27 | 显示全部楼层 |阅读模式
5金钱
大家好,我最近在使用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();
----------------------------
-------------------------
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-27 23:45:35 | 显示全部楼层
你的摇杆操作,会执行什么处理?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

80

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2013-8-16
在线时间
37 小时
 楼主| 发表于 2015-1-29 23:12:46 | 显示全部楼层
通过摇动摇杆采集摇杆处于不同位置的时候的ADC值。摇杆的作用就是改变对应IO口上的电压,得到不同的ADC数值。这种全局变量不能迁移,除去变量定义的文件中,其他在文件中不能使用,是什么原因啊?有没有编译器出问题的可能阿?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 06:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表