0


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

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

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

电磁前瞻+舵机+例程

  • 我们使用的是龙邱科技的电磁前瞻:在这里插入图片描述
  • 舵机 舵机是由占空比控制旋转方向,但一定要注意❗️:例程上给定的占空比是250~1250,那么舵机中值就应该为750;但是,当舵机装上车后,舵机的中值必须要自己去测试:我测得的舵机占空比为483-603,则舵机中值应该为543。🌕所以,一定要确定属于自己的智能车的舵机中值。
  • 以及逐飞科技的例程:在这里插入图片描述

采集电磁+处理数据

  • 对电磁需要采集并处理数据;大致过程如下:
  1. 定义二维数组储存电感采集的数值,最多保存四次采集的数据
  2. 采集电感并保存在数组中
  3. 滤波处理数据,减小误差
  4. 归一化适应赛道
  5. 利用差比和求出偏离中心电磁线的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;//和//电感数据的处理与获取voidAD_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 3lcd_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;elsereturn b-a;}

舵机位置式

PID
/*************************
 * AD_cal();
 *控制舵机达到指定位置483-603
 *      -60    ----     60
 * 将舵机中值看为0
 * P输出:
 * P输出 =Kp * 本次误差
 * D输出 =Kd (本次误差-2上次误差+上次误差)
 * 得到的AD_out一定要加上舵机中值占空比后在控制舵机
 * **********************/voidAD_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;elseif(AD_out <-AD_limit)        AD_out =-AD_limit;
    AD_out+=STEER_MIDDLE;steer_duty(AD_out);}

以上便是我最近对于电磁

PID

的一个学习⭐️。
在做完速度环

PID

和舵机

PID

后,我的小车已经可以简单循迹和跑起来啦😋~~
灰常开心,嘿嘿,但是仍需不断的优化和改进方案。在后续的时间里,我会着手于元素判断,舵机

PID

的调参。继续努力,加油!!!

标签: 算法 人工智能 c++

本文转载自: https://blog.csdn.net/m0_65046930/article/details/127749705
版权归原作者 橘子味的熊 所有, 如有侵权,请联系我们删除。

“四轮电磁------电磁循迹位置式PID”的评论:

还没有评论