做四軸飛行器需要考慮到很多很多,其中上位機設計和PCB設計都是需要花費大量精力的。
現在已經有匿名四軸開發的開源上位機程序,集通信,調試,監視,設置功能于一體。
同時附帶飛控通信協議,是我一直在用的四軸飛行器上位機,開發中省了很大的功夫啊。之前一直在用的2.6版本的,前兩天去官網看到有更新,特地分享給大家
部分源碼:
- #include "stm32f10x.h"
- #include "BSP.H"
- void Nvic_Init(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* NVIC_PriorityGroup */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- //串口
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_UART_P;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_UART_S;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- //TIM3
- NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_TIM3_P;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_TIM3_S;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- #ifdef CONTROL_USE_RC
- //TIM4 pwm in
- NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_TIM4_P;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_TIM4_S;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- #endif
- }
- #define EE_6050_ACC_X_OFFSET_ADDR 0
- #define EE_6050_ACC_Y_OFFSET_ADDR 1
- #define EE_6050_ACC_Z_OFFSET_ADDR 2
- #define EE_6050_GYRO_X_OFFSET_ADDR 3
- #define EE_6050_GYRO_Y_OFFSET_ADDR 4
- #define EE_6050_GYRO_Z_OFFSET_ADDR 5
- #define EE_PID_ROL_P 6
- #define EE_PID_ROL_I 7
- #define EE_PID_ROL_D 8
- #define EE_PID_PIT_P 9
- #define EE_PID_PIT_I 10
- #define EE_PID_PIT_D 11
- #define EE_PID_YAW_P 12
- #define EE_PID_YAW_I 13
- #define EE_PID_YAW_D 14
- //ErrorStatus HSEStartUpStatus;
- //FLASH_Status FlashStatus;
- uint16_t VirtAddVarTab[NumbOfVar] = {0xAA00, 0xAA01, 0xAA02, 0xAA03, 0xAA04, 0xAA05, 0xAA06, 0xAA07, 0xAA08, 0xAA09,
- 0xAA0A,0xAA0B, 0xAA0C, 0xAA0D, 0xAA0E,};
- uint16_t temp;
- void EE_INIT(void)
- {
- EE_Init();
- }
- void EE_SAVE_ACC_OFFSET(void)
- {
- EE_WriteVariable(VirtAddVarTab[EE_6050_ACC_X_OFFSET_ADDR], ACC_OFFSET.X);
- EE_WriteVariable(VirtAddVarTab[EE_6050_ACC_Y_OFFSET_ADDR], ACC_OFFSET.Y);
- EE_WriteVariable(VirtAddVarTab[EE_6050_ACC_Z_OFFSET_ADDR], ACC_OFFSET.Z);
- }
- void EE_READ_ACC_OFFSET(void)
- {
- EE_ReadVariable(VirtAddVarTab[EE_6050_ACC_X_OFFSET_ADDR], &ACC_OFFSET.X);
- EE_ReadVariable(VirtAddVarTab[EE_6050_ACC_Y_OFFSET_ADDR], &ACC_OFFSET.Y);
- EE_ReadVariable(VirtAddVarTab[EE_6050_ACC_Z_OFFSET_ADDR], &ACC_OFFSET.Z);
- }
- void EE_SAVE_GYRO_OFFSET(void)
- {
- EE_WriteVariable(VirtAddVarTab[EE_6050_GYRO_X_OFFSET_ADDR], GYRO_OFFSET.X);
- EE_WriteVariable(VirtAddVarTab[EE_6050_GYRO_Y_OFFSET_ADDR], GYRO_OFFSET.Y);
- EE_WriteVariable(VirtAddVarTab[EE_6050_GYRO_Z_OFFSET_ADDR], GYRO_OFFSET.Z);
- }
- void EE_READ_GYRO_OFFSET(void)
- {
- EE_ReadVariable(VirtAddVarTab[EE_6050_GYRO_X_OFFSET_ADDR], &GYRO_OFFSET.X);
- EE_ReadVariable(VirtAddVarTab[EE_6050_GYRO_Y_OFFSET_ADDR], &GYRO_OFFSET.Y);
- EE_ReadVariable(VirtAddVarTab[EE_6050_GYRO_Z_OFFSET_ADDR], &GYRO_OFFSET.Z);
- }
- void EE_SAVE_PID(void)
- {
- u16 _temp;
- _temp = PID_ROL.P * 100;
- EE_WriteVariable(VirtAddVarTab[EE_PID_ROL_P],_temp);
- _temp = PID_ROL.I * 1000;
- EE_WriteVariable(VirtAddVarTab[EE_PID_ROL_I],_temp);
- _temp = PID_ROL.D * 100;
- EE_WriteVariable(VirtAddVarTab[EE_PID_ROL_D],_temp);
- _temp = PID_PIT.P * 100;
- EE_WriteVariable(VirtAddVarTab[EE_PID_PIT_P],_temp);
- _temp = PID_PIT.I * 1000;
- EE_WriteVariable(VirtAddVarTab[EE_PID_PIT_I],_temp);
- _temp = PID_PIT.D * 100;
- EE_WriteVariable(VirtAddVarTab[EE_PID_PIT_D],_temp);
- _temp = PID_YAW.P * 100;
- EE_WriteVariable(VirtAddVarTab[EE_PID_YAW_P],_temp);
- _temp = PID_YAW.I * 1000;
- EE_WriteVariable(VirtAddVarTab[EE_PID_YAW_I],_temp);
- _temp = PID_YAW.D * 100;
- EE_WriteVariable(VirtAddVarTab[EE_PID_YAW_D],_temp);
- }
- void EE_READ_PID(void)
- {
- u16 _temp;
- EE_ReadVariable(VirtAddVarTab[EE_PID_ROL_P],&_temp);
- PID_ROL.P = (float)_temp / 100;
- EE_ReadVariable(VirtAddVarTab[EE_PID_ROL_I],&_temp);
- PID_ROL.I = (float)_temp / 1000;
- EE_ReadVariable(VirtAddVarTab[EE_PID_ROL_D],&_temp);
- PID_ROL.D = (float)_temp / 100;
- EE_ReadVariable(VirtAddVarTab[EE_PID_PIT_P],&_temp);
- PID_PIT.P = (float)_temp / 100;
- EE_ReadVariable(VirtAddVarTab[EE_PID_PIT_I],&_temp);
- PID_PIT.I = (float)_temp / 1000;
- EE_ReadVariable(VirtAddVarTab[EE_PID_PIT_D],&_temp);
- PID_PIT.D = (float)_temp / 100;
- EE_ReadVariable(VirtAddVarTab[EE_PID_YAW_P],&_temp);
- PID_YAW.P = (float)_temp / 100;
- EE_ReadVariable(VirtAddVarTab[EE_PID_YAW_I],&_temp);
- PID_YAW.I = (float)_temp / 1000;
- EE_ReadVariable(VirtAddVarTab[EE_PID_YAW_D],&_temp);
- PID_YAW.D = (float)_temp / 100;
- }
復制代碼
ANO_TC匿名科創地面站V3.1.rar
(4.44 MB, 下載次數: 136)
2016-10-12 13:15 上傳
點擊文件名下載附件
飛控通信協議.zip
(11.92 KB, 下載次數: 67)
2016-10-12 13:16 上傳
點擊文件名下載附件
還有我收藏的匿名飛行器最經典的PID,有很大的參考價值。
ANO-MR-F1-14422經典pid.zip
(415.29 KB, 下載次數: 83)
2016-10-12 13:16 上傳
點擊文件名下載附件
|