这个是当年师兄给的程序,能用
一:基本收发
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)
|