浅谈自己的电磁智能车调试之路(1 )电磁

        我是一名大一新生,刚接触智能车不久,发表博客的目的是可以通过自我分析和总结来提升自己,这上面也有很多的大佬,内容如有不当之处欢迎各位大佬批评指点。

        我使用的是逐飞的CH32V307VCT6芯片。我使用的是电磁巡迹的方式,采用了6个电感。具体排布方式如下:

浅谈自己的电磁智能车调试之路(1 )电磁_第1张图片

电磁代码部分:

//初始化ADC
    adc_init(ADC_IN10_C0);
    adc_init(ADC_IN11_C1);
    adc_init(ADC_IN12_C2);
    adc_init(ADC_IN13_C3);
    adc_init(ADC_IN14_C4);
    adc_init(ADC_IN15_C5);
void Get_adc(void)	//ADC获取并处理
{
	int i = 0;
	float dat[6] = {0};
    int temp[6][10] = {0};
    for( i = 0;i < 10;++i){
        temp[0][i] = adc_convert(ADC_IN11_C1, ADC_12BIT);
        temp[1][i] = adc_convert(ADC_IN10_C0, ADC_12BIT);
        temp[2][i] = adc_convert(ADC_IN13_C3, ADC_12BIT);
        temp[3][i] = adc_convert(ADC_IN12_C2, ADC_12BIT);
        temp[4][i] = adc_convert(ADC_IN15_C5, ADC_12BIT);
        temp[5][i] = adc_convert(ADC_IN14_C4, ADC_12BIT);


    }
    for( i = 0; i < 6; i++)
        {
        dat[i] = MedianFilter( &temp[i][0],10);
        }

	for( i = 0;i < 6;++i)
	    adc[i] = (float)dat[i] / (4096.0f);

}

        电感跟电磁线垂直时采集到的数值理论上是最大的,因此我认为在直线寻迹时横电感起最主要的作用、弯道寻迹时斜电感起主要作用、十字判断时竖电感最容易识别。

        接下来仅为我个人调车时的步骤和方法,能力有限,仅供参考。

         第一步,我会将车模放到赛道的一条直道上,并且让车模尽量在赛道的正中间并将车身摆正,我认为这一点比较重要,若车身有较大的倾斜会对车辆寻迹的路径出现偏移。调整好车模后观察两个横电感以及2个斜电感的数值,将两对电感分别调到一个合适的相同的数值(个人建议靠外的2个电感数值小一些,而靠内的2个电感数值调大一些,这个车可能会好调一点)。

        第二步,将车模放到右转90度角的前面大概3-5cm的地方,同时要保证车模在直道的延长线上不发生偏移,然后记录斜电感对的误差、横电感对的误差以及总误差,误差函数如下。

//-------------------------------------------------------------------------------------------------------------------
//  @brief      比值法计算error
//  @param      全局数组w_walue[]   0~3从左到右
//  @param      MODE 1~3 1:斜放一对电感   2:垂直一对电感    3:两对电感组合  4:竖放一对电感
//  @return     error
//  Sample usage:               error=Get_Error(void);
//-------------------------------------------------------------------------------------------------------------------
float Get_Error(unsigned char MODE)
{
    float error;
    switch(MODE){
    case 1:
    error=( sqrt(adc[3]) - sqrt(adc[0]) )/(  adc[0] + adc[3] );break;
    case 2:
    error=( sqrt(adc[2]) - sqrt(adc[1]) )/( adc[2] + adc[1] );break;
    case 3:
    error=( (sqrt(adc[3]) + sqrt(adc[2]) - sqrt(adc[1]) - sqrt(adc[0]) )/( adc[0] + adc[3] + adc[2] + adc[1] ));break;
    case 4:
        error=( sqrt(adc[5]) - sqrt(adc[4]) )/(  adc[5] + adc[4] );break;
    }
    return error;
}

 这里是低端版的模糊pid

if(xie_error > 1.2 &&(chuizhi_error>=0.23||chuizhi_error<=-0.23))          //识别为右转
        {
           Steer_pid.Kp = xie_error*lstcs1+lstcs2  ;
        }
        else if(xie_error < -1.2&&(chuizhi_error>=0.26||chuizhi_error<=-0.26) )    //识别为左转
        {
          
           Steer_pid.Kp = -xie_error*lstcs01+lstcs02  ;
        }
        else          //识别为直道
        {                                                                               
           Steer_pid.Kp = 50;
        }

        第三步,按照第二步的方法测出并记录左转时的3个误差值。

        第四步,通过记录的数值修改代码中的参数。

        最后实现了上述步骤就可以基本实现寻迹功能,如果要完善车辆运行时的路径则需要调pid的参数、电感误差值等,这些部分后面再说。

         我最近发了一篇文章里面包含了常用的功能函数以及常用的模块底层驱动函数封装库,大家感兴趣的可以收藏一下,需要的时候就不用到处找代码,一篇就够用,我会持续更新。

        常用模块函数封装库(持续更新中。。。。。。)-CSDN博客 

你可能感兴趣的:(c语言,算法,单片机)