首页IT科技电磁四轮设计报告范文(四轮电磁——电磁循迹位置式PID)

电磁四轮设计报告范文(四轮电磁——电磁循迹位置式PID)

时间2025-05-03 00:45:11分类IT科技浏览3882
导读:四轮电磁------电磁循迹位置式PID...

四轮电磁------电磁循迹位置式PID

看了很多篇博客           ,针对我们智能车校内赛的电磁循迹                  ,我对循迹方案如下:

电磁前瞻+舵机+例程

我们使用的是龙邱科技的电磁前瞻:

舵机

舵机是由占空比控制旋转方向     ,但一定要注意❗️:例程上给定的占空比是250~1250        ,那么舵机中值就应该为750;但是                  ,当舵机装上车后        ,舵机的中值必须要自己去测试:我测得的舵机占空比为483-603     ,则舵机中值应该为543            。🌕所以                  ,一定要确定属于自己的智能车的舵机中值                。

以及逐飞科技的例程:

采集电磁+处理数据

对电磁需要采集并处理数据;大致过程如下: 定义二维数组储存电感采集的数值           ,最多保存四次采集的数据 采集电感并保存在数组中 滤波处理数据  ,减小误差 归一化适应赛道 利用差比和求出偏离中心电磁线的bias /****定义变量****/ int32 GET_AD_VALUE[4][GET_AD];//采集GET_AD数据 int32 GET_AD_MEAN[4];//5组平均数 int32 GET_AD_MEAN_OLD[4][12];//5组过去的平均数 static uint32 GET_AD_STORE[4][4];//两侧+中间两个 一共使用4个电感 //差比和 float OUT_rate=10.0; //对外圈电感的信任程度 float IN_rate=20.0; //对内圈电感的信任程度 float OTHER_rate=20.0;//对底下电感的信任 float bias;//差比和输出 float bias_n;//差 float bias_d;//和 //电感数据的处理与获取 void AD_get(void) { int i=0,j=0,k=0; uint32 temp ; /*1.定义二维数组储存电感采集的数值                 ,最多保存四次采集的数据 ADC_PIN0 | ADC_PIN1 | ADC_PIN2 | ADC_PIN3 L_AD[4][4] L_AD_Mean { 0 1 2 3 mean均值 0 |*** *** *** *** *** R2 1 |*** *** *** *** *** R1 2 |*** *** *** *** *** M0 3 |*** *** *** *** *** L1 4 |*** *** *** *** *** L2 } */ for(i = 0;i < 4;i++)//每次数据后移              ,以保存当此采集的数据 { GET_AD_STORE[i][3] = GET_AD_STORE[i][2]; GET_AD_STORE[i][2] = GET_AD_STORE[i][1]; GET_AD_STORE[i][1] = GET_AD_STORE[i][0]; } //2.电感采集并保存在数组中 //连续读十次取平均 for(i = 0;i < GET_AD;i++) { GET_AD_VALUE[0][i] = adc_mean_filter(ADC_0,ADC_PIN0,ADC_12BIT, GET_AD);//R2 GET_AD_VALUE[1][i] = adc_mean_filter(ADC_0,ADC_PIN1,ADC_12BIT, GET_AD);//R1 GET_AD_VALUE[2][i] = adc_mean_filter(ADC_0,ADC_PIN2,ADC_12BIT,GET_AD);//M0 GET_AD_VALUE[3][i] = adc_mean_filter(ADC_0,ADC_PIN3,ADC_12BIT, GET_AD);//L1 } //冒泡排序法排序 for(k = 0;k < 4; k++) { for(i = 0; i < GET_AD - 1; i++) { for(j = 0; j < GET_AD - 1 - i; j++) { if(GET_AD_VALUE[k][j] > GET_AD_VALUE[k][j + 1]) { temp = GET_AD_VALUE[k][j]; GET_AD_VALUE[k][j] = GET_AD_VALUE[k][j + 1]; GET_AD_VALUE[k][j + 1] = temp; } } } } //掐头去尾 取平均 for(i = 0;i < 4;i++) { for(j = 2;j < 9;j++) { GET_AD_STORE[i][1] += GET_AD_VALUE[i][j]; } GET_AD_MEAN[i] = (uint16)GET_AD_STORE[i][1]/8; } //3.对采集数据的处理 for(i = 0;i < 4;i++) { GET_AD_MEAN[i]=1000*(float)(GET_AD_MEAN[i]*1.0- AD_MIN*1.0)/(AD_MAX*1.0 - AD_MIN*1.0);//归一化适应赛道 }//GET_AD_MEAN[i]是从0开始的 应该为0 1 2 3 lcd_showstr(0,1,"rpm:");//最右边 lcd_showint32(30,1,GET_AD_MEAN[3],5); lcd_showstr(0,2,"rlm:");//右中间 lcd_showint32(30,2,GET_AD_MEAN[2],5); lcd_showstr(0,3,"llm:");//左中间 lcd_showint32(30,3,GET_AD_MEAN[1],5); lcd_showstr(0,4,"lpm:");//最左边 lcd_showint32(30,4,GET_AD_MEAN[0],5); //传统意义的差比和算法 bias_n = ((GET_AD_MEAN[0] - GET_AD_MEAN[3])*OUT_rate + (GET_AD_MEAN[1] - GET_AD_MEAN[2])*IN_rate)*1000;//差 bias_d = ((GET_AD_MEAN[0] + GET_AD_MEAN[3])*OUT_rate + absq(GET_AD_MEAN[1], GET_AD_MEAN[2])*OTHER_rate)*100;//求和 bias = bias_n * 1.0/ bias_d; lcd_showstr(0,5,"bias:"); lcd_showfloat(50,5,bias,3,2); } /******返回两个数的差的绝对值******/ uint32 absq(int32 a,int32 b) { if(a >= b) return a-b; else return b-a; }

舵机位置式PID

/************************* * AD_cal(); *控制舵机达到指定位置483-603 * -60 ---- 60 * 将舵机中值看为0 * P输出: * P输出 =Kp * 本次误差 * D输出 =Kd (本次误差-2上次误差+上次误差) * 得到的AD_out一定要加上舵机中值占空比后在控制舵机 * **********************/ void AD_cal() { AD_pid.sum_error =bias*1.9/(OUT_rate+IN_rate); AD_out = AD_pid.K_p * AD_pid.sum_error + AD_pid.K_d * (AD_pid.sum_error-AD_pid.last_error); AD_pid.last_error = AD_pid.sum_error; printf("AD_out:%f\n",AD_out); lcd_showstr(0,6,"AD:"); lcd_showfloat(30,6,AD_out,3,2); if(AD_out > AD_limit) AD_out = AD_limit; else if(AD_out < -AD_limit) AD_out = -AD_limit; AD_out+=STEER_MIDDLE; steer_duty(AD_out); }

以上便是我最近对于电磁PID的一个学习⭐️      。

在做完速度环PID和舵机PID后,我的小车已经可以简单循迹和跑起来啦😋~~

灰常开心              ,嘿嘿                 ,但是仍需不断的优化和改进方案         。在后续的时间里  ,我会着手于元素判断           ,舵机PID的调参                。继续努力                  ,加油!!!

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
上虞区论坛(上虞bbs上虞) 提高企业曝光度(提升网站曝光率的终极秘籍)