四轮寻迹智能车的设计(逐飞IMX-RT1064)
目录
1.前篇
1064单片机基础函数
(1)adc (模数/数模转换)
一般就是芯片的输出和输入,芯片输出信号,要做数模转换。芯片接收的信号,要进行模数转换。( 只要跟CPU打交道的通常是数字量,和控制系统相关的一般是模拟非电量(温度,速度等),模拟量和数字量之间的通信就需要A/D和D/A转换,A/D和D/A转换起到了桥梁的作用。)
原理:
重要参数
分辨率:
AD转换器输出的数字量的最低位变化一个数时,对应输入模拟量的变化量,A/D转换器的位数越多,能够分辨的最小模拟电压值就越小,分辨率就越大,STM32的A/D转换器是12位的,假设最大输入电压为5V,所能分辨的最小电压量就是5/(2^12),很多时候我们会直接说一个n位的A/D转换器分辨率为n,这只是一个设计参数,不是实际的测量值。
相对精度:
A/D转换器实际输出数字量与理论值之间的最大差值称为相对精度
转换速度:
A/D转换器完成一次转换所需要的时间,一般是us级别
相关函数(逐飞库为例)
/******************************/
//引脚adc初始化函数
//参数:adc模块(两个),adc通道(B组引脚),通道分辨率(8,10,12位—分辨率越高精度越高)
//ADCN_enum,ADCCH_enum等函数都是枚举类型的
/******************************/
void adc_init(ADCN_enum adcn, ADCCH_enum ch, ADCRES_enum resolution)
//adc采集转换函数
//参数:adc模块,adc通道
uint16 adc_convert(ADCN_enum adcn, ADCCH_enum ch)
(2)pit(定时中断)
对于逐飞库来说其可使用的中断通道数有三个PIT_CH1,PIT_CH2,PIT_CH3,但是三个中断函数是写在同一个函数中,然后初始化要使用的中断通道,在中断触发的时候,会进入中断函数,并进行中断函数类型的判断,并执行对应的操作。
//引脚pit初始化函数
void pit_init(void );
//pit中断时间设置(时间单位为ms,us,一般使用ms)
void pit_interrupt(PIT_enum pit_ch, uint32 count)
(3)pwm(波特率)
波特率输出,其实就是将电压微分,在部分积分控制,从而输出你想要的电压值,从而控制舵机,电机等,根据电压输出量不同,而输出不同转态的器件。
PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
/******************************/
//1.pwm初始化
//参数:通道号及引脚号,pwm频率,pwm占空比
//第一个参数包含了两个信息,通道号,和引脚号,因为初始化函数中有个字函数void pwm_iomuxc(PWMCH_enum pwmch),内部通过参数一,进行了引脚的判断和初始化引脚pwm状态。
/******************************/
void pwm_init(PWMCH_enum pwmch, uint32 freq, uint32 duty)
/******************************/
//2.pwm占空比设置,通过改变占空比,实现对于输出量的控制
/******************************/
void pwm_duty(PWMCH_enum pwmch, uint32 duty)
/******************************/
//3.pwm频率设置(与初始化操作类似)
/******************************/
void pwm_freq(PWMCH_enum pwmch, uint32 freq, uint32 duty)
(4)gpio(引脚使用)
用于高低电平的读,写,以及IO复用外部中断。
/******************************/
//GPIO初始化
//参数:选择的引脚,引脚方向(输入或输出),输出高低电平,上下拉电阻
void gpio_init(PIN_enum pin, GPIODIR_enum dir, uint8 dat, uint32 pinconf)
2.舵机篇
(1)模数转换:通过运放和滤波,调制电路将电感采集回来的模拟量转换成数字量
(2)定时中断控制:先将对应的芯片接收电感转换后数字量的引脚 初始化为定时中断功能,再对接收到数据进行转换,保存和处理
(3)数据处理:对于采集回来的电感量使用冒泡法进行排序,再取中间的值的平均数,作为单次采集的数据。在将数据应用于PID算法控制,算出舵机每次的偏差值,由中值和偏差值得出需要输出的正确的舵机控制信号
中断控制部分函数
①电感采集
uint8 i;
uint8 left[10]={0};
uint8 right[10]={0};
//左右电感 ad数据采集
for(i=0;i<10;i++)
{
left[i]=adc_convert(ADC_1,ADC1_CH3_B14);
right[i]=adc_convert(ADC_1,ADC1_CH4_B15);
}
left_ad = sort(left);
right_ad = sort(right);
out_ad = left_ad + right_ad;
return;
电感采集后的数据处理使用冒泡排序法
//就是一次中断采集十次电感数据,并排序,取中间三个值的平均值
uint8 sort(uint8 *sum)
{
uint8 i,j;
uint8 temp,k;
for(i=0;i<10;i++)
{
for(j=0;j<9-i;j++)
{
if(sum[j]>sum[j+1])
{
temp=sum[i];
sum[i]=sum[i+1];
sum[i+1]=temp;
}
}
}
k=(sum[4]+sum[5]+sum[6])/3;
return k;
}
②差比和
//将上诉采集到的左右两边电感的数据进行差比和计算(归一化处理)
float cha=0;
float he=0;
//差比和
cha = left_ad - right_ad;
he = left_ad + right_ad;
now_abs = cha/he;
now_abs *= beishu;
③PID算法控制(增量式控制)
//PID控制
last_2_abs = now_abs - last_abs;
result= (P * now_abs + D * last_2_abs);
last_2_abs = last_abs;
last_abs = now_abs;
result = 640 - result;
最后舵机pwm的输出写在定时中断函数中
(实际算法只采用前两项,即PD控制)
参数调整:包括舵机中值,舵机左右极限打脚值,PID控制参数,的调整。
3.电机篇
目前电机控制处于开环状态,持续输出一个pwm值,控制电机正向转动。
4.调试篇
IAR工程编译,调试硬件连接过程:
(顺序如下)
将调试器连上芯片
调试器连上电脑
电脑debug将程序写入芯片
打开芯片电源开关
IAR中点击go按钮(跑程序)
通过livewight(实时变量观测窗口)观测目标变量,并可以对目标变量进行修改,从而对得到的结果数据进行观测,实现实时调试参数。
结束时先将程序停止运行,再将USB数据线拔掉,在将芯片电源开关关掉
参数调整
控制系统无非要求稳,准,快(但本次只是用到PD控制)
即最大超调量和上升时间,反应到小车上是舵机打脚的角度大小和打脚的反应速度。在调整的时候可以先调整一个参数,例如P,使另一个参数值零。P调得差不多了,在调整D。
本文地址:https://blog.csdn.net/luyaozhima/article/details/109263612
您可能感兴趣的文章:
如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!
网友评论