求教有没有做过单片机和MWC飞控通信协议的

本页链接:
网友们正在为您出谋划策,请耐心等待!
猜你感兴趣MWC飞行控制器设置说明书-360文档中心
360文档中心免费免积分下载,各行业
知识、技术、信息等word文档下载网站
MWC飞行控制器设置说明书
本MWC飞行控制器只针对于克瑞斯出品的PCB有效,不保证对其他商家的产品有效,
此飞控板对遥控器的功能有一定要求,通道数不少于5个,
其中一个为两段式或者三段式开关通道,需要有通道中立点和行程调整功能。
从未使用过的MWC,需按照以下步骤设置和安装好,才能开始飞行时的调试:
1.烧写Bootloader 到飞控上的单片机,让飞控可以自由导入程序;
2.用Arduino编辑MWC程序,然后用FTDI工具把程序上传到飞控;
3.安装到机架上,接好所有相关的连接线;
4.飞行前用MWC GUI配置程序,对飞控进行基本设置;
5.外场飞行时用电脑、蓝牙模块或者LCD模块来调整PID及其他参数。
接下来将按照以上步骤开始配置您的飞控。
1.烧写Bootloader,我们已经在测试时烧好飞控的Bootloader,否则拿到手也启动不了,更
没办法刷程序,所以您不必再理会这个。如果您的Bootloader出现问题,导致无法启动飞控,请与我们联系。
2.请先准备好以下驱动和程序:
以下驱动和程序都可以用于苹果MacOS、Linux与Windows操作系统,我们以Windows 7/32bit为例进行说明。
FTDI工具驱动,FTDI是一种USB转TTL电平的信号转换工具,我们用它来上传需要的程序到飞控,调试时也会用到。驱动下载后需要手动安装,安装好以后,电脑会出现一个COM口:
例如本机上分配到的是COM3,在不同电脑上分配到的端口可能会不一样,但不影响使用。请务必完成此安装步骤,否则无法上传程序到飞控。
http://www.360docs.net/doc/info-c12f4fdfd15abe.html /Drivers/CDM/CDM20814_WHQL_Certified.zip
MWC程序源代码。MWC程序升级较为频繁,每次更新都会出现实用的新功能,或者某方面性能得到提高,方便我们随时享用最好的效果。下载过来的MWC程序包,包括源代码和GUI配置程序两部分,请解压文件。
http://www.360docs.net/doc/info-c12f4fdfd15abe.html /p/multiwii/downloads/list
Arduino集成开发环境。我们使用Arduino这个工具来编辑MWC源代码,进行简单配置后,点击上传,程序就会通过FTDI传输到飞控中。如有需要调整程序的基础功能(例如切换飞行模式),也将通过它来进行。下载后请解压文件,程序无需安装。
http://www.360docs.net/doc/info-c12f4fdfd15abe.html /files/arduino-0023.zip
JAVA虚拟机。也许您的电脑已经安装过,不过为了更好地运行Arduino与GUI程序,请升级到最新版。
http://www.360docs.net/doc/info-c12f4fdfd15abe.html /zh_CN/download/manual.jsp?locale=zh_CN
免费下载该文档:
MWC飞行控制器设置说明书的相关文档搜索
1 MWC四轴飞行器DIY全套教程_工学_高等教育_教育...都必须提前做好,哪里 不懂就仔细阅读使用说明书。 ...(4 个,需要 2 个正浆,2 个反浆) 飞行控制板(...mod=viewthread&tid=5546515&highlight= 3/14 日 超酷MWC四轴飞行器DIY全套教程之刷电调贴 (amoBBS 阿莫电子论坛) 这里讲解一下配置界面,如下图...创新训练项目-物理与机电工程学院-四轴飞行器MWC开源飞控软件拍摄模块编写与研究_...包括对控制器各种资料的查找以及实际使用遇到的问题的解决。在项目开发前期,由 ...并且通过改变每个螺旋桨提供的推力了来控制飞行器 ...并且使用 gitbook 形式提供四轴飞行器开发的电子书。...MWC 飞控( (基于 Arduino 硬件平台的 飞控) MWC ...的名词解释: 飞控板:即飞行控制板,是飞行器的灵魂...便宜去买 KK 飞控,你会后悔死的;也 不要买 MWC...接下来你要做的, 就是按照你买的飞控说明书,和你...MWC飞控V2.3串口通信协议
在V2.3版的change.txt中有这么一段话:
main changes 2.2 -& 2.3
RCSERIAL is now deeply integrated. If a MSP_SET_RAW_RC comes, it will just override legacy RX data. (r1420)
as a consequence, RCSERIAL is no more an option
在这之前,想用串口控制飞控的方法是去选择RCSERIAL这个预编译选项等等,现在&RCSERIAL 已经被深度集成,如果我们给飞控发送一个MSP_SET_RAW_RC 指令同时带上控制数据,那就可以控制飞控了。于是RCSERIAL 不复存在,这就要求我们要去了解串口协议。
关于串口协议的一段话:
updated&04&JulyMultiwii&serial&protocol&was&redesigned://优点等等&&to&be&light,&as&before&&to&be&generic:&it&can&be&used&transparenlty&by&a&GUI,&OSD,&telemetry&or&home&made&config&tool.ie&no&more&specific&OSD&code&should&be&coded&in&multiwii&&to&be&bit&wire&efficient:&only&requested&data&are&transmitted&in&a&binary&format&&to&be&quite&secure:&data&are&sent&with&a&checksum,&preventing&corrupted&configuration&to&be&injected.&&to&be&header&sensitive:&as&it&is&designed&with&a&specific&header,&it&can&be&mixed&with&other&frame,&like&GPS&frameie,&it&will&be&possible&to&connect&either&a&GUI&or&a&GPS&on&the&same&serial&port&without&changing&the&conf&&to&be&less&sensitive&to&evolutions:ie&in&case&of&parameter&evolution,&the&main&protocol&will&remain&compatible&and&the&GUI&will&be&much&less&version&dependent.variable&data&length&allows&to&consider&only&the&beginning&of&a&message,&leaving&the&other&octets&at&the&end&to&extend&transparently&the&message&(for&instance&to&add&a&new&PID)I&thought&first&about&an&implementation&of&Mavlink,&but&I&think&it's&not&what&I&was&looking&for.Even&with&a&partial&implementation,&the&predefined&structures&are&not&light&enough&for&what&I&have&in&mind.Some&messages&are&however&inspired&from&mavlink&structure.The&main&rule&remains:&Multiwii&never&sends&something&on&its&own.A&request&must&be&done&in&each&case&to&retrieve&or&set&data.Each&messages&received&are&acknowledged&even&if&there&is&no&data&inside.There&are&2&main&messages&to&consider:&request&message&to&multiwii&multiwii&output&message
//一句话:一问一答,不问不答
/*重点来了:指令格式*/request&message&to&multiwii &//從飞控中讀取信息To&request&simple&data&without&parameters&/&send&a&specific&command&/&inject&new&parameters&in&multiwiimessages&are&formated&like&this:$M&[data&length][code][data][checksum]1&octet&'$'1&octet&'M'1&octet&'&'1&octet&[data&length]1&octet&[code]several&octets&[data]1&octet&[checksum][data&length]&can&be&0&in&case&of&no&param&command //也就是说如果只发一个指令不带数据的话数据长度可以为0multiwii&output&message&//向飞控输出信息messages&are&formated&like&this:$M&[data&length][code][data][checksum]1&octet&'$'1&octet&'M'1&octet&'&'1&octet&[data&length]1&octet&[code]several&octets&[data]1&octet&[checksum]
if&the&message&is&unknown://未知信息$M|[0][code][checksum]1&octet&'$'1&octet&'M'1&octet&'|'1&octet&01&octet&[unknown&code]1&octet&[checksum]
读写信息格式:前綴 &&$M& &加 &'&'或'&' (分別代表讀寫) &加 &数据长度 &加 &指令代码 &加 &实际数据 &加 &校验码&
以上均已字节为单位,且不含空格
前綴换算成16进制的指令格式长这样:
读:24 4D&3C //$M&
写:24 4D&3E&//$M&
关于校验码
参照官方的MultiWiiConf程序,我写了一个用于计算校验码的C++函数(要求数据长度大于0,如果等于0校验码与指令代码相同)
byte getChecksum(byte length,byte cmd,byte mydata[]) //三个参数分别为:&数据长度& , &指令代码& , &实际数据数组
byte getChecksum(byte length,byte cmd,byte mydata[]){
byte checksum=0;
checksum ^= (length&0xFF);
checksum ^= (cmd&0xFF);
for(int i=0;i&i++)
checksum ^= (mydata[i]&0xFF);
注意波特率要选115200
示例:串口以16进制发送:24 4D 3C 00 64 64 &,飞控将返回版本信息等等数据。
  00表示数据长度为0;
第一个64为指令代码,即下面网址上的第一个代码
第一个64为校验码
飞控上的程序在Protocol.cpp中进行串口通信处理,具体函数为serialCom()
官方上的协议资料可以了解到指令代码(message_id),和指令方向以及指令内容等内容
阅读(...) 评论()还没有帐号? 赶紧
用户版块帖子
1到第8) ? 8 :
location='read.php?tid=1115916&page='+page+'';}">页8) ? 8 :
location='read.php?tid=1115916&page='+page+'';">确认
用STC的51单片机做的小四轴,已完成,附飞行视频,相关资料,相关原理解释
UID:1055055
在线时间270小时
M币391专家6
视频: 先发个超链接:&& 我上次提问的问题,已经解决了,内部有以前做的四轴的图片,在此我就不转发了,想看我做四轴的坎坷之路的可以转移一下。下面开始说正题用51单片机做的四轴?以前别人这样说我们只能呵呵一笑说声逗比,但是现在的51早已不是当年的51,6路15位硬件PWM+2路CCP的16位硬件PWM,相当于是8路15位硬件PWM,mega328都可以直接秒掉,而mega328却正是市售MWC飞控的主控,mega328速度16MHZ,等效16MIPS,IAP15W4K61S4@28MHZ,等效25MIPS,运算速度也秒了mega328,也就是说,用51单片机做四轴绝对不成问题。好了,屁话不多说,直接上图正面近照,可以看到,我对用料是十分在意的,松下高分子钽电容,三洋高分子钽电容,ESR 9毫欧,都可以秒固态了,下载口还用了一个TVS进行静电保护(Rclamp0524P)背面的一颗STC的单片机 IAP15W4K61S4 LQFP64SPCB空板相关资料下载:本人目前大二,做得不尽人意之处欢迎指教,不过麻烦说得别太专业化,我连模拟电路都还没学过,自动控制原理都还只自己看了一些些,太高深的懂不起,但是卡尔曼滤波,PID参数整定还是会的。相关设计参数:供电:1S锂电 350mah(600mah的在路上)电机:720空心杯+59mm桨MCU:IAP15W4K61S4@28MHZ陀螺仪加速度计:MPU-6050磁场传感计:HMC5883L无线芯片:NRF24L01+电机驱动MOS管:AO3400MOS管保护用肖特基:BAT54ST下载口防静电TVS:Rclamp0524P机架:94*94mmPCB厚度:1.2mm FR-4软件相关参数:姿态解算&电机控制频率:125HZ(8ms)PWM频率:28KHZ 1000精度滤波算法:卡尔曼滤波器PID控制:PID=P*e(n)+I*[(e(n)+e(n-1)+...+e(0)]+D*[e(n)-e(n-1)] 最后,求视频上传后 发骚友给个专家,大家砸点M我就心满意足了。
翌日补充:今天教大家怎么做这四轴吧,PCB文件那个资料包里面有,大家可以选择就用那个去打样或者自己画。注意!非专业人士请勿试水!需要的材料:见图以及参数相关的物资。浅谈PID整定和姿态解算。PID的整定是个让很多人都感到头痛的问题,在此,我想强调一句,PID整定必须建立在良好的姿态解算的基础上才能进行,否则根本没法弄出一个很好的效果。举个例子,我的这个四轴,用互补滤波进行姿态处理,P最多调到3。再调大由于姿态解算不过关,P越大输出的姿态震动越大,即使D调大系统也没法收敛,也就是说这个系统发散了。而用卡尔曼滤波我可以把P调到4.5而且回复也有力,飞起来也稳。在姿态解算中,有很多种方法,我这采用的就是普通的姿态角,其他的解算方法还有四元素,欧拉角,等等,其实四元数还是要转化为欧拉角才能用于PID,不过四元数没有欧拉角中万向节死锁的问题。具体请百度:四元数,欧拉角,万向节死锁。在此不一一赘述。我这的姿态解算原理比较简单,就是对三轴加速度的值进行三角函数运算即可。举个例子,首先我从加速度计中获取数据。 &&&&Accel_y= GetData(ACCEL_YOUT_H);&&&&&&&&Accel_x= GetData(ACCEL_XOUT_H);&&&&&&&&&& &&&&Accel_z= GetData(ACCEL_ZOUT_H);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 再进行转化,转化公式在MPU6050数据手册里有&&&&Angle_ax=(Accel_x)/8192;&&&&&&Angle_az=(Accel_z)/8192; &&&&Angle_ay=(Accel_y)/8192;&&&&好了,这里得到的就是我们需要的加速度的值,取值范围0-1,也就是多少个g,g是重力加速度这个就不用说了吧。之后用反三角函数进行运算:AngleAx=atan(Angle_ax/sqrt(Angle_ay*Angle_ay+Angle_az*Angle_az))*180/3.; 公式:X轴角度=arctan(Angle_ax/开根号(Angle_ay^2+Angle_az^2))好了,这里得到的是弧度制的角度,再乘180除以π即可得到所需的角度值。之后要对得到的值进行滤波,为什么要滤波呢,因为加速度计对震动特别敏感,一点震动就大姨妈,得到的角度值是不怎么准确的,不过大致在实际角度的上下。而陀螺仪对震动不敏感,随便怎么震动都不会高潮。陀螺仪输出的数据是多少度一秒,据此进行积分,可以得到短时间内系统的姿态。不过陀螺仪有温飘,温度偏移一点他的误差就会大一点,故要用加速度计的值来对陀螺仪的值进行校准。修正他的温飘误差以及积分误差。这就是互补滤波的原理,短时间内以陀螺仪的值为准,长时间内以加速度计的值来对陀螺仪校准,二者优势互补,去掉不好的一面,这样得到的值就比较理想了。互补滤波公式举例:Angle=0.95*(Angle-Angle_gy*dt)+0.05*AngleAx;前面的0.95和0.05是对陀螺仪角度和角速度角度的权值,意思就是你相信哪个的程度更大一点,因为震动是双向的,故对加速度计进行低通滤波会使加速度计输出的值接近实际值,什么是低通滤波呢,打个比方,当前角度=0.95乘上次的角度+0.05乘测量的角度,这就是对测量值进行低通滤波,dt是积分时间,就是定时器定时的时间,我这取8ms,即dt=0.08。至于卡尔曼滤波,就是一个先进行估计,再根据实际测量的值修改卡尔曼参数,最后再算误差,里面涉及到线性代数,概率论的相关知识,在此不作赘述,我相信我写出来也最多只有万分之一的人看得懂,何必呢。再谈PID,得到了实时姿态,就知道了误差,知道了误差就要对电机进行控制,在PID中,P指比例,I指积分,D指微分,换种说法,P指回复力,P的输出值=P*误差;P越大偏差所引起的回复力越大。是系统能够回到0点的主要力。D是系统运动的阻力,D的输出值=D*(当前误差-前一次误差),D的存在能阻止系统运动。I是系统静差的消除力,比如你四轴的重心偏了,四轴会朝一边偏,对误差进行积分再乘以I即可消除这种机械结构引起的偏移。I的输出值=I*所有误差积分之和。光有P存在的情况,系统一有偏差,就会立马回复,不过到0点时由于惯性,会继续运动,故光有P的话系统会震荡,根本停不下来。故需要D,这个系统运动的克制力来对P进行压制,当PD呈一定比例时,系统就会稳定在一定的值,不过有可能会有点误差,这时就得靠I来修正。I的原理决定了误差存在的时间约久,回复力越大,I可以理解是变相的回复力,专门用来修正PD没法消除的静差。PID整定的方法:I和D置0,从小往大调P,调整至用手造成一个误差,感觉回复有力即可。网上所说的调整至等幅震荡不适合小四轴,你根本就不可能把这玩意弄到等幅震荡的状态。总得来说,P调至你觉得回复起来有点力度就行了,不要太过于纠结。之后从小往大加大D,在D加大的过程中,会出现震荡减小,震荡最小,震荡增大的过程。震荡最小的那一点即very good。调好PD之后如果系统有静差,适当加上I即可,I不能加大,加大了会导致系统震荡,适当为宜。这个过程一定要会区分震荡的来源,到底是P引起的还是D引起的。这个口述讲不清,只有靠自己来体会。调整好XY轴的PID后就该解决四轴自旋的问题了,一般来说XY轴的PID参数是一样的,调好一边,另一边直接复制过去就行。自旋控制方法有2种,一种是对HMC5883的值进行PD控制。一种是对Z轴陀螺仪旋转速度进行PD控制,后面那种就够了,只不过需要飞前对陀螺仪偏差进行校准。这个PD参数不要太纠结,Z轴稍微给点控制就稳了,毕竟XY轴才是四轴飞起来的关键。此外,PID的要求是系统的输出量要和被调量成正比,故大四轴比小四轴好调得多,因为大四轴有电调,电调调整的不是电机供电电压,而是力矩,也就是说大四轴输出信号和升力是成正比的,而小四轴不是,但是我们只需要他大概是正比关系就行了,也能好好滴做朋友的。推荐碳刷电机PWM频率为500HZ,空心杯最好是20KHZ以上。调PID中各种问题及解决方法汇总:四轴偏离一定角度即使加I也纠正不过来,也就是说四轴明明知道他自己偏了,就是纠正不过来,解决方法:加大P。D无论怎么调四轴就是要震荡,根本停不下来,解决方法,减小P系统有细微偏差:加点点I发现无论怎么调PID根本就不能让四轴取得一个很好的效果:换滤波方案吧,什么梯度下降法,卡尔曼滤波算法都是很好的。震动越大角度值和实际值偏离越大:陀螺仪装错位置了,在MPU6050模块下面弄点泡沫双面胶可以很好解决,原则上来讲MPU6050是不能太靠近轴的。补充的内容已移至阿莫论坛 STC 1T 51单片机版块。
[ 此帖被hhdjz1-01-01 18:53重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
UID:1055055
在线时间270小时
M币391专家6
二楼发个飞四轴的摇杆遥控器的程序,电路图不发了,懂的看程序就懂,不懂的讲100遍都不懂。参数:无线模块:NRF24L01+PA+LNA摇杆:淘宝1块5一个买的,好用,金属杆http://item.taobao.com/item.htm?spm=a1z09.2.9.94.OjI08Z&id=&_u=tb2scoj4acfMCU:STC15F2K60S2 DIP-40@35MHZ无线频率:有拨码开关控制,具体看程序通道:理论上来说是无限制的,想用就加程序:http://pan.baidu.com/s/1i3IeiGH今天比较晚了,明天我再把我做的调四轴用的无线上位机的程序和参数发上来,调四轴必备神器,飞在空中也能看姿态数据。
[ 此帖被hhdjz1-12-29 22:31重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请
后查看;或者
成为会员获得更多权限
UID:891183
在线时间445小时
M币3830专家0
广告位招租。。
UID:1011644
在线时间848小时
M币547专家2
广告位招租。。
UID:780183
在线时间2181小时
M币2581专家1
優秀文章&&前排围观
UID:929253
在线时间737小时
M币1624专家1
我想知道摔下来板子会不会断裂...楼主留言:设计的时候专门考虑过这个问题,加宽设计的,不会出问题,电机旁加了排针当脚,不会砸到电机。
UID:619690
在线时间1874小时
M币582专家27
楼主圆了我的梦想。 我一直想自己弄一个飞控,遥控,电调都自己做的飞机。目前就陀螺仪还没实验过。
UID:976636
在线时间1918小时
M币3437专家0
7楼的广告位比较便宜了已经
UID:780183
在线时间2181小时
M币2581专家1
以資鼓勵&&这么好的帖子&&在顶一次
UID:1646929
在线时间484小时
M币3175专家2
漂亮,,赞一个,,
,,,不过还好奇你说的滤波算法:卡尔曼滤波器PID控制:PID=P*e(n)+I*[(e(n)+e(n-1)+...+e(0)]+D*[e(n)-e(n-1)]是啥东东?楼主留言:额,这个。。。。。麻烦百度一下姿态解算,卡尔曼滤波,PID控制吧,百度上都有
1到第8) ? 8 :
location='read.php?tid=1115916&page='+page+'';}">页8) ? 8 :
location='read.php?tid=1115916&page='+page+'';">确认
访问内容超出本站范围,不能确定是否安全
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
您目前还是游客,请
&回复后跳转到最后一页
Code by , Time now is:07-02 17:25, Total 0.250334(s) query 13,
Gzip enabled&查看: 18375|回复: 151
回馈论坛,开源飞控。
本帖最后由 zywei_09 于
11:00 编辑
飞控名字:暂且叫WZY吧
主控芯片:STM32
传感器:MPU6050+HMC5883L+BMP085
操作系统:uC/OS-II
编译环境:keil 4
具体代码在压缩包的WZY飞控中,项目开发过程在压缩包的PDF中。
四旋翼飞控项目日志
& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &作者:WZY
前言& && && && && & 大四下学期完成主体程序,大四毕业暑假加入操作系统,希望大家共同学习,共同进步。
& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && &&&2013.8
时间 2013年2月2日11:57:37&&项目进展了这么久第一次写日志,总结一下这一段时间的经验。首先,我通过李想的stm32教学视频对stm32进行了简单的了解,发现stm32用起来比51都方便,原来一直被“arm难学”误导了,单片机只是工具,真正编算法才是难点,所以以后在做项目时不应该过分考虑单片机是否好用这个问题,只要适合项目的单片机就应该拿来用。&&李想视频里编译环境是MDK,所以在编程时一直使用MDK编译,感觉和学51时用的keil一模一样,比较好上手。由于项目所要做的第一步是要做姿态解算,所以在初步了解stm32原理以后,就开始从MPU6050传感器读数据。MPU6050是一个集成了加速度计和陀螺仪的传感器,使用I2C和单片机进行通信,总体来说读取数据还是比较简单的。但是也遇到一些比较烦人的问题,卡了好久。一个是变量类型搞错了
这是一段读取MPU6050陀螺仪x轴数据的程序,先通过I2C函数把陀螺仪X轴数据的低8位和高8位读取出来,分别放入BUF[0]和BUF[1]中,在通过移位把两个数据合成一个数据传入G_X变量,G_X是一个short型变量,而imu_measure.gx是一个double型变量,编译器编译是自动把G_X转成double型除以16.4赋值给imu_measure.gx。曾经犯过一个错误就是把BUF数组数据相合后直接除以16.4然后赋值给imu_measure.gx,结果通过串口传回来的数据就出现了错误。以后要避免这种错误。&&在新添加文件后要记着把文件添加进工程,否则编译会出错。&&至于为什么除以16.4,参考《MPU-6050寄存器映射》第32页
&&在MPU6050初始化时把 FullScale Range设置为±2000°/s,所以灵敏度为16.4 LSB/°/s,所以在读出寄存器值的基础上除以16.4就是角速度。&&而对于加速度,设置为±8g,灵敏度为4096,所以在读出值的基础上除以4096就是加速度,单位为g,再乘以9.8单位就是m/s^2,所以=835.066,除以这个值就是加速度(m/s^2)。同理,在理解MPU6050初始化的设置时,参考这本手册即可。
要设置为+-4g 即x08&&还有一个就是extern变量的使用。正确的用法是在初始化的地方定义(函数外定义,如果在函数内则会是局部变量),然后在External_Variable.h文件中用extern关键字再定义一遍(注意,这里不要赋值),告诉编译器,这个变量在其他地方已经定义过,直接使用即可。然后需要用到全局变量的文件开头进行#Include “External_Variable.h”,就可以了。&&MPU6050传感器初始化时,使用I2C总线函数即可,例如: Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);& && & //解除休眠状态分别写入MPU6050地址,寄存器地址,和写入的值即可。出现一个问题就是MPU6050的I2C地址在手册上写的是7位固定,为0x68(1101000),但有的例程上给的是直接写入0x68,实际在使用过程中写入0xD0()才有反应,即7为固定位加一位硬件设置的地址位(BIT0=0)。 在MPU6050初始化后就可以不停的读取传感器值进行姿态解算了。在姿态解算前,我先对四元数进行了初始化,即飞控板在静止状态下通过加速度计解算欧拉角,再通过四元数公式计算(即函数quat_init())。其实感觉这里不初始化也可以,因为姿态解算速度很快,第一次的值对以后影响并不大。 随后就开始真正的姿态解算了,首先要对读取的传感器值进行移动均值滤波。定义了Filter_ACC结构体,先把读取值加到这个结构体变量里,每加一次,积分标记位加1。当定时器中断触发。姿态解算周期到来时,进入if(IMUupdate_flag == TRUE){}里面求平均值并对变量清零,完成移动均值滤波。
滤波过后,就开始用IMUupdate()函数进行解算,这个函数是参考 在实际编程中发现,在输入IMUupdata()函数前如果角速度不除以一个比例系数,解算出的姿态角就会出现超调或者,但是如果系数过大就会出现调不够的现象,所以实验的几次以后找到了一个经验值。
进行使用的,基本原理是把加速度计解算出的姿态和上次解算出的姿态(认为是正确的)进行向量叉乘,得到两个向量的差,然后把这个差乘以比例系数和角速度数据融合得到认为是正确的角速度里,将正确的角速度代入到龙格库塔方程里推算出当前正确的姿态。方程里所需的半周期halfT是由TIM2中断产生的(TIM2每2ms中断一次,即T=2ms,halfT=1ms)。在这个过程里还引入里积分环节来消除静差。
比如陀螺X轴读取时始终有个 -32 °/s的误差存在,在姿态解算后,滚转角始终不是平的,会有一个误差,但是会发现这个误差会逐渐减小,这就是积分环节在起作用。 其实在一开始,通过上位机看stm32姿态解算的状态并不是很好,最后发现是uart1传输函数里面有个Delayms(1),晕死,本来对速度的要求就很高,结果每传输一次就延时1ms,不出问题才怪。结果吧这个延时函数去掉以后干脆不出数据了,卡了好久,发现是自己思维进入死胡同了!忘记串口传输完毕是要等待传输结束的:
结果加上这句话后形式一片大好~顺利的解算出了姿态,而且效果很好。
这里使用的上位机软件是阿莫论坛上一位大虾提供的,很好用,不足的地方就是传送速率过快会卡,不能迅速显示,不过功能还是挺强大的,可以数据保存截图什么的。 下一步的任务就是使用HMC5883对偏航角进行修正,由于加速度计不能读出偏航角的数据,所以偏航角由于陀螺仪误差的缘故会一直向一个方向偏。再然后就是读取气压高度。2013年2月3日23:14:52 今天主要解决的是全姿态罗盘。说来很惭愧,大部分时间卡在一个很细小的问题上,就是HMC5883L的I2C总线地址上。一开始翻看MWC的程序,磁阻仪的地址上0x1E,于是用I2C向磁阻仪写入0x1E,结果一点反应都木有啊~试了各种方法,一度以为是MPU6050的I2C辅助位没有设置好(其实设置是没问题的,让MPU6050的I2C_Master功能disable,ByPass功能打开,主芯片可以直接控制HMC5883L,这两个寄存器分别在0x37和0x6A两个寄存器里),在这里设置了好久。后来突然想到上篇日志里写的地址移位的问题,查看MWC飞控的I2C写入函数,果然地址进去以后先要左移一位,顿时泪奔,0x1E左移一位是0x3C,按这个地址写入瞬间各种正常~ 但是在磁阻仪数据读出后,立马又发现了一个问题。飞控板转动90°,上位机显示实际的转动是小于90°的。然后就各种逛论坛啊,各种没思路。于是决定先睡一会儿,困死了,结果刚躺下立马就有思路了,果然过于专注一个问题思维容易进入死胡同。其实磁阻仪的每个轴的数据并不是关于0对称的,这是一个误差。另一个误差是每个轴的变化量是不同的,以X,Y轴为例,如果以想两轴的数据确定一个点(X,Y),那么如果把飞控板转一圈得到的数据画出的圆其实是一个椭圆,而且和原点存在偏移。如图:
蓝色点是飞控板在XY平面旋转一圈采集到的数据,红色圆圈是用matlab拟合得到的圆。通过matlab拟合,我们得到了下图数据:其中数据从左到右分别为椭圆圆心的坐标(X,Y),然后是椭圆长半轴和短半轴的长度。所以我们可以利用这些数据对磁阻仪进行校正。
其中椭圆圆心的偏移量分别为磁阻仪XY轴数据的偏移量,用原始数据减去这个偏移量即可。然后由于Y轴比X轴长,所以把X轴数据乘以长半轴和短半轴的商来校正X轴数据,这样XY轴数据就变成一个没有偏移的圆,通过atan2函数就可以求方向角了。
如图,我把飞控板旋转90°,可以看到上位机读到的数据从180°左右变到了270°左右。
但是接下来又存在一个问题,就是这个方法只能在水平面内使用,如果有滚转或俯仰角,通过磁阻仪计算得到的偏航角就会有很大幅度的变化。然后又是一顿查资料,找到几篇关于全姿态罗盘的论文,参考上面的把磁阻仪三轴数据变化到平面的公式编入程序中发现,根本没有什么变化。可能是这个飞控板的传感器安装和论文里所用的安装方位不一样的缘故吧。然后又是一阵挠头,突然想到MWC飞控里应该有相应的程序。于是翻MWC的程序,结果还真找到了。heading = _atan2f(EstG.V.X * EstM.V.Z -EstG.V.Z * EstM.V.X, EstG.V.Z * EstM.V.Y - EstG.V.Y * EstM.V.Z)上面是MWC全姿态罗盘的程序,Est.V.axis分别是重力向量在机体坐标系下在机体坐标系各轴的分量(即机体坐标系下重力向量),EstM.V.axis同理为机体坐标系下磁场的向量。用这个坐标变换并用atan2函数就可算出偏航角。按照这个思路把程序写出来并实验了一下。下图中红色为偏航角,黄色为滚转角。可以看到当滚转角发生变化时,偏航角只发生了小幅的变动,可以看出全姿态罗盘算法起作用了。而偏航角的小幅变动我推测是由于Z轴没校正好的缘故。Z轴的校正没有用matlab拟合,只是简单的找了最大值和最小值算偏移量(由于只是简单的手动旋转,可能没有找到真正的最大值和最小值),然后用Z轴数据的量程和Y轴数据的量程做比较得出比例系数。其实如果把三轴数据统计会得到一个椭球体,然后用matlab拟合得到椭球体的原点偏移和各轴的长度,相信可以得到更准确的磁阻仪校正。
至于如何用matlab拟合,是从论坛上找到的现成的程序,改天把它改成椭球体的拟合。数据处理是通过串口助手读取数据存到word里,然后将文本准换成表格,以空格分列,然后把各列数据存到Excel里,最后用matlab读取数据。由于我的matlab貌似存在问题,得用主程序图标以管理员方式运行,进入后把目录设置成拟合程序的目录,然后用XY=xlsread(‘file’)函数读取数据。
在程序里,今天做的最大的修改就是把均值滤波去掉了。因为发现在姿态解算前积分量只积分了一次,也就是说就是当前读取传感器的值,所以干脆去掉了。而且传感器最快的读取速度也就1KHz,姿态解算的速率是500Hz,没有必要滤波了。如果以后装到飞机上发现噪声严重的话再滤波和降低姿态解算速率。
2013年2月4日22:27:33
今天做的主要一件事就是把陀螺仪和磁力计的数据进行融合。因为陀螺仪在很微小的转动时几乎察觉不不到飞控板的转动,所以需要磁力计的数据进行校正。而磁力计虽然昨天做了全姿态罗盘的变换,但是在存在俯仰和滚转角时,偏航角任然有扰动,所以又需要陀螺仪来校正,所以我要把这两个传感器的数据相互融合来取长补短。
其实一开始的想法是通过磁力计解算偏航角,然后把加计和陀螺仪解算的俯仰滚转角和磁力计解算的偏航角一并转成四元数,用于下次四元数解算。但是实际效果并不是很好。纠结了一会儿想到一个办法就是把加计和陀螺仪解算的偏航角和磁力计解算的偏航角融合,然后引入一个积分环节,每次积分的值是陀螺仪解算的偏航角和最终解算偏航角的差,用这个积分环节去校正由于加计和陀螺仪解算的偏航角的静差(这个偏航角有累积误差)。
这个方法试验了一下效果不错,但是就是存在一个问题。比如由180°转到360°(0°),由于当磁力计的偏航角到达360°时,加计和陀螺仪的偏航角未必到达360°,所以就会出现一个现象,再稍微顺时针转一下,磁力计的偏航角又变成几度,而加计和陀螺仪的偏航角还在300多度。这样积分环节就会把最终解算的偏航角逆时针转到磁力计的偏航角(大概几度那里)。这是一个很不好的现象,所以我在这个基础上对算法又进行了改进。由于我们需要的是陀螺仪数据,所以我们可以直接从角速度入手,如下图:
把角速度计和磁力计数据融合,gz为角速度数据,乘以负数是和定义的转动方向有关,我定义的是顺时针转动角度从0°变到360°,而gz数据正好相反,所以要乘负数。由于每2ms调用一次IMUupdata(),所以gz*0.002就是2ms转过的角度,对此积分就是实时的角度把磁力计解算角度和上次解算的偏航角做差得到偏航角的误差,乘以一个系数0.002(经验值)再积分用来修正角速度计的累积误差实验表明,角速度计再快速转动时误差较小,但是转动速度较慢时通过积分几乎得不到偏航角的变化,此时就需要用磁力计校正通过数据融合,即避免了角速度计的累积误差又可以用角速度计解算的角度校正滚转俯仰时磁力计产生的误差(从±15°减小到±3°)
这样就很好的避免了上述现象。效果如下:
上图中黄色是滚转角,蓝色是俯仰角(左面图例有误)。当我把飞控板做了三次滚转和三次俯仰动作,可以看到偏航角变化幅度很小。滚转时偏航角的变化是由于用手滚转时不可避免的会影响偏航角。基本上误差在±3°以内,而原来未用陀螺仪校正时可以达到±15°,所以,数据融合起到了很好的效果。
程序中变化较大的就是原来提到的陀螺数据除掉的那个系数,如下图:
&&这句代码被删掉了,这个系数也被直接放在MPU6050的宏定义里:
16.4*35=574 16.4是陀螺仪灵敏度,35是系数(本来应该是57.3,即角度值转化为弧度制,但实验发现用35效果较好)。&&原来的除以一个系数后来发现是由于我没把角度值转化成弧度制,看来以后还要细心。
&&然后我给BMP085写了驱动,其实BMP085一开始并不需要对其寄存器写一些值进行初始化,而是一开始从BMP085的EEPROM中读取一些值用来以后的数据校正。在使用BMP085时直接向寄存器写值读取即可。但是BMP085有个比较麻烦的地方就是,当你给寄存器写入值准备读取后,它会有个转换时间,如果你在这里加延时等待,就会大大减缓飞控的主频率。所以我还是用了原来使用超声波计的方法,用一个标记位,先写入值准备读取然后跳过去执行其他的命令,当循环几次过来发现标记位触发然后接着读取,这样就会节约很多的时间。
上面是一段读取代码,BMP085_Read_flag就是标记位,从1到4中间隔了三段,每段2ms(IMUupdata函数的调用周期),这样从BMP085_Read_flag=1到BMP085_Read_flag=4中间就隔了6ms,而手册上写的读取时间是4.5ms,所以可以读取。&&不过问题就是,读取后的结果有点诡异。
&&不知道哪里出错了,等明天用普通的延时函数读取一下,看是不是这种方法不能用。
2013年2月5日13:08:50&&OK,忙了一天继续写日志,感觉快养成一个习惯了。&&首先今天上午在实验飞控的时候发现飞控在0°的时候仍然存在当磁力计偏航角先从0°多变到350°多时,融合后的偏航角会从0°多顺时针转到350°多,也就是它绕了一个大圈去校正误差。这个问题上文提到过,但是当时以为已经解决了,现在看来还是没有,只是原来逻辑出错了。&&所以我又设计了新的代码解决这个问题,那就是如果误差大于180°就把积分值反方向加,这样就不会绕大圈校正误差了。代码如下:
&&把程序拷进去以后发现这个问题被很好的解决了,当我在0°左右变化时,比如从0°多变到350°多,偏航角不会再绕一个大圈去校正了,效果如下:
&&接下来是卡了一天的BMP085数据读取问题,接着昨天的那个两个大气压,各种改程序啊,然后参考MWC的还用外部中断判断是否转换完毕,各种调不通啊。。。还读出过5000多Pa的气压,海拔-2000米什么的。&&后来灵感一来发现,我由于在把别人程序拷过来的时候嫌麻烦(别人程序和自己的定义不一样),把uint_32什么的强制转换直接去掉了,因为之前程序里也有好多强制转换直接忽略也没出什么问题,于是我把这些强制转换都加上,uint_32对应的是unsigned long。发现数据就对了,看来调bug还是得靠憋灵感。。。&&不过气压即使读出来发现气压计精度真的很差,静止不动的情况下从一开始的0m能飘到20多m,无语,看来以后当普通的海拔高度计用吧。定高用更精确的气压计或者超声波什么的。
2013年2月6日23:12:01&&今天最大的改动是先把所有的主循环任务放到一个新的函数loop()里,以便以后添加新的任务
&&今天发现一个容易出错的问题就是MDK编程里往函数里输入数组直接输入数组名字即可,不需要加[],加上反而会报错。
&&还有一个卡了好久的问题就是把滑动均值滤波函数和数据处理函数放到ARHS函数里上位机就没有三个角度的信息,好奇怪,调了好久也没调通,但是只要放在READ_MPU6050()函数里就没问题,索性就放到这个函数里,反正读取数据就要连带滤波和数据处理。
&&今天最大的加入就是把PWM输出模块加进去了,虽然是直接拷贝别人的,不过大概看了一下发现也不是很难。基本原理是用TIM4定时器先预分频,72M降到24M,然后设置一个计数上限1000,即PWM的频率是24M/1000=24k Hz,然后TIM4有4个通道,每个通道有寄存器,用通道寄存器和总寄存器比对输出PWM,有点类似8051F的PCA高速输出模式。
&&但是又出现一个问题,定时器的预装填值到底用不用减1,PWM例程里1000上限装填的是999,但是更多的例程是不减1的,以后有示波器专门实验一下。
2013年2月8日21:39:33&&基本上飞控已经初具雏形,现在PWM输出和输入都加上了,现在PWM输入调通了,接下来再调PWM输出。&&在编程中发现,每个通用定时器(2~6)都有四个通道,相当于PCA,非常强大,可以产生四路PWM或者检测输入的四路PWM。不过每个定时器的端口是由限制的,芯片是定义好的。参见手册(《STM32中文参考手册》)81页。其中,我用TIM2输入PWM,所以对应PA0~3,用TIM4输出PWM,对应PB6~9。
&&而原来产生任务时钟基的定时器变为了TIM3任务,留出TIM2给PWM输入,其实用基本定时器6或7就可以给任务产生时基,但是还不会配置基本定时器,留给以后改变吧。这样可以把TIM3通用定时器留给其他功能。毕竟简单任务就应该配置简单定时器
&&然后我在程序中加入了滑动均值滤波器,基本原理是依次更新数组的数据,然后每次调用都把数组所有数据相加再除以数组大小。代码如下
& &接下来是头疼了好久的PWM输入的问题,程序是参考的MWC飞控。MWC飞控接收遥控信号给了两种方式,一种是用一个端口检测一路PPM信号,另一种是用8个端口依次扫描每个端口的PWM脉宽。这里我采用了后一种,这样可以直接使用遥控接收机的信号,否则要用PPM信号需要从接收机里的一个引脚里引出PPM信号,或者用解码器,都比较麻烦。&&MWC的流程是先初始化TIM2,用TIM2的四个通道进行读取。当时犯了一个错误就是MWC程序TIM2已经GPIOA端口的APB总线时钟在程序其他地方已经打开了,所以程序这里没打开时钟的代码,而我直接用人家的代码没有任何反应,后来才发现这点赶紧把GPIO,NVIC,TIM2的初始化代码补全,然后就正常了。&&MWC的端口扫描的基本原理是触发TIM2中断后进入中断,然后来一个for循环循环判断四次(因为有四路输入),看是哪个通道产生的中断,判断出以后用一个switch语句把捕捉到的高电平(或低电平)时间赋给变量val,然后根据state-&state标记位判断是高电位时间计数还是低电平时间计数,分别赋给state-&rise和state-&fall。当然,要获取一个rise一个fall是两次进入中断函数完成的。然后他判断这两个计数大小,相减或者求相减的补数得到高电平时间。这是一个非常巧妙的方式。&&但是一开始的时候整个过程非常占用CPU时间,以至于PWM输入功能一打开,CPU只执行PWM输入功能,其他的都不执行。然后我就想找关闭PWM输入功能的语句。试了好久,关GPIO时钟,关中断向量,关TIM2,都没用。没办法,从初始化函数开始一部分加一部分的关闭尝试,当关闭TIM2时钟是发现中断关闭了。这就好说了,我用任务时钟基的标记位Control_counter == 1时打开TIM2时钟,然后当TIM2中断执行16次(每个高电平至少需要两次中断读取,4个高电平就8次,保守一些让中断执行16次)后关闭TIM2时钟,这样就实现了每2ms读取一次PWM输入的功能。把程序烧进去以后一切就都正常了。
上图是程序运行后通道1输入PWM后的结果,可以看到检测到了值而且在变化。我用另一个stm32产生了50Hz(舵机标准信号)的PWM,脉宽从0%变到90%(飞控PWM输入计数应该从0变到18000,满值是20000)。可以看到,图上读数从19000变到1200左右,说明PWM输入起作用了。由于在0%和100%附近PWM信号会失真,所以最大超过18000最小未达到0也是可以理解的,当然也有可能是没有显示出来的缘故,向上位机输出的频率是20Hz,而扫描的频率是500Hz。&&然后我一次把PWM信号线插入通道2 3 4,也读出了数据,说明四个通道都没问题。
上图是上位机读到的通道1的捕捉值变化,纵坐标是200代表20000,可以看到PWM输入很好的跟随了另一个stm32的PWM输出(从0变到18000再从18000变到0),但是偶尔会出现噪声。如
但是这不是最致命的,PWM跟随期间有一段时间会出现下面的情况
噪声很严重,推测是上升沿和下降沿判断出问题了,看来需要对于这个过程多一些判断,避免出现上面的过程。
2013年2月9日12:44:54&&读取多路PWM没进展中,各种噪声各种紊乱。。。。 &&读取函数重新改了,改得类似原来8051F开发的PCA函数了(break语句卡了好久)。但是读取值向上偏移2000,去学校用示波器试试,现在不知道是产生PWM的stm32缘故还是读取的缘故。&&只能读出一个通道,是因为TIM_GetCapture函数分TIM_GetCapture1,TIM_GetCapture2,TIM_GetCapture3,TIM_GetCapture4,四个通道。
&&关闭看门狗中断,提高TIM2中断优先级
&&循环变量不要用全局,污染变量。
&&实在不行还是用PPM吧
2013年2月11日12:19:28
&&PWM输入搞不定,暂且用上升沿下降沿切换这样读取吧。。。以后再说
2013年2月11日22:42:50
&&终于完美解决PWM输入问题了~哈哈哈~&&原来一直困扰的紊乱问题是由于PWM输入波形不稳有噪声,导致错误触发TIM2中断造成的,然后发现stm32的定时器中断有自带的滤波功能,我把滤波值调到最大,就再也没有紊乱了!
&&不过还有一个问题就是还是偶尔会有突然变成负的情况,后来才知道那不是变成负的了而是超过一定的范围(大概30000多),数就会变成负的,原来用8051F和手机串口通信的时候也遇到过这种情况,所以原来一直用和0比大小是没有用的。结果我把比20000大的都去掉就好多了。
再也没有出现负的的情况。
&&在分析读回来的数据时候,我发现,这些数据依次是增长的关系,之所以有负的是因为超过30000多他自己就会变成负的,由此我彻底明白stm32四个中断和计数器关系了,这四个中断相当于计数器的照相机,计数器计到一定值触发中断通道中断就会记录下来。置位CCRx寄存器是不管用的,必须置位计数器TIMx-&CNT!
&&置位后的结果:
&&有一部分还是负的是因为量程超过30000了。&&所以教训就是以后遇到问题不要光假设瞎调,要深入到问题的每一个步骤发现问题。&&下面是现在的结果:
&&OK,明天把PID控制部分一写,把PWM输出程序再调一下就差不多了~
2013年2月12日14:30:01&&今天我把程序改回原来的4通道输入了,完全没有问题!
一边姿态解算,一边PWM输入。
2013年2月12日21:08:46&&OK,历经一个寒假的四旋翼飞控终于有完工的曙光了。现在已经做到除了四路PWM和2.4g无线通信没调其他都调通了,这两项留给到学校调吧。在家也没有示波器,不方便。
&&下面介绍一下今天做的PID控制。&&主要参考《标准的PID处理例程》 &&&&PID算法比较简单,就是测量值和期望值做差得到误差,然后把误差存起来得到PrevError和LastError,也就是上上次的误差和上次的误差,用来做微分运算(即相邻两次误差的差),然后还有pp-&SumError,存放积分值的。然后把比例积分微分值分别乘以比例积分微分系数就得到控制量。
这个截图里的红色划线代码是把期望值和测量值做差,乘以2000再强制转换成char型,这样就把比较小的误差值转变成整型了,有利于提高运算速度。精度为1//PI=0.03°,这个精度已经比较高了。这整个过程相当于定点浮点运算。
&&在PID控制函数里,我先通过遥控器的值得到期望值再通过PID运算得到四个PID输出量,再用这四个输出量控制四个电机。&&其实整个PID控制是比较简单的,这个飞控只是一个平台,将来在这个平台上将进行遗传和神经网络的验证。
上图是比较暴力的晃动飞控板时测得的数据,红黄蓝是俯仰滚转偏航角的变化。后面紫色的三角形是PWM输入跟随,可以看到飞控程序很好的完成了测量和计算工作。并且整个过程是加上PID控制的。
2013年2月13日20:26:16&&今天主要完善了PWM输出功能,原来PWM输出之所以调不通是由于通道中断没有初始化,应该分别对四个通道进行初始化。
通过对这几个通道的设置PWM波就生成了,本来想用之前测PWM占空比的程序测一下生成的占空比,但是由于生成的PWM波频率是+1/1000=24kHz,频率太高,单片机无法测出,不过把占空比改变的程序烧进去再把输出查到LED灯上,LED灯的亮度确实在变化,说明PWM生成程序起效了。&&PWM生成是通过STM32定时器输出比较的TIM_OCMode_PWM2模式,这里有两种模式TIM_OCMode_PWM1、TIM_OCMode_PWM2其实只是极性不同,就是输出的PWM高低电平会相反。很奇怪的是,手册上说STM32的定时器有TIM_ICMode_PWM1模式用来测PWM输入信号的高电平时间和周期,但是写上这个后编译器报错说没有这种模式,到网上查也没有很好的解决方案。&&在设置PWM输出引脚时有一个问题就是如果设置成B端口所有引脚打开,程序就出问题了,如果打开要用的PB6~7就没问题,不清楚是为什么,可能是和其他地方的设置冲突了。&&在做PID运算时出现的问题就是为了节约内存我把变量设置成char型,但是参数传递过程中出现问题,我想输出值传入500,但是上位机显示只有244,索性把变量设置成int型就没问题了。&&在用上位机看PID效果时我发现俯仰角正负变化相同的角度,和姿态解算的结果不同,导致PID运算输出也不同。这样的原因是加速度计没有校准,由于原来对加速度计的精度要求也不高,所以一直没有校准。校准的方式和磁力计类似,不过比较简单,只是单纯的通过上位机的数据找最大值和最小值,这两个值的和除以2就是偏差,然后把初始数据减去这个偏差。然后测了一下各个通道的量程,发现基本上都是8200左右,也就是说不存在数据组成的是一个椭圆的问题,用atan直接计算就可以得到角度。通过校准以后,俯仰角数据就比以前准确了。原来水平放置俯仰角是1.8°左右,现在已经变成0.6°了。
上图是水平放置是的读数。飞控写到这里也就NRF24L01模块没加上了,这个去学校加吧,因为家里没有插针,飞控板上的SPI模块无法使用。而且用串口也可以。
日23:05:48&&试着加24L01,结果失败了,还是去学校加吧,实在不行还是用串口模块。
日19:46:41&&24L01在开发板上调通了,换到飞控板上就不行,可能是没焊好,开学把排针焊上去试试。
日18:19:14GPS模块终于调通了,原来刚才数据读不出来是由于数据超出了short型变量,应该改成long型。
日14:26:25&&今天用HUB连上飞控板,发现飞控板非常不稳定,后来直接连到U口上发现就正常了,可能是HUB在数据集合和分配的时候出问题了吧。&&记着用UART2时关闭PWM输入的3 4通道。遥控器通道值:油门:& && && & 【2】 俯仰:(俯-&仰)【1】 1603滚转:906~1866(左-&右)【0】 1386偏航:(左-&右)【3】1616& && && && && && && && && && && && && && && && && && && && && && && && && &&&在做期望值计算的时候有个奇怪的现象就是正值时正常的,负值就不正常了,后来发现还是强制转换的事。
PWM输出示波器一直显示异常,后来居然发现是GND和信号线插针搞反了!偏航角初始化太早了,有误差。偏航目标值的角度弧度转换,搞错了。而且要把目标偏航角限定在0~360°之间。偏航角误差过大导致PID运算量过大,程序出现问题。把延时取消MPU6050会不出数据。飞控无法解锁,标记位uchar定义,无法超过500;偏航一直减少,最后发现偏航通道没有值,偏航通道输入线拔下来了!使用电调时,不要超过1KHz,否则不转。50&&6%到9%100 12%到18%200 28%到 36%1000 即使100%也不转频率越大越平稳程序里使用200Hz采集到的四个桨的转速组1:82 & && && &&&1.02PID: 俯仰 滚转P13 D500,稍有感觉蓝牙模块指令:
即AT+BAUDX(X=1~C)日17:41:50结构体里定义不能赋值&&神经网络加上去以后调节速度特别慢,怀疑是输出太小了,以误差15°为例。归一化后为15/180=0.08,然后用matlab仿真
一个0.08的阶跃信号,控制输出最大为80多,显然太小了,PWM输出量程是10000,所以把输出放大系数调成40000,改天再试试。
日16:22:07&&TIM1的中断叫TIM1_UP_IRQHandler,这样写TIM1才能正常使用,和通用的不一样,通用没有中间的UP。stm32103CBT6只有TIM1,2,3,4,没有5,具体有哪些要看stm8选型手册。&&记得换IIC口买的飞控是GPIOB67日15:56:18&&飞控老跑飞,后来发现PWM输入中断的抢占优先级和任务时钟信号中断的抢占优先级一样,降低PWM输入优先级后解决此问题。日17:45:29互补滤波里的四元数要先初始化或者赋予随机数,要不永远是0。而且四元数要是全局变量。系统节拍必须小于最小延时。不用遥控器一定要把遥控器输入计算目标角的语句关掉!
日11:47:02
本帖子中包含更多资源
才可以下载或查看,没有帐号?
本帖最后由 zywei_09 于
23:30 编辑
咦?怎么添加附件?
xieshuangok 发表于
没有连载,我急着上传附件,不会啊。
zywei_09 发表于
没有连载,我急着上传附件,不会啊。
上面有个 附件&&的东西&&点击就可以添加啊
开源,加油!!
加油我顶你
收藏了,谢谢!
先学习学习!
楼主别光发代码,多解释下啊
马学家 发表于
楼主别光发代码,多解释下啊
里面有项目开发日志,解释的很详尽。
准备玩飞控&&先学习学习&&谢楼主分享
再学习...............
楼主有开发日志,这个很好。有没有飞控的艳照和视频啊
本帖最后由 svon 于
20:44 编辑
想问一下楼主,不用加速度计和磁传感器校正,陀螺仪能做到什么地步啊?我的没一会儿就跑飞了!
能给一个全姿态罗盘的资料链接吗?
svon 发表于
想问一下楼主,不用加速度计和磁传感器校正,陀螺仪能做到什么地步啊?我的没一会儿就跑飞了!
能给一个全 ...
没试过,不过好像记得论坛里有只用陀螺仪的,你可以找找;全姿态罗盘的问题我的日志里有论述。
wuguoyan 发表于
楼主有开发日志,这个很好。有没有飞控的艳照和视频啊
正在试飞。
很好的习惯,不断的写开发进度,赞一个
原理图可以开源吗?想做。。
zywei_09 发表于
没试过,不过好像记得论坛里有只用陀螺仪的,你可以找找;全姿态罗盘的问题我的日志里有论述。 ...
我在陀螺仪积分的时候是将角度增量换成四元数,再和当前姿态四元数相成更新的,不知道这个用的公式对不对,可以帮忙看看吗?
/*将增量欧拉角转换成四元数*/
void EulerAngle_To_Quaternion(AngleL3G Gyro)
& & & & float fCosRoll=cos(Gyro.x/2);
& & & & float fSinRoll=sin(Gyro.x/2);
& & & & float fCosPitch=cos(Gyro.y/2);
& & & & float fSinPitch=sin(Gyro.y/2);
& & & & float fCosYaw=cos(Gyro.z/2);
& & & & float fSinYaw=sin(Gyro.z/2);
& & & & QAngleUpdate.w=fCosRoll*fCosPitch*fCosYaw+fSinRoll*fSinPitch*fSinY
& & & & QAngleUpdate.x=fCosPitch*fSinRoll*fCosYaw-fSinPitch*fCosRoll*fSinY
& & & & QAngleUpdate.y=fCosRoll*fCosYaw*fSinPitch+fSinRoll*fSinYaw*fCosP
& & & & QAngleUpdate.z=fSinYaw*fCosPitch*fCosRoll+fCosYaw*fSinPitch*fSinR
/*四元数乘法,用于姿态更新*/
void Quaternion_Multiply(Quaternions A,Quaternions B)
& & & & QAngleStatus.w=A.w*B.w-A.x*B.x-A.y*B.y-A.z*B.z;
& & QAngleStatus.x=A.w*B.x+A.x*B.w+A.y*B.z-A.z*B.y;
& & QAngleStatus.y=A.w*B.y-A.x*B.z+A.y*B.w+A.z*B.x;
& & QAngleStatus.z=A.w*B.z+A.x*B.y-A.y*B.x+A.z*B.w;
/*将四元数转化成欧拉角(弧度)*/
void Quaternion_To_EulerAngle(Quaternions QAttitude)
& & & & AngleGyro.y=asin(CLAMP(2*(QAttitude.w*QAttitude.y-QAttitude.x*QAttitude.z),-1.57,1.57));
& & & & AngleGyro.x=atan2(2*(QAttitude.w*QAttitude.x+QAttitude.z*QAttitude.y),1-2*(QAttitude.y*QAttitude.y+QAttitude.x*QAttitude.x));
& & & & AngleGyro.z= atan2(2*(QAttitude.w *QAttitude.z+QAttitude.y*QAttitude.x) ,1-2*(QAttitude.z*QAttitude.z+QAttitude.y*QAttitude.y));
& & & & & & & &
LZ好人!顶一个!
svon 发表于
我在陀螺仪积分的时候是将角度增量换成四元数,再和当前姿态四元数相成更新的,不知道这个用的公式对不对 ...
你的意思是把欧拉角的增量通过公式转换成四元数的增量?
能持之以恆的寫紀錄不容易啊
之前也想把過程記錄下來
不過幾天後就懶得寫了
john800422 发表于
能持之以恆的寫紀錄不容易啊
之前也想把過程記錄下來
温故而知新,可以为师矣。
zywei_09 发表于
你的意思是把欧拉角的增量通过公式转换成四元数的增量?
是的,你看我的转换公式有问题吗?因为我看到过不同的版本
svon 发表于
是的,你看我的转换公式有问题吗?因为我看到过不同的版本
QAngleUpdate.z=fSinYaw*fCosPitch*fCosRoll&&+&&fCosYaw*fSinPitch*fSinR这句,我用的公式里是-不是+,具体是啥改天我查下书。
好帖,MARK
mark,四轴是俺的一个梦想。
zywei_09 发表于
QAngleUpdate.z=fSinYaw*fCosPitch*fCosRoll&&+&&fCosYaw*fSinPitch*fSinR这句,我用的公式里是-不是 ...
楼主你可以看一下这里,我是参照这里的,在最后那里提到&&如在Direct3D中,笛卡尔坐标系的X轴变为Z轴,Y轴变为X轴,Z轴变为Y轴,我也不知道是什么意思。
记号一个,,顶顶
john800422 发表于
能持之以恆的寫紀錄不容易啊
之前也想把過程記錄下來
你好,我想请教你一个问题,希望了解的话能给一下解释吧!
欧拉角旋转矢量法得到方向余弦矩阵要和四元数的方向余弦矩阵相等的话,应该是要他们的参考坐标系相同吧?
如果欧拉角旋转矢量法的参考坐标系是北x-东y-地z(绕y轴转是俯仰角),而导航坐标系是东x-北y-天z的话(绕x轴转是俯仰角),该如何使用四元数和欧拉角的转换呢?
本帖最后由 john800422 于
00:44 编辑
svon 发表于
你好,我想请教你一个问题,希望了解的话能给一下解释吧!
欧拉角旋转矢量法得到方向余弦矩阵要和四元数 ...
假設由 &北x-东y-地z& 轉換到 &东x-北y-天z&
NewCodi = RotateM * OldCodi
OldCodi : 原本座標
NewCodi : 新座標
RotateM : 為先對X轉180度, 再對Z轉-90度的旋轉矩陣 // 不一定要這樣轉
將新座標帶回原本的式子中
應該可行, 沒有仔細想過&驗證, 僅供參考
但最好還是使用相同的座標系
以減少麻煩
本帖子中包含更多资源
才可以下载或查看,没有帐号?
svon 发表于
你好,我想请教你一个问题,希望了解的话能给一下解释吧!
欧拉角旋转矢量法得到方向余弦矩阵要和四元数 ...
在欧拉角表示法中,坐标变换有专门的齐次变换矩阵,研究生复试还考了这个:p,我记得四元数表示法下也有对应的变换矩阵。只不过欧拉角表示下的由于旋转顺序的不同共有2^3=8种不同的矩阵,但是对于旋转顺序学界没有严格的定义,之前用一款惯导产品就遇到过这种麻烦。而四元数法就不存在这个问题,这是他优点所在。
john800422 发表于
假設由 &北x-东y-地z& 轉換到 &东x-北y-天z&
NewCodi = RotateM * OldCodi
非常感谢!我大概懂了。Rb=Cbn*Rn,对于Cbn(从n到b)这个矩阵,用四元数表示的矩阵要和欧拉角表示的矩阵如果相等,前提是他们的参考坐标系要相同,这样才能转到同一个载体坐标系去。
支持一下~~~
zywei_09 发表于
在欧拉角表示法中,坐标变换有专门的齐次变换矩阵,研究生复试还考了这个:p,我记得四元数表示法下也有 ...
楼主,陀螺仪有个DRDY中断,是怎么用的啊?
好复杂的东西~
如我所需暂且收下,如果用上,再来感谢
顶楼住阿,今年比赛做这个
写日志,是个好习惯,学习
感谢楼主,学习了~~
mark下,留着
学习了,顶顶···
不错,不过离能平稳的飞行还有需要继续实测调试。
好!好东西啊!顶
ran-Interrupt 发表于
好!好东西啊!顶
谢谢!& && && &
留着以后搞四轴的时候再回来慢慢研究
svon 发表于
楼主,陀螺仪有个DRDY中断,是怎么用的啊?
不太记得了,查下MPU6050的手册吧。
shujianxiaoyao 发表于
不错,不过离能平稳的飞行还有需要继续实测调试。
是的,有点那个意思了,不过赶上研究生开学要忙活好久才能安定下来接着搞。
楼主讲的非常详细啊,还有开发日志!致敬!
ad1984fr 发表于
楼主讲的非常详细啊,还有开发日志!致敬!
共同学习,共同进步。
你离高手有多远?
楼主牛逼,顶你
感谢分享!
zpc2013 发表于
你离高手有多远?
这个,永无止境吧。
WZY,您好,您用的STM32是STM32的哪一款?
LZ好习惯啊,记得坚持!
谢谢分享你的经验和心得,虽然我想很多人都不会自己去写一个飞控,但看你的开发过程却是绝佳的学习材料!
支持一下。。。
楼主卖你的套件吗
也支持一下!
求工程啊!
先收下,带时在用
剑舞 发表于
WZY,您好,您用的STM32是STM32的哪一款?
STM32103& && && && && && && && && && && && &
标记一下,以后用的着
才看到,顶起。
不错啊楼主
先收下,谢谢啦
本帖最后由 济南电子爱好者 于
16:53 编辑
请教一个问题, 如果已经知道 飞行器当前姿态四元数&&a向量& &, 目标 四元数 为 t 向量 .&&则转动增量 为&&t向量&&-&&a 向量 =&&△t 向量& &.&&由△t 向量&&应该如何确定 每个电机的转速(这里不考虑 PD 控制,一些其它参数) ??
或者有没有什么其它的方法 ??&&简单的说, 姿态的差如何映射到 电机的转动上 ?
济南电子爱好者 发表于
请教一个问题, 如果已经知道 飞行器当前姿态四元数&&a向量& &, 目标 四元数 为 t 向量 .&&则转动增量 为&&t ...
意思是说选用不同的控制器么?不用PID控制器的话还有很多其他的控制方法,反步啊,神经网络啊,H无穷等。
本帖最后由 济南电子爱好者 于
09:05 编辑
zywei_09 发表于
意思是说选用不同的控制器么?不用PID控制器的话还有很多其他的控制方法,反步啊,神经网络啊,H无穷等。 ...
谢谢你的回复,我大概没说清楚,我的意思是 做pid 控制的话,输入的参数是什么 ?&&现在看来输入的参数有欧拉角(不考虑转序,似乎不太合理,因为当偏差角度比较大时,就不得不考虑了),还是一种是利用四元数控制(俊的博客).
济南电子爱好者 发表于
谢谢你的回复,我大概没说清楚,我的意思是 做pid 控制的话,输入的参数是什么 ?&&现在看来输入的参数有欧拉 ...
输入是当前姿态角和预期姿态角的偏差,用欧拉角表示。
楼主的代码怎么找不到工程文件呀
我居然很认真的看了楼主的日志 发现从3月7日到8月8日之间的日志都木有了
好东西啊,都是牛人啊
好贴 必须顶
楼主的代码怎么找不到工程文件呀
没有传工程,在一个百度网盘里有人传过。
我居然很认真的看了楼主的日志 发现从3月7日到8月8日之间的日志都木有了 ...
做毕设去了可能。。。
谢谢,看看。
没有传工程,在一个百度网盘里有人传过。
能发个链接参考一下吗?
能发个链接参考一下吗?
留个邮箱,我给你发。
能共享一份吗 ,谢谢
好长呀,慢慢看
顶一个,正想学习飞控
顶顶顶,楼主q方便说下吗?方便找你学习,,谢谢了
顶顶顶,楼主q方便说下吗?方便找你学习,,谢谢了
终于找到了!谢谢分享!学习下!
mark& && && &
感谢楼主,但是里面没有工程文件,不方便直接打开看代码,能分享一下工程文件吗?
mark,楼主无私!
好东西,mark
mark 感觉四轴好难啊
楼主 给力啊!! 给你顶上额!
楼主好伟大,这些资料对我们新手来说帮助好大的
你好,我看了你的日志里面求解加速度计的加速度是用ADC的值除835.066,为什么是这个数呢,不应该是直接除以4096再乘9.8(等于除415.)吗
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com}

我要回帖

更多关于 单片机通信协议 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信