⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd16-adc.c

📁 伺服控制器主要用于电动执行器的控制 在工业方面大量应用
💻 C
字号:
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
  unsigned int data_Nf=0;
  unsigned int data_Ng=0;
  
  result_Nf_1 = result_Nf;              //保留前次采集数据
  result_Ng_1 = result_Ng;
  
  if(flag == 0x03)                     //信号输入校准
  {
    result_Ng = SD16MEM0;                      // 读取数据
    result_Ng_buf = result_Ng;
  }
  else if(flag == 0x06)                //校零校满状态
  {
    result_Nf = SD16MEM0;                      // 读取数据
    result_Nf_buf = result_Nf;
  }
  else                                 //其它状态:远程,就地等
  {
    switch (SD16IV)
    {
    case 2:                                   // SD16MEM Overflow
      break;
    case 4:                                   // SD16MEM0 IFG
      {
        Input_Channel++;
        if(Input_Channel > 2)
        {
          Input_Channel = 1;
        }
        switch(Input_Channel)
        {
        case 1:
          {
            result_Nf = SD16MEM0;                      // 读取数据
            result_Nf_buf = result_Nf;
            SD16INCTL0 = SD16INTDLY_0+SD16INCH_1;   //转换为差分通道A1
            SD16AE = SD16AE1;
          }
          break;
        case 2:
          {
            result_Ng = SD16MEM0;                      // 读取数据
            result_Ng_buf = result_Ng;
            SD16INCTL0 = SD16INTDLY_0;    // 转换为差分通道A0
            SD16AE = SD16AE0;
          }
          break;
        default:
          {
            result_Nf = SD16MEM0;
            result_Nf_buf = result_Nf;
            SD16INCTL0 = SD16INTDLY_0;    // 转换为差分通道A0
            SD16AE = SD16AE0; 
          }
        }
      }
      break;
    }
  }
  
  data_Nf = abs(result_Nf-result_Nf_1);
  data_Ng = abs(result_Ng-result_Ng_1);  
  
  if(data_Nf<20)                   //采集数据值在正常波动范围内是数据不变化
  {
    result_Nf = result_Nf_1;       //采用原来的数值
  }
  
  if(data_Ng<20)
  {
    result_Ng = result_Ng_1;
  }
  
  result_Nf = 0.25*result_Nf_1 + 0.75*result_Nf;   //阀位反馈采集量
  result_Ng = 0.25*result_Ng_1 + 0.75*result_Ng;   //阀位给定采集量    递推滤波
  
  result_Ng = result_Ng>(Ng_max)?Ng_max:result_Ng;  //限值  <Ng_max
  if(result_Ng  >= (Ng_max-100))
    result_Ng = Ng_max;
  result_Ng = result_Ng>(Ng_min)?result_Ng:Ng_min;  //限值  >Ng_min
  if(result_Ng <= (Ng_min+100))
    result_Ng = Ng_min;
  
  
  result_Nf = result_Nf>(Nf_max)?Nf_max:result_Nf;  //限值  <Nf_max
  if(result_Nf  >= (Nf_max-100))
    result_Nf = Nf_max;
  result_Nf = result_Nf>(Nf_min)?result_Nf:Nf_min;  //限值  >Nf_min
  if(result_Nf <= (Nf_min+100))
    result_Nf = Nf_min;
  /**/
  
  if(flag == 6)                           //校零校满状态时反馈最大值/最小值可调
  {
    if((result_Nf_buf<(Nf_min-100))&&(result_Nf_buf>0))
    {
      result_Nf = result_Nf_buf;
      Nf_min = result_Nf;
    }
    else if((result_Nf_buf>(Nf_max+100))&&(result_Nf_buf<32760))
    {
      result_Nf = result_Nf_buf;
      Nf_max = result_Nf;
    }
  }
    
  if(flag == 3)                           //输入信号校准状态时给定最大值/最小值可调
  {
    if((result_Ng_buf<(Ng_min-100))&&(result_Ng_buf>0))
    {
      result_Ng = result_Ng_buf;
      Ng_min = result_Ng;
    }
    else if((result_Ng_buf>(Ng_max+100))&&(result_Ng_buf<32760))
    {
      result_Ng = result_Ng_buf;
      Ng_max = result_Ng;
    }
  }
  
  Nf_1 = Nf;
  Nf = (unsigned int)(((float)(result_Nf - Nf_min)/(float)(Nf_max - Nf_min))*10000);//得到阀位反馈万分比
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -