网站建设费用大概多少钱佛山新网站建设服务
web/
2025/10/6 20:43:16/
文章来源:
网站建设费用大概多少钱,佛山新网站建设服务,公司网站开发费用如何入账,政务网站建设云计算中心前言
很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发#xff0c;同时更愿意将其实现到具体项目中。秉承以上原则#xff0c;发现大家的重心都放在开发中的环境构建过程#xff0c;缺少了不少实际应用场景的运用同时更愿意将其实现到具体项目中。秉承以上原则发现大家的重心都放在开发中的环境构建过程缺少了不少实际应用场景的运用虽然环境搭建确实痛苦。本文主要使用XR806的FreeRTOS到实际的机器人控制应用中并实现部署模糊控制器。环境搭建本文简要略写大家可以看社区其它优秀的文章。文章中应用到的无线控制和多维状态机两个重要的开发应用会在后面的文章中陆续更新。
使用环境
1.本人使用window10VMwareubuntu 18.04 这里不多阐述 2.按照官方文档移植XR806的FreeRTOS
项目介绍
基于XR806——FreeRTOS为项目主控部署先进模糊控制器实现对于竞技机器人的机构控制和定位控制等。 渲染图 实物图 软硬件框架 控制部署
继电推理
在封装好电机驱动电流环时实现对电机的控制相当于建立了一种 继电特性的非线性控制此时使用继电整定法的Z-N临界比例度法去建立模糊域。 根据以下临界系数表整定求出模糊域。
控制器类型KPTnTvKiKdP0.5*Kμ————PD0.8*Kμ—0.12*Tμ—KP*TnPI0.45*Kμ0.85*Tμ—KP/Tn—PID0.6*Kμ0.5*Tμ0.12*TμKP/ TnKP*Tn
模糊推理
模糊推理的核心就是计算出E和EC的隶属度。同时把E和EC分为多种子集情况负最大NB负中NM负小NS零ZO正小PS正中PM正大PB等七种情况。然后计算E/EC种子集的隶属度。
清晰化
进行模糊推理后可以根据计算的隶属度建立模糊规则表实现对输出值的清晰化。对应到应用层的输出函数实现控制输出。 例图 FOC控制 仿真效果 代码实现
以下提供部分代码
自动整定
void PID_AutoTune_Task(void)
{if(pid.AutoRegurating_Status ! START) return;/*定义临界Tc*/float Tc 0.0;static int start_cnt; //记录最大值出现的时间static int end_cnt; //记录周期结束时的时间值 static uint16_t cool_cnt 0; static uint16_t heat_cnt 0;// pid.Autotune_Cnt ; //计数if((pid.Pv_position UP) (pid.Pv pid.Sv)) {cool_cnt ;if(cool_cnt 3) //连续三次都越过则说明真的越过了{pid.Pv_position DOWN; //标记当前在下方了pid.Zero_Across_Cnt ; //标记穿越一次cool_cnt 0;}}else if((pid.Pv_position DOWN)(pid.Pv pid.Sv))//刚才在下方现在在上方{heat_cnt;if(heat_cnt 3) //连续三次都越过则说明真的越过了{pid.Pv_position UP; //标记当前在下方了pid.Zero_Across_Cnt ; //标记穿越一次heat_cnt 0;} }/*****************开始计算强行振荡的周期****************************/ if((pid.Zero_Across_Cnt 2)(start_cnt 0)){start_cnt pid.Autotune_Cnt;printf(start_time %d\r\n, start_cnt);}else if((pid.Zero_Across_Cnt 4)(end_cnt 0)){end_cnt pid.Autotune_Cnt;printf(start_time %d\r\n, end_cnt);}if(pid.Zero_Across_Cnt 4){ /*计算一个震荡周期的时间*/if(start_cnt end_cnt)Tc (start_cnt-end_cnt)/2; elseTc (end_cnt-start_cnt)/2; /*计算Kp,Ti和Td*/pid.Kp 0.6*pid.Kp;pid.Ti Tc*0.5; pid.Td Tc*0.12; /*PID参数整定完成将各项数据清0*/heat_cnt 0;cool_cnt 0; pid.Autotune_Cnt 0;start_cnt 0;end_cnt 0; pid.SEk 0;pid.Zero_Across_Cnt 0; pid.AutoRegurating_EN OFF;pid.AutoRegurating_Status OVER; //开始运行使用新的参数后的PID算法pid.Sv pid.BKSv; }
} 模糊控制
/*模糊规则表*/
int KpRule[7][7] { /*NB, NM, NS, ZO, PS, PM, PB -EC*/{1, 1, 1, 1, 1, 1, 1}, //NB 0~-10{0, 0, 0, 1, 2, 3, 4}, //NM 0~10{0, 0, 0, 1, 2, 3, 4}, //NS 10~20 {0, 0, 1, 1, 2, 3, 4}, //20~30{1, 1, 1, 1, 2, 3, 4}, //30~40{1, 1, 1, 1, 2, 3, 4}, //40 ~50{6, 6, 6, 6, 6, 6, 6}, //50~60
};
static float fuzzy_kp(float err, float errchange)
{ volatile float Kp_calcu; volatile uint8_t num,pe,pec; volatile float eFuzzy[2]{0.0,0.0}; //隶属于误差E的隶属程度 volatile float ecFuzzy[2]{0.0,0.0}; //隶属于误差变化率EC的隶属程度 float KpFuzzy[7]{0.0,0.0,0.0,0.0,0.0,0.0,0.0}; //隶属于Kp的隶属程度 /*****误差E隶属函数描述*****/ if(erreRule[0]) { eFuzzy[0] 1.0; pe 0; } else if(eRule[0]err erreRule[1]) { eFuzzy[0] (eRule[1]-err)/(eRule[1]-eRule[0]); pe 0; } else if(eRule[1]err erreRule[2]) { eFuzzy[0] (eRule[2] -err)/(eRule[2]-eRule[1]); pe 1; } else if(eRule[2]err erreRule[3]) { eFuzzy[0] (eRule[3] -err)/(eRule[3]-eRule[2]); pe 2; } else if(eRule[3]err erreRule[4]) { eFuzzy[0] (eRule[4]-err)/(eRule[4]-eRule[3]); pe 3; } else if(eRule[4]err erreRule[5]) { eFuzzy[0] (eRule[5]-err)/(eRule[5]-eRule[4]); pe 4; } else if(eRule[5]err erreRule[6]) { eFuzzy[0] (eRule[6]-err)/(eRule[6]-eRule[5]); pe 5; } else { eFuzzy[0] 0.0; pe 6; } eFuzzy[1] 1.0 - eFuzzy[0]; /*****误差变化率EC隶属函数描述*****/ if(errchangeecRule[0]) { ecFuzzy[0] 1.0; pec 0; } else if(ecRule[0]errchange errchangeecRule[1]) { ecFuzzy[0] (ecRule[1] - errchange)/(ecRule[1]-ecRule[0]); pec 0 ; } else if(ecRule[1]errchange errchangeecRule[2]) { ecFuzzy[0] (ecRule[2] - errchange)/(ecRule[2]-ecRule[1]); pec 1; } else if(ecRule[2]errchange errchangeecRule[3]) { ecFuzzy[0] (ecRule[3] - errchange)/(ecRule[3]-ecRule[2]); pec 2 ; } else if(ecRule[3]errchange errchangeecRule[4]) { ecFuzzy[0] (ecRule[4]-errchange)/(ecRule[4]-ecRule[3]); pec3; } else if(ecRule[4]errchange errchangeecRule[5]) { ecFuzzy[0] (ecRule[5]-errchange)/(ecRule[5]-ecRule[4]); pec4; } else if(ecRule[5]errchange errchangeecRule[6]) { ecFuzzy[0] (ecRule[6]-errchange)/(ecRule[6]-ecRule[5]); pec5; } else { ecFuzzy[0] 0.0; pec 5; } ecFuzzy[1] 1.0 - ecFuzzy[0]; /*********查询模糊规则表*********/ num KpRule[pe][pec]; KpFuzzy[num] (eFuzzy[0]*ecFuzzy[0]); num KpRule[pe][pec1]; KpFuzzy[num] (eFuzzy[0]*ecFuzzy[1]); num KpRule[pe1][pec]; KpFuzzy[num] (eFuzzy[1]*ecFuzzy[0]); num KpRule[pe1][pec1]; KpFuzzy[num] (eFuzzy[1]*ecFuzzy[1]); /*********加权平均法解模糊*********/ Kp_calcu KpFuzzy[0]*kpRule[0] KpFuzzy[1]*kpRule[1] \KpFuzzy[2]*kpRule[2] KpFuzzy[3]*kpRule[3] \KpFuzzy[4]*kpRule[4] KpFuzzy[5]*kpRule[5] \KpFuzzy[6]*kpRule[6]; printf( %f,%f,%d,%d,kp %f\r\n, err, errchange, pe, pec, Kp_calcu);return(Kp_calcu);
} 实物展示
无刷电机控制
https://www.bilibili.com/video/BV1FN4y1C7fY/?aid874778769cid1302701130pagenull
整体定位控制
https://www.bilibili.com/video/BV1NN411t7Fy/?aid492262076cid1302702003pagenull
以上就是本文分享的全部内容了感谢各位
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/88103.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!