匿名飛控設備初始化All_Init()函數代碼整理

目錄

 

初始化All_Init();

1.Para_Data_Init()參數初始化

2.Remote_Control_Init();遙控器輸入類型

3.PWM_Out_Init ()電調輸出的初始化

4.spi_2初始化,用於讀取飛控板上所有傳感器,都用SPI讀取

5.傳感器初始化

6.接口初始化


初始化All_Init();

函數在BSP_Init.c中

看下源程序
 

u8 All_Init()

{

         NVIC_PriorityGroupConfig(NVIC_GROUP);              //中斷優先級組別設置


         SysTick_Configuration();                   //滴答時鐘

        

         Delay_ms(100);                                             //延時

         Drv_LED_Init();                                              //LED功能初始化

        

         Flash_Init();                          //板載FLASH芯片驅動初始化

        

         Para_Data_Init();                                //參數數據初始化

        

         Remote_Control_Init();

        

         PWM_Out_Init();                                          //初始化電調輸出功能

         Delay_ms(100);                                             //延時

        

         Drv_SPI2_init();                       //spi_2初始化,用於讀取飛控板上所有傳感器,都用SPI讀取

         Drv_Icm20602CSPin_Init();             //spi片選初始化

         Drv_AK8975CSPin_Init();               //spi片選初始化


         Drv_SPL06CSPin_Init();                 //spi片選初始化

         sens_hd_check.gyro_ok = sens_hd_check.acc_ok =

         Drv_Icm20602Reg_Init();              //icm陀螺儀加速度計初始化,若初始化成功,則將陀螺儀和加速度的初始化成功標誌位賦值

         sens_hd_check.mag_ok = 1;       //標記羅盤OK    

         sens_hd_check.baro_ok = Drv_Spl0601_Init();                          //氣壓計初始化


         Usb_Hid_Init();                                              //飛控usb接口的hid初始化

         Delay_ms(100);                                             //延時

        

         Usart2_Init(115200);                          //串口2初始化,函數參數爲波特率

         Delay_ms(10);                                      //延時     

//      Uart4_Init(115200);                                     //首先判斷是否連接的是激光模塊

//      if(!Drv_Laser_Init())                            //激光沒有有效連接,則配置爲光流模式

//               Uart4_Init(500000);

//      Delay_ms(10);                                      //延時

//      Usart3_Init(500000);                          //連接UWB

//      Delay_ms(10);                                      //延時


         //     

         Uart4_Init(19200);  //接優像光流

         Uart5_Init(115200);//接大功率激光     

//      MyDelayMs(200);   

         //優像光流初始化

         of_init_type = (Drv_OFInit()==0)?0:2;

         if(of_init_type==2)//優像光流初始化成功

         {

                   //大功率激光初始化

                   Drv_Laser_Init();    

         }

         else if(of_init_type==0)//優像光流初始化失敗

         {

                   Uart4_Init(500000);         //接匿名光流

         }

         //


         Drv_AdcInit();

         Delay_ms(100);                                             //延時


         All_PID_Init();                            //PID初始化

////////////

         Drv_GpsPin_Init();                               //GPS初始化 串口1

         Delay_ms(50);                                      //延時              

        

         Drv_HeatingInit();

//      Drv_HeatingSet(5);

         //

         Sensor_Basic_Init();

         //

         ANO_DT_SendString("SYS init OK!");

         return (1);

}

其中 中斷優先級組別設置,滴答時鐘,LED功能初始化,板載FLASH芯片驅動初始化是Stm32自帶庫函數,不需要細看

1.Para_Data_Init()參數初始化

函數在Ano_FcData.c文件中,

最終執行的是Ano_Parame_Read()函數

void Ano_Parame_Read(void)

{

         Flash_SectorsRead ( 0x000000, &Ano_Parame.byte[0], 1 );           //讀取第一扇區內的參數

        

         if(Ano_Parame.set.frist_init != SOFT_VER)     //內容沒有被初始化,則進行參數初始化工作

         {                

                   Parame_Reset();

                   PID_Rest();

                   Ano_Parame_Write();

         }

        

         Parame_Copy_Para2fc();        

}                 

