這個是當年師兄給的程序,能用
一:基本收發
1:收碼和發碼格式均可設為HEX或者CHR。
2:定時發送功能可以精確到毫秒,但是不能太快(發送為獨占式,數據不發送完函數不會返回),如果上一幀數據還沒發送完畢就發送下一幀數據會出錯。
3:請使用ft232串口芯片或支持高波特率的芯片,否則波特率無法設置過高。
二:高級收碼
1:收碼顯示為HEX格式。
2:下位機發送自定義數據,格式為:0x88+FUN+LEN+DATA+SUM
FUN可以是 0xA1到0xAA,共10個;LEN為DATA的長度(不包括0x88、FUN、LEN、SUM)。
SUM是0x88一直到DATA最后一字節的和,uint8格式。
(記得打開需要使用幀的開關,更改設置后點擊保存設置使設置生效)
3:數據可以是uint8、int16、uint16、int32、float這幾個常用格式,多字節數據高位在前。
4:共有20個數據存儲器,每個存儲器的數據可以分別設置為來自10個自定義幀的30個數據。
5:高速通訊時(2ms一幀數據或者更快),請關閉高級收碼頁面的數據顯示按鈕和基本收碼,否則更新過快有可能會造成程序卡死。
6:飛控顯示對應的幀FUN為0xAF,(幀格式:0x88+0xAF+0x1C+ACC DATA+GYRO DATA+MAG DATA+ANGLE DATA+ 0x00 0x00 + 0x00 0x00+SUM,共32字節,ACC/GYRO/MAG/ANGLE(roll/pitch/yaw)數據為int16格式,其中ANGLE的roll和pitch數據為實際值乘以100以后得到的整數值,yaw為乘以10以后得到的整數值,上位機在顯示時再 除以100和10)。
7:遙控,電機pwm,電壓顯示對應的幀FUN為0xAE,(幀格式:0x88+0xAE+0x12+THROT YAW ROLL PITCH +AUX1 2 3 4 5 + PWM:1 2 3 4 + VOTAGE + SUM,共28字節),數據為uint16格式,遙控數據最小在1000左右,最大在2000左右。數據都為uint16格式,其中pwm范圍1-100,votage為實際值*100。
小技巧:如果高速通訊時是為了畫波形,就只開波形顯示,并只保留需要觀察的波形,如果是為了觀察數據,就關閉波形顯示,只保留收碼顯示,這樣可以加快程序響應速度。
7:最快通訊速度測試過下位機用500K波特率,每1ms發送32字節的數據,上位機顯示其中6條波形,OK!(有可能和電腦配置有關)
三:波形顯示
1:共有20條波形,對應20個數據存儲器。
2:雙擊波形繪制區域,可以打開波形顯示開關。
3:按住Ctrl用鼠標左鍵點擊某一條波形,可以顯示數據標簽,再次點擊隱藏。
4:按住鼠標左鍵,在繪圖區域從一點向右下方拖動,然后松開,可以放大顯示框住的波形區域,可以多次放大;
5:按住鼠標左鍵,在繪圖區域從一點向左上方拖動,然后松開,可以將放大后的波形還原。
6:按住鼠標右鍵,在繪圖區域上下左右拖動,可以移動波形。
7:顯示波形時按F9鍵,可以打開波形高級設置。
四:DEBUG功能
1:在調試過程中可以將某些標志位、寄存器、變量實時發回上位機,并在DEBUG頁面顯示。
2:通訊格式為:0x88 + 0xAD + len + num + DATA + SUM,len為num與DATA的總長度,num表示要改變哪個顯示狀態,例如num=0x01即是要改變第一個LED,num=0x07即是改變第一個數字輸出顯示。當要改變LED時,DATA只需一字節,DATA=0x00表示關閉LED,大于0x00表示點亮LED;當要改變數字輸出時,DATA需要兩字節,
表示 一個uint16數字,高字節在前。SUM為從0x88開始到SUM前一字節的和校驗,uint8格式。
例如:發送 0x88 + 0xAD + 0x02 + 0x01 + 0x01 + 0x39 表示點亮第一個LED
發送 0x88 + 0xAD + 0x03 + 0x07 + 0x00 + 0x05 + 0x44 表示在第一個數字輸出位置顯示 5 。
五:鍵鼠控制
1:控制數據發送格式為:0x8A + 0x8A + 0X1C + THROT YAW ROLL PITCH AUX1 AUX2 AUX3 AUX4 AUX5 + 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 + SUM,遙控數據都為int16格式,中值1500,最小最大值為1000、2000。
2:發送頻率 50Hz。
3:鼠標上下控制油門,左右控制YAW,鍵盤的WASD控制ROLL/PITCH,鍵盤12345控制AUX12345。共9通道。
六:飛控參數
1:點擊3D模型顯示右下方的校正按鈕,上位機會發送0X8A 0X8B 0X1C 0XAA 0XA3 +無用數據+SUM給下位機,其中0X8B表示飛控參數,0XAA表示零偏,0XA3表示ACC GYRO都要校正。
2:點擊飛控參數界面傳感器矯正功能里面的校正按鈕,分別表示ACC 和GYRO的校正,不會同時校正兩個傳感器,
上位機校正ACC發送格式為:0X8A 0X8B 0X1C 0XAA 0XA1+無用數據+SUM
上位機校正GYRO發送格式為:0X8A 0X8B 0X1C 0XAA 0XA2+無用數據+SUM(送有數據整個長度都為32字節)
3:上位機發送微調后的offset數據(僅為ACC的 X 和 Y ),格式為0X8A 0X8B 0X1C 0XAB + offset.x + offset.y +無用數據 +SUM,數據為int16格式。
4:上位機發送讀offset的命令格式為:0X8A 0X8B 0X1C 0XAC + 無用數據 + SUM
5:上位機發送讀PID數據的命令為:0X8A 0X8B 0X1C 0XAD + 無用數據 + SUM
6:下位機發送offset數據給上位機的格式為:0X88 0XAC 0X1C 0XAC + 傳感器零偏數據ACC XYZ GYRO XYZ +無用數據+SUM,共六個int16型數據。
7:下位機發送PID數據給上位機的格式為:0X88 0XAC 0X1C 0XAD + PID數據 + 無用數據 + SUM
PID數據為rol_p,rol_i,rol_d,pit_p..i..d,yaw_p,,i,,d,共9個uint16型數據。
8:上位機發送PID數據給下位機的格式為:0X8A 0X8B 0X1C 0XAE +PID數據+ 無用數據 + SUM
PID數據格式和下位機發送給上位機的格式一樣。
9:點擊飛控解鎖按鈕,上位機會發送0X8A 0X8B 0X1C 0XA1+無用數據+SUM給下位機,如果下位機已經解鎖,
點擊此按鈕會發送0X8A 0X8B 0X1C 0XA0+無用數據+SUM給下位機,鎖定飛控。
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "mpu6050.h"
- #include "pwmset.h"
- #include "niming.h"
- #include "pid.h"
- #include "usmart.h"
- #include "inv_mpu.h"
- #include "inv_mpu_dmp_motion_driver.h"
- volatile float pitch,roll,yaw; //歐拉角
- volatile u8 mode = 1; //當前工作方式
- volatile float step = 0;
- int main(void)
- {
- Stm32_Clock_Init(9); //系統時鐘設置
- uart_init(72,500000); //串口初始化為500000
- delay_init(72); //延時初始化
- usmart_dev.init(72); //初始化USMART
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- MPU_Init(); //初始化MPU6050
- TIM3_PWM_Init(999,8); //初始化脈寬波輸出
- TIM2_Int_Init(4999,71); //初始化定時器2,每5ms產生一次中斷
- while(mpu_dmp_init())
- {
- delay_ms(20);
- }
-
- while(1)
- {
- key=KEY_Scan(0);
- if(key==KEY2_PRES) //測試發送pid數據給上位機
- {
- pid_send_data(rol_p,rol_i,rol_d,pit_p,pit_i,pit_d);
- }
-
- if(key==KEY0_PRES) //開啟或關閉下位機數據發送開關
- {
- report=!report;
- }
- if(key==KEY1_PRES) //開啟或關閉下位機數據發送開關
- {
- Rol_SumError = 0;
- }
- if(key == KEY8_PRES) //PE8按下
- {
- rol_p += 1;
- LED0 = ~LED0;
- }
- if(key == KEY9_PRES)
- {
- rol_i += 0.1;
- LED0 = ~LED0;
- }
- if(key == KEY10_PRES)
- {
- R += 0.05;
- LED0 = ~LED0;
- }
- if(key == KEY11_PRES) //模式切換
- {
- mode++;
- LED0 = ~LED0;
- }
- if(key == KEY12_PRES)
- {
- rol_p -= 1;
- LED0 = ~LED0;
- }
- if(key == KEY13_PRES)
- {
- rol_i -= 0.1;
- LED0 = ~LED0;
- }
- if(key == KEY14_PRES)
- {
- R -= 0.05;
- LED0 = ~LED0;
- }
- if(key == KEY15_PRES)
- {
- mode--; //模式切換
- LED0 = ~LED0;
- }
-
- if(USART_RX_STA == 1) //檢測是否接收到了數據。
- {
- USART_RX_STA = 0; //清除接收標志,防止多次判斷。
- LED1 = ~LED1;
- rol_p = (USART_RX_BUF[4]<<8)|USART_RX_BUF[5];
- rol_i = (USART_RX_BUF[6]<<8)|USART_RX_BUF[7];
- rol_d = (USART_RX_BUF[8]<<8)|USART_RX_BUF[9];
- pit_p = (USART_RX_BUF[10]<<8)|USART_RX_BUF[11];
- pit_i = (USART_RX_BUF[12]<<8)|USART_RX_BUF[13];
- pit_d = (USART_RX_BUF[14]<<8)|USART_RX_BUF[15];
- }
-
- }
- }
復制代碼
所有資料51hei提供下載:
15電賽風力擺源碼及上位機.7z
(3.26 MB, 下載次數: 55)
2019-3-31 02:58 上傳
點擊文件名下載附件
當年師兄給的
|