本帖最后由 Cortexxx 于 2016-11-23 14:00 编辑 8月份众筹的板子 今天分享一下四轴飞控 . b: Z8 _' |! g0 ^1 i# i2 h q Nucleo 32板子比较小比较适合做飞控 1 _% [0 ^1 i; [8 [ 采用了互补滤波和串级PID& {% | A) J- Q1 M* R 个人认为最重要的就对PID的了解 和PID的调试 + h& |: s' M9 g# f3 O1 o . C- ?. W+ l* j. N ( f; {. N" {3 A4 m* A 第一步 买买买 无刷电机: LZ买的是朗宇2212 980KV 电机; 买电机的时候不要贪小便宜,贵一点无所谓,买个正品比什么都重要;当然如果程序写的好,电机好坏就无所谓了。% y% i2 C# i8 _6 d! e6 ~3 u5 } 电子调速器: aka 电调 好盈20A' B6 s1 R( T8 Q: e 螺旋桨: 9寸 遥控器:天地灰6II + Q" d. x1 t. G0 r4 @ 遥控器比较贵,建议买个二手的玩玩。天6足够用了 6通道的。. c* h1 M% ]. q7 | 航模锂电池:HRB 3S 35C 3000mAh 种类挺多的 钱多就买好的 没钱就买个中等价位的;无底洞!! btw 还要买充电器 6轴传感器:mpu6050 * H, c2 w. L L& | A. l) O1 Z 主控芯片:STM32L432 主频100MHz Nucleo32 体积比较小做飞控板很不错的;之前用了一块Nucleo64做过,实在有点大! 机架:450: U7 Y c" {3 l; f' p$ Q0 x3 M. p PS:还需要一个降压模块12V->5V的 酱就差不多圆满了 还有一些小东西 比如说 镍氢电池 扎线带 blah blah blah# f9 z8 A, ]8 E c* n$ F4 | 第二步 调试陀螺仪 安装什么的就不说了 还要当然如果是第一次做的话 做个十字形的比较好调试 LZ是新手所以做了一个十字形的! o% k, d9 X0 `/ z8 F" P) a mpu6050用的是IIC接口 LZ用的软件模拟的IIC8 m8 P8 x8 A" y( _8 \; s/ f 6轴传感器 分别是3个方向x y z 方向的加速的 和角速度: I5 ?$ t8 H& g& X4 O LZ采用的是最简单滤波方式--互补滤波 卡尔曼滤波没弄过,想弄卡尔曼的话自己好好学学吧!毕竟响应速度快。 1.IIC 和 UART 程序9 f' i2 p- U3 h& u7 m7 J0 q 2.初始化mpu6050 3.滤波
所以每次启动程序的时候都要初始化零点误差。 LZ只初始化了 角速度的零点误差。因为加速度的零点误差 需要放在一个固定的已知角度来调; - o# l. ?( m% Y 上面的 程序1 是互补滤波 AX AY AZ是加速度的值 GX.... 是角速度的值. p/ m" b1 y/ O! s/ {1 E8 Z GXErr 是角速度的零点误差值9 M, ~# z0 I7 I- R& k5 Z GET 加速度 和角速度值的时候 用了一个低通滤波1 e! c/ I1 p# \+ V& V 然后开始单位换算 之后的anglex+=(mpu.AX-anglex)*0.05f+mpu.GX/500.0f*0.95f; 是互补滤波 由于Z轴是旋转轴用不到加速度所以就直接把角速度积分的到 角度(自旋)的偏移量;/ C2 U* D' i. G6 A2 L* j 得出来的角度也不知道好不好看 所以这时用串口把得到的角度发出去,然后用Excel把得到的点绘制成折线图。观察图像是否圆滑。有没有阶跃。+ T6 {+ l6 e% L/ O! z. F5 K 角度读取的时间间隔必须保持一致 % |, O6 p: a/ |- ]7 ^9 A4 E8 ~ 所以必须用定时器读 LZ采用500Hz的读取速度。 因为之后还有积分微分呢 周期T必须一致( T! Y0 q2 h7 U4 T! b- M 第三步 遥控器&电机驱动 遥控器发送信号到接收器,接收器输出50Hz的PWM 高电平时间≈1.0ms~2.0ms 具体多少用逻辑分析仪看看吧!3 ]8 N, p5 ?6 Q 只是让自己知道占空是比多少这还远远不够 还需要让单片机知道! 两种方法:输入捕获 或者外中断加定时器 LZ用的是外中断加定时器 上升沿来个中断让读一下 TIMx->CNT的值 然后下降沿在GET一下TIM->CNT寄存器的值 两次值做差就得到的高电平时间。酱就可以了;很简单的;8 z7 `) B1 G$ m' ?" w 无刷电机的驱动 MCU输出PWM(50Hz 高电平时间和遥控器的高电平时间一致或者成一定比例)->电调->无刷电机 我是这么写的程序:1.当接收器的值小于一定值的时候 关掉所有电机 2.然后把增大的值 X0.5或者0.6(自己定) 在加上基础的值, [& y0 _2 k. S! y7 H) f 第四步 PID) \$ V' P) P" }4 Y PID控制器 包括比例积分微分& i1 e" I% y' r' z$ C- ^# z 航模采用的是位置式PID+ D! ~; F! r5 l/ s$ k 比例环节 理解很简单就是误差 × Kp 可以理解为系统响应的速度Kp的值越大响应速度越快 过大就开始震荡* p1 M/ t- `+ x* m; o $ @( D% K- U! w9 Q" v* D ! i' @$ Q O) E: _' j 微分环节 微分就是求导 位移求导就相当于速度 速度求导就相当于加速度 mpu6050自带角速度 就不必把角度求导了 直接用陀螺仪输出的角度就即可; 可以把微分环节看做一个负反馈,或者说当做一个阻尼系统,如果速度越快微分出来的值就越大 当做负反馈来较小相应速度。当时 朋友给我举过一个例子,一个摆锤,抬到一定角度之后松开。一开始的时候摆锤的高度最大,所以垂直于 摆锤绳子上的力(沿运动方向的力)最大。可以把这个力理解为比例环节的值。当 摆锤 运动到零点时(期望位置) 速度最大,我们做的PID目的就是让他在0点的时候停下来。OK 这时候我们引入了 微分环节(阻尼系统)--空气阻力, 空气阻力一定是速度越快阻力越大。 这样的话摆锤在来回摆动第20个周期之后停了一下。很明显阻尼系统太小了。那好吧!!这次我们把摆锤放在水里,可能两个周期就停了。所以我们就说这事一个调的比较不错的PD系统。(没有积分环节所以没有I) 上面的例子可以看出 放在水里 比放在空气里面要好 但是要理解成微分环节 越大越好!!!2 C; B' L" h1 r/ I 积分环节:I 积分 换句话说就是累加的和 作为一个成熟的飞控系统 积分相当重要。但是 自己写的飞控感觉对I的要求并不算高。 I 累计误差,误差值的累加如果说你的飞机的重心不在中心上,那么一定要加一定的I作为补偿。4 q1 c3 G3 H) O1 D; v 再用上面的那个例子 这回把摆锤放在沙子里,好吧!!他根本不回到达零点!!沙子的阻力太大了,所以这时候我们需要加上个 积分环节 选出累计误差。时间越长累计误差的值就越大。可以想象一下一开始差了1°,控制时间是100Hz 的话 一秒钟之后就到了100°。相当可怕了 所以积分环节一定要加上限!!!而且积分的Ki要小一点!! R9 m% K+ @# b! w6 E% A8 p+ p , `( C. q0 n6 |5 m4 v+ k& F3 b0 U % g6 W7 R( G+ ^( q1 k& g" l0 d 这样调试完成了 去空地上试一试,JEEEEEEEZ 四轴跟陀螺一样在地上转! 没错 我们还需要最Z轴进行PID 和上面的调试方法差不多 只是我们只用到了Z轴的角速度D。 Z轴速度的积分想到与 角度P, Z轴角速度积分之后再积分。相当于I。; [* D, F/ q: F/ f) n. E; w8 A - C. B, u& y4 i% N; a PID系统也要在定时器中断里面运行 控制周期指的就是这个!!! 速度可以降到100Hz或者50Hz!如果降低频率的话需要对PID的一些参数进行修改!!!!!!! . E9 d% m2 a9 q# } 第五步 PID的调试 重中之重( t2 W/ {, }4 C+ m3 R/ P LZ对PID的调试也没什么经验,这东西全凭感觉! 而且需要和你的四轴有一定的情感,随心所动 如果感觉自己的PID不稳定的话 可以使用串级PID 就是上面的到的PID输出的值 作为第二PD(没有I) 的P的输入量,然后微分D 这次需要把角速度进行一次微分,得到角加速度。 PWM_D_Y=(mpu.GY*500.0f)*PWM_KD_Y; 我程序里面写的*500 其实相当于/0.002; 然后在输出给电机。 上图!上图!上图!' M; [# m/ [, Z$ U% e7 k6 d7 m( R ) v% S0 n" t5 A3 j3 @1 e # t$ X" Z) t- s+ ~/ S0 v 里面带的那个ESP8266的是我之前想法的帖子 但是没发 这回把那个工程再贴上去吧 # k6 @. d$ d2 a, b1 ]4 u; O+ N3 @# w 仅仅只是点个灯 而且属于局域网的wifi 没连接外放 如果连接外网的话需要在网上租一个云服务。太麻烦了 而且还需要花钱 就没弄!7 o* d% T3 ^9 M" R' S% w1 {+ m; x : Q4 }( W4 d1 h0 O: Q |
基于STM32L476+64M QSPI接口PSRAM(IPS6404L)开源分享(含源码)
基于STM32L4R9 的QuadSPI Flash 通讯速率不理想经验分享
STM32L4超低功耗功能概述
基于STM32L431RC Standby和RTC中断唤醒经验分享
基于STM32L431的睡眠模式经验分享
STM32L4R9 的 QuadSPI Flash 通讯速率不理想
STM32L4、STM32L4+和STM32G4系列 微控制器上的专利代码读取保护
STM32L433在STOP模式USART不能工作的解决办法
【实测教程】基于STM32L4系列的实测教程分享合集
STM32L4系列MCU的五种振荡器和使用说明
对 但是我对汽车电子不太了解。差不多就是个闭环控制 读取实时角度 反馈给单片机 然后根据角度 改变电机转速。 达到动态平衡。
最开始玩了一下WiFi 然后就直接拿那个模板写的飞控了