Parame_Reset(), PID_Rest()參數初始化,重置成寫死在程序裏的默認參數,也就是地面站點擊默認參數上看到那些參數

Ano_Parame_Write(void) 將參數寫入第一扇區,這個函數作用是將寄存器中值的寫進閃存

{

         All_PID_Init();  //////存儲PID參數後,重新初始化PID     

         Ano_Parame.set.frist_init = SOFT_VER;

         Parame_Copy_Fc2para();

         Flash_SectorErase ( 0x000000, 1 );                                                         //擦除第一扇區

         Flash_SectorsWrite ( 0x000000, &Ano_Parame.byte[0], 1 ); //將參數寫入第一扇區

}

2.Remote_Control_Init();遙控器輸入類型

函數在Ano_RC.c文件

void Remote_Control_Init()
{
    //
    RC_IN_MODE = Ano_Parame.set.pwmInMode;
    //
    if(RC_IN_MODE == SBUS)
    {
        Drv_SbusInit();
    }
    else
    {
        PWM_IN_Init(RC_IN_MODE);
    }
}

就是 根據參數RC_IN_MODE,地面站上可以設置,subs或ppm或pwm,判斷是執行那種驅動,但是我用的版本sbus一直沒有信號輸入進來,用示波器監控硬件也是有觀測到芯片管腳的輸入,但是軟件中斷抓不到信號,最後也是懶得換就用pwm用了,但按匿名那邊的說法他們這個sbus是可以是使用的,接着往下看

這個if和else程序讀起來怪怪的,判斷的是RC_IN_MODE在subs執行的Drv_SbusInit()函數在Drv_sbus.c文件中,執行的任務是SBUS驅動,else語句中PWM_IN_Init()函數又進行了一個if判斷RC_IN_MODE,然後subs是前面執行過所以是空的,else if判斷是pwm還是ppm,最後執行初始化驅動,底層能跑通的話就不用細究了。

3.PWM_Out_Init ()電調輸出的初始化

在Drv_pwm_out.c文件中.這裏注意文件的上方的宏定義

//21分頻到 84000000/21 = 4M   0.25us

/*初始化高電平時間1000us(4000份)*/
//#define INIT_DUTY 4000 //u16(1000/0.25)
#define INIT_DUTY 4000 //u16(1000/0.25)
/*頻率400hz*/
#define HZ        400
/*精度10000,每份0.25us*/
#define ACCURACY 10000 //u16(2500/0.25) //accuracy
/*設置飛控控制信號轉換比例爲4*/
#define PWM_RADIO 4//(8000 - 4000)/1000.0

這裏的意思是輸出的信號除以4纔是實際的輸出,比如實際中需要脈寬1500的信號,在這裏必須是1500*4 = 6000纔行

4.spi_2初始化,用於讀取飛控板上所有傳感器,都用SPI讀取

底層無誤,暫時忽略

5.傳感器初始化

Drv_Icm20602Reg_Init();

 Drv_Spl0601_Init();

6.接口初始化

usb和串口,飛控板上這些接口的功能在程序中已經默認定義好了

Usb_Hid_Init();                    //飛控usb接口的hid初始化
    Delay_ms(100);                    //延時
    
    Usart2_Init(115200);            //串口2初始化,函數參數爲波特率
    Delay_ms(10);                    //延時    
//    Uart4_Init(115200);                //首先判斷是否連接的是激光模塊
//    if(!Drv_Laser_Init())            //激光沒有有效連接,則配置爲光流模式
//        Uart4_Init(500000);
//    Delay_ms(10);                    //延時
//    Usart3_Init(500000);            //連接UWB
//    Delay_ms(10);                    //延時

    //    
    Uart4_Init(19200);    //接優像光流
    Uart5_Init(115200);//接大功率激光    
//    MyDelayMs(200);   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章