上一篇应该是在凌晨五点钟写的发布的,也是3.10日,这一篇可能也是3.10日完成,也可能是3.11完成,日期就写3.10日了
这次的任务就是,更改接线
更改接线的主要原因是要使用正交编码接口了,增加新的定时器的话,串口的一些接口就会变,所以基本上所有接线都变了。
改线
正交编码器接口
使用4个定时器作为4个编码器的接口TIM1、TIM2、TIM4、TIM8
接口分别是PE9,PE11、PA5,PB3、PD12,PD13、PC6,PC7
1电机
A相 ------------ PE9
B相 ------------ PE11
2电机
A相 ------------ PA5
B相 ------------ PB3
3电机
A相 ------------ PD12
B相 ------------ PD13
4电机
A相 ------------ PC6
B相 ------------ PC7
更改代码
开启编码器计数
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim8, TIM_CHANNEL_ALL);
定时中断里获取计数值并设置为0
Count1=__HAL_TIM_GET_COUNTER(&htim1);
Count2=__HAL_TIM_GET_COUNTER(&htim2);
Count3=__HAL_TIM_GET_COUNTER(&htim4);
Count4=__HAL_TIM_GET_COUNTER(&htim8);
__HAL_TIM_SET_COUNTER(&htim1,0);
__HAL_TIM_SET_COUNTER(&htim2,0);
__HAL_TIM_SET_COUNTER(&htim4,0);
__HAL_TIM_SET_COUNTER(&htim8,0);
PWM接口
定时器资源不足,所以用了以前的PWM接口来接正交编码器,所以新的PWM接口用了几个零散的定时器,有TIM3、TIM10、TIM11、TIM12、TIM13
接口分别是PA6PA7PB0PB1、PF6、PF7、PB15、PF8
左前A,右前B
AIN1 ------------ PA6
AIN2 ------------ PA7
BIN1 ------------ PB0
BIN2 ------------ PB1
VM ------------ 7.6-30V
GND ------------ GND
VCC ------------ 5V
GND ------------ GND
AOUT1 ------------ A电机线电源-
AOUT2 ------------ A电机线电源+
BOUT1 ------------ B电机线电源+
BOUT2 ------------ B电机线电源-
左后C,右后D
AIN1 ------------ PF6
AIN2 ------------ PF7
BIN1 ------------ PA2
BIN2 ------------ PF8
VM ------------ 7.6-30V
GND ------------ GND
VCC ------------ 5V
GND ------------ GND
AOUT1 ------------ C电机线电源-
AOUT2 ------------ C电机线电源+
BOUT1 ------------ D电机线电源+
BOUT2 ------------ D电机线电源-
更改代码
使能八个电机的pwm通道
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//使能8个电机pwm通道
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim11,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim12,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim13,TIM_CHANNEL_1);
更改速度控制程序
void set_velocity(int moto,float target_speed)
{
if(moto==1)
{
if(motor_custom_abs(motor_custom_abs(realV1)-motor_custom_abs(target_speed))>30) PWM1=(motor_custom_abs(target_speed)+102)/4.17f;
if(target_speed>=0)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, 0); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, PWM1); //修改比较值,修改占空比pwm2/7200
}
if(target_speed<0)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, PWM1); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, 0); //修改比较值,修改占空比pwm2/7200
}
}
if(moto==2)
{
if(motor_custom_abs(motor_custom_abs(realV2)-motor_custom_abs(target_speed))>30) PWM2=(motor_custom_abs(target_speed)+133)/4.42f;
if(target_speed>=0)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, PWM2); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, 0); //修改比较值,修改占空比pwm2/7200
}
if(target_speed<0)
{
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, 0); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, PWM2); //修改比较值,修改占空比pwm2/7200
}
}
if(moto==3)
{
if(motor_custom_abs(motor_custom_abs(realV3)-motor_custom_abs(target_speed))>30) PWM3=(motor_custom_abs(target_speed)+109)/4.18f;
if(target_speed>=0)
{
__HAL_TIM_SetCompare(&htim10, TIM_CHANNEL_1, 0); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim11, TIM_CHANNEL_1, PWM3); //修改比较值,修改占空比pwm2/7200
}
if(target_speed<0)
{
__HAL_TIM_SetCompare(&htim10, TIM_CHANNEL_1, PWM3); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim11, TIM_CHANNEL_1, 0); //修改比较值,修改占空比pwm2/7200
}
}
if(moto==4)
{
if(motor_custom_abs(motor_custom_abs(realV4)-motor_custom_abs(target_speed))>30) PWM4=(motor_custom_abs(target_speed)+137)/4.40f;
if(target_speed>=0)
{
__HAL_TIM_SetCompare(&htim12, TIM_CHANNEL_2, 0); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim13, TIM_CHANNEL_1, PWM4); //修改比较值,修改占空比pwm2/7200
}
if(target_speed<0)
{
__HAL_TIM_SetCompare(&htim12, TIM_CHANNEL_2, PWM4); //修改比较值,修改占空比pwm1/7200
__HAL_TIM_SetCompare(&htim13, TIM_CHANNEL_1, 0); //修改比较值,修改占空比pwm2/7200
}
}
}
定时中断
定时中断改成了TIM9,分频后的频率为20Hz
开启定时中断9
HAL_TIM_Base_Start_IT(&htim9);
串口
UART2是陀螺仪的接口,更改成了PD5(TX)PD6(RX)
UART5是正前方激光测距的接口,未更改,仍然是PC12PD2
UART6是侧方的激光测距接口,更改为PG9PG14
程序不用改
测试
各项数据获取正常,并且电机运行正常
成功
更改控制程序
今晚改了一晚上控制程序,但最后效果还是一般
和老师联系讨论了一下,应该是我走的方向不太对,所以下次任务就是:
- 测试八个方向的开环程序,并观察总结思考解决方法