这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» DIY与开源设计» 电子DIY» ㄣtensl╰☆ 四轴探索之路---之试飞成功

共12条 1/2 1 2 跳转至

ㄣtensl╰☆ 四轴探索之路---之试飞成功

高工
2014-03-31 21:46:55 打赏

由于时间最近一直很紧张,忙公司忙自己的业务,更重要的是还要忙着结婚这件最重要的事,不一定会时时更新帖子,但我会尽量努力持续更新关注!

初步打算在遥控器上加一块IIC的12864点阵屏做显示用(手头有几块闲着也是闲着),可以显示一些控制参数、电池电流等基本信息,其实希望@烈火能把两块板子通信给一下的这样会进度快一下,不过自己花点时间两块板子的程序同时自己弄应该也能搞定,可能会慢些!

下面是进度表:

时间安排 实现内容 说明 楼层地址
2014.3.31 四轴组件到手 由于下班回家早没拿到手,明天贴图 3楼
2014.4.1 焊接完成 到时会晒图看情况发试飞视频 4楼
2014.4.2-3  组装电机,下程序 今天中午试飞一下,算是可以了,不过水平很洼,晚上写一下心得 





关键词: 四轴 tensl 探索

院士
2014-04-01 09:16:59 打赏
2楼
嗯,等待上图

高工
2014-04-01 14:56:11 打赏
3楼

四轴到手:

晚上有时间传一下焊接好的图;


高工
2014-04-01 22:14:40 打赏
4楼

把焊接过程图片晒一下:

小USB口的焊接图

下一张是飞控小开关

飞控主板

遥控板

今天上班没找到502胶水,电机没有装,也就还没试飞,争取明天中午试飞一下!



高工
2014-04-02 19:57:01 打赏
5楼

自己盖座楼;

今天没抽出时间捣鼓偷个懒先发一个以前写的暖通行业控制温度的PID算法,下面是贴的代码:

