我是一名大一新生,刚接触智能车不久,发表博客的目的是可以通过自我分析和总结来提升自己,这上面也有很多的大佬,内容如有不当之处欢迎各位大佬批评指点。
我使用的是逐飞的CH32V307VCT6芯片。我使用的是电磁巡迹的方式,采用了6个电感。具体排布方式如下:
电磁代码部分:
//初始化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的参数、电感误差值等,这些部分后面再说。
我最近建了一个嵌入式的QQ交流群,感兴趣的可以进群了解一下,我会在群里分享一些常用的代码封装,以及一些项目的源码。QQ群讨论也是完全开放,只要不打广告大家可以就嵌入式尽情的沟通和交流,大家对文章中的内容有疑问也可以在群中提出,有空会尽我所能给大家一些帮助。QQ群号:643408467