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

📄 main.c

📁 伺服控制器主要用于电动执行器的控制 在工业方面大量应用
💻 C
字号:
#include"includes.h"
main( void )
{
  /******************系统时钟初始化******************/
  WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
  FLL_CTL0 |= XCAP14PF;                     //系统时钟锁定
  /***************读flash内容进入RAM******************/
  ReadFlash(FLASH_B_ADR,N_Data);
  for(int q0=0;q0<N_Data;q0++)
  {
     Temp_Buf_B[q0] = Temp[q0];
     FLASH_DATA[q0] = Temp[q0];
  }
  if((FLASH_DATA[0]<=0)||(FLASH_DATA[0]>=150))    //第一次读flash内容,强制初始化控制单元内容,写falsh
  {
    unsigned char FLASH_DATA_TEMP[N_Data] = {0x0C,0x09,0xB0,0x59,0x7E,0x04,0x01,0x78,0x61,0x00,0x14,
    0x0B,0x5E};
    for(int i=0;i<N_Data;i++)
      FLASH_DATA[i] = FLASH_DATA_TEMP[i];
    FLASH_Operation();            //写flash操作
    /***************初始化相关控制参数*******************/
    sense_RAM = 12;                 //灵敏度默认为20%
    value = sense_RAM;
    
    Nf_min = 2480;                   //初始化反馈输入最小值
    Nf_max = 22910;                  //初始化反馈输入最大值  
    
    Ng_min = 1025;                   //初始化给定输入最小值
    Ng_max = 30817;                  //初始化给定输入最大值
    
    out_min = 0;                    //反馈信号输出最小值
    OUT_0V = out_min;
    out_max = 2895;                  //反馈信号输出最大值
    OUT_10V = out_max; 
  }
  else             //初始化操作变量
  {
    sense_RAM = Temp_Buf_B[0];                          //灵敏度默认为1.2%
    value = sense_RAM;
    
    Nf_min = (Temp_Buf_B[1]<<8) + Temp_Buf_B[2];        //反馈信号输出最小值
    Nf_max = (Temp_Buf_B[3]<<8) + Temp_Buf_B[4];        //反馈信号输出最大值  
    
    Ng_min = (Temp_Buf_B[5]<<8) + Temp_Buf_B[6];        //初始化给定输入最小值    数值待确定
    Ng_max = (Temp_Buf_B[7]<<8) + Temp_Buf_B[8];        //初始化给定输入最大值
    
    out_min = (Temp_Buf_B[9]<<8) + Temp_Buf_B[10];       //初始化反馈输入最小值
    OUT_0V = out_min;
    out_max = (Temp_Buf_B[11]<<8) + Temp_Buf_B[12];       //初始化给定输入最大值 
    OUT_10V = out_max;
  }
  
  INIT_SYS();
  
  _EINT();             //开全局中断
  while(1)
  {
    /***************0~10V反馈输出******************/
    AO = (out_max- out_min) * ((float)(Nf)/10000) + out_min; //0~10V数据给定
    DAC12_0DAT = AO;                     //将数据写入DA1数据寄存器
    
    SD16CCTL0 |= SD16SC;                    // SD16数据采集允许
    
    KEY_SCAN();       //按键、拨码开关扫描程序
    
    if(flag == 0x04)                   //输出0V校准时实现微调
    {
      if((channal_out_time == 1)||(channal_out_time == 2))
      {
        AO = OUT_0V;
      }
    }
    else if(flag == 0x05)              //输出10V校准时实现微调
    {
      if((channal_out_time == 1)||(channal_out_time == 2))
      {
        AO = OUT_10V;
      }      
    }
    
    switch(flag)
    {
    case 1:                          //远程控制模式
      {
        remote();
        LED_SHOW();
      }
      break;
    case 2:                           //手操控制模式
      {
        local();
        LED_SHOW();        
      }
      break;
    case 3:                          //信号输入校准
      {
        SD16INCTL0 = SD16INTDLY_0+SD16INCH_1;   //转换为差分通道A1
        SD16AE = SD16AE1;
        channal_IN();
      }
      break;
    case 4:
      {
      channal_OUT_0V();
      channal_out_flash = 0xFF;    //允许反馈输出更新Flash标志
      }
      break;                     //信号输出0V校准
    case 5:
      {
        channal_OUT_10V();
        channal_out_flash = 0xFF;    //允许反馈输出更新Flash标志
      }
      break;                     //信号输出10V校准
    case 6:                            //校零校满状态
      {
        SD16INCTL0 = SD16INTDLY_0;    // 转换为差分通道A0
        SD16AE = SD16AE0;
        Calibration_zero_full();
      }
      break;
    case 7:{sense_Establishment();}break;             //灵敏度设置
    case 8:{acquiesce();}break;                       //恢复出厂默认值
    default:
      {
        remote();
        LED_SHOW();
      }                                        //封锁输入输出
    }
    
    if(channal_out_flash == 0xFF)
    {
      channal_out_flash = 0x00;    //清反馈输出更新Flash标志
      if(abs(OUT_0V -out_min)>10)          //输出最低值有改变
      {
        flash = 0xFF;
        out_min = OUT_0V; 
        FLASH_DATA[9] = OUT_0V>>8;          //flash数据更新
        FLASH_DATA[10] = OUT_0V & 0x00FF;
        
        channal_out_time = 1;
      }
      
      if((OUT_10V >(out_max+10))||(OUT_10V <(out_max-10)))     //输出最大值有改变
      {
        flash = 0xFF;
        out_max = OUT_10V;
        FLASH_DATA[11] = OUT_10V>>8;          //flash数据更新
        FLASH_DATA[12] = OUT_10V & 0x00FF;
        
        channal_out_time = 1;
      }      
    }
    if(flash == 0xFF)             //有数据改变,存数据进flash
    {
      FLASH_Operation();            //写flash操作
      flash = 0x00;               //清更新flash标志
    }
  }
}

⌨️ 快捷键说明

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