/********************************* PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式) 函数入口: RK(设定值),CK(实际值),KP,KI,KD;KP_Flag,kaidu_s,kaidu_x 函数出口: U(K) //PID运算函数 *********************************/ s32 PIDOperation (PIDValueStr PID) { s32 Temp_s32[3],temp; if(PID.KP_Flag == 0) //P参数为正 { if((PID.RK_U16 - PID.CK_U16) > JINGDU) //设定值大于实际值(0.5℃精度)以上 { if( PID.RK_U16 - PID.CK_U16 > FAZHI ) //偏差大于20度否? { PIDset1.Uk_s32 = (s32)(PID.Kaidu_s*0x0FFF); //偏差大于20度为控制阀上限开度阀值输出 } else { PIDset1.Ek_s32[0] = PID.RK_U16 - PID.CK_U16; //偏差<=20度,计算E(k) PIDset1.Ek_s32[2] = PIDset1.Ek_s32[1]; Temp_s32[0] = (PID.KP_s8)*((PIDset1.Ek_s32[0])-(PIDset1.Ek_s32[1])); Temp_s32[1] = (PID.KI_U8)*(PIDset1.Ek_s32[0]); Temp_s32[2] = (PID.KD_U8)*((PIDset1.Ek_s32[0])-2*(PIDset1.Ek_s32[1])+(PIDset1.Ek_s32[2])); if((Temp_s32[0]+Temp_s32[1]) > 0) temp = (s32)((Temp_s32[0]+Temp_s32[1]+Temp_s32[2])*1); else temp = 0; PIDset1.Ek_s32[1] = PIDset1.Ek_s32[0]; if(temp > 0) // 是否控制量为正数 { PIDset1.Uk_s32 += temp; //PID计算值输出 if(PIDset1.Uk_s32 >= (s32)(PID.Kaidu_s*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_s*0x0FFF); //否则为上限幅值输出 } else if(PIDset1.Uk_s32 <= (s32)(PID.Kaidu_x*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_x*0x0FFF); //否则为下限幅值输出 } } else { PIDset1.Uk_s32 += 0; //控制量输出为负数,则输出不变 } } } else if((PID.CK_U16 - PID.RK_U16) > JINGDU) //实际值大于设定值(0.1℃精度)以上 //设定值小于实际值? { PIDset1.Ek_s32[0] = PID.RK_U16 - PID.CK_U16; //计算偏差E(k) PIDset1.Ek_s32[2] = PIDset1.Ek_s32[1]; Temp_s32[0] = (PID.KP_s8)*((PIDset1.Ek_s32[0])-(PIDset1.Ek_s32[1])); if(Temp_s32[0] > 0) Temp_s32[0] = -Temp_s32[0]; Temp_s32[1] = (PID.KI_U8)*(PIDset1.Ek_s32[0]); Temp_s32[2] = (PID.KD_U8)*((PIDset1.Ek_s32[0])-2*(PIDset1.Ek_s32[1])+(PIDset1.Ek_s32[2])); temp = (s32)((Temp_s32[0]+Temp_s32[1]+Temp_s32[2])*1); PIDset1.Ek_s32[1] = PIDset1.Ek_s32[0]; if(temp < 0) //是否控制量为负数 { PIDset1.Uk_s32 += temp; //PID计算值输出 if(PIDset1.Uk_s32 >= (s32)(PID.Kaidu_s*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_s*0x0FFF); //否则为上限幅值输出 } else if(PIDset1.Uk_s32 <= (s32)(PID.Kaidu_x*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_x*0x0FFF); //否则为下限幅值输出 } } else { PIDset1.Uk_s32 += 0; //控制量输出为正数,则输出不变 } } } else if(PID.KP_Flag == 1) //P参数为负 { if((PID.RK_U16 - PID.CK_U16) > JINGDU) //设定值大于实际值(0.5℃精度)以上 { if( PID.RK_U16 - PID.CK_U16 > FAZHI ) //偏差大于20度否? { PIDset1.Uk_s32 = (s32)(PID.Kaidu_s*0x0FFF); //偏差大于20度为控制阀上限开度阀值输出 } else { PIDset1.Ek_s32[0] = PID.RK_U16 - PID.CK_U16; //偏差<=20度,计算E(k) PIDset1.Ek_s32[2] = PIDset1.Ek_s32[1]; Temp_s32[0] = (PID.KP_s8)*((PIDset1.Ek_s32[0])-(PIDset1.Ek_s32[1])); Temp_s32[1] = (PID.KI_U8)*(PIDset1.Ek_s32[0]); Temp_s32[2] = (PID.KD_U8)*((PIDset1.Ek_s32[0])-2*(PIDset1.Ek_s32[1])+(PIDset1.Ek_s32[2])); if((Temp_s32[0]+Temp_s32[1]) > 0) temp = (s32)((Temp_s32[0]+Temp_s32[1]+Temp_s32[2])*1); else temp = 0; PIDset1.Ek_s32[1] = PIDset1.Ek_s32[0]; if(temp > 0) // 是否控制量为正数 { PIDset1.Uk_s32 -= temp; //PID计算值输出 if(PIDset1.Uk_s32 >= (s32)(PID.Kaidu_s*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_s*0x0FFF); //否则为上限幅值输出 } else if(PIDset1.Uk_s32 <= (s32)(PID.Kaidu_x*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_x*0x0FFF); //否则为下限幅值输出 } } else { PIDset1.Uk_s32 += 0; //控制量输出为负数,则输出不变 } } } else if((PID.CK_U16 - PID.RK_U16) > JINGDU) //实际值大于设定值(0.1℃精度)以上 //设定值小于实际值? { PIDset1.Ek_s32[0] = PID.RK_U16 - PID.CK_U16; //计算偏差E(k) PIDset1.Ek_s32[2] = PIDset1.Ek_s32[1]; Temp_s32[0] = (PID.KP_s8)*((PIDset1.Ek_s32[0])-(PIDset1.Ek_s32[1])); if(Temp_s32[0] > 0) Temp_s32[0] = -Temp_s32[0]; Temp_s32[1] = (PID.KI_U8)*(PIDset1.Ek_s32[0]); Temp_s32[2] = (PID.KD_U8)*((PIDset1.Ek_s32[0])-2*(PIDset1.Ek_s32[1])+(PIDset1.Ek_s32[2])); temp = (s32)((Temp_s32[0]+Temp_s32[1]+Temp_s32[2])*1); PIDset1.Ek_s32[1] = PIDset1.Ek_s32[0]; if(temp < 0) //是否控制量为负数 { PIDset1.Uk_s32 -= temp; //PID计算值输出 if(PIDset1.Uk_s32 >= (s32)(PID.Kaidu_s*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_s*0x0FFF); //否则为上限幅值输出 } else if(PIDset1.Uk_s32 <= (s32)(PID.Kaidu_x*0x0FFF)) { PIDset1.Uk_s32 = (s32)(PID.Kaidu_x*0x0FFF); //否则为下限幅值输出 } } else { PIDset1.Uk_s32 += 0; //控制量输出为正数,则输出不变 } } } return PIDset1.Uk_s32; }


菜鸟
2014-04-02 21:01:41 打赏
6楼
好厉害 佩服佩服

高工
2014-04-02 22:03:37 打赏
7楼
谢谢夸奖,其实水平也就算一般,复杂算法弄得少

高工
2014-04-03 13:30:23 打赏
8楼

今天中午飞了一下,试飞基本算成功了,不过控制还是不容易,水平太洼了,等练个差不多了再发视频吧


高工
2014-04-05 23:02:26 打赏
9楼

今天抽时间改了一下遥控器硬件,夹了一块屏,接下来有时间就可以写程序了


工程师
2014-04-06 18:57:42 打赏
10楼

不错啊,右手边的多余的IO就是为你的液晶屏留的,加油!


共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]