这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 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 跳转至

回复

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