第六章-电机驱动和PWM
6.1-认识电机驱动
项目使用电机驱动芯片为A4950、下面是电机驱动的相关介绍
我们按照这种使用方法
这我们使用一个图介绍
6.2-使用电机驱动(独立工程)
分析和编写代码
综合电机使用方法、C8T6单片机硬件资源、小车原理图我们要进行如下配置
PA11-TIM1_CH4 定时器PWM输出-PWMA 前面已经完成
PA8-TIM1_CH1 定时器PWM输出-PWMB 前面已经完成
PB3-GPIO输出-BIN1
还有两个管脚没有初始化
生成代码
开始添加控制电机正反转与速度的代码,进行仿真和电机测试,示波器测量
添加AIN1、BIN1控制代码
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);//设置AIN1 PB13为 低电平
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET); //设置BIN1 PB3为高电平
HAL_Delay(1000);
//两次会使得电机反向。
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);//设置AIN1 PB13为 高电平
HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET); //设置BIN1 PB3为低电平
仿真测试代码
使用软件仿真
检测是否软件仿真设置正确
开启仿真-添加PB13和PB3到逻辑分析仪
全速仿真运行
实物测试代码
如何让电机90%电压转速 旋转
烧录代码
6.3-编写电机转速开环控制函数(另外复制工程)
新建motor文件
包含文件并添加编译
为了方便移植和使用,我们GPIO电平控制写成宏
#define AIN1_RESET HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET)//设置AIN1 PB13为 低电平
#define AIN1_SET HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET)//设置AIN1 PB13为 高电平
#define BIN1_RESET HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET) //设置BIN1 PB3为低电平
#define BIN1_SET HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET)//设置AIN1 PB13为 高电平
下面我们编写小车电机方向和速度控制
/*******************
* @brief 设置两个电机转速和方向
* @param motor1:电机B设置参数、motor2:设置参数
* @param motor1: 输入1~100 对应控制B电机正方向速度在1%-100%、输入-1~-100 对应控制B电机反方向速度在1%-100%、motor2同理
* @return 无
*
*******************/
void Motor_Set (int motor1,int motor2)
{
//根据参数正负 设置选择方向
if(motor1 < 0) BIN1_SET;
else BIN1_RESET;
if(motor2 < 0) AIN1_SET;
else AIN1_RESET;
//motor1 设置电机B的转速
if(motor1 < 0)
{
if(motor1 < -99) motor1 = -99;//超过PWM幅值
//负的时候绝对值越小 PWM占空比越大
//现在的motor1 -1 -99
//给寄存器或者函数 99 1
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, (100+motor1));//修改定时器1 通道1 PA8 Pulse改变占空比
}
else{
if(motor1 > 99) motor1 = 99;
//现在是 0 1 99
//我们赋值 0 1 99
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, motor1);//修改定时器1 通道1 PA8 Pulse改变占空比
}
//motor2 设置电机A的转速
if(motor2 < 0)
{
if(motor2 < -99) motor2 = -99;//超过PWM幅值
//负的时候绝对值越小 PWM占空比越大
//现在的motor2 -1 -99
//给寄存器或者函数 99 1
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, (100+motor2));//修改定时器1 通道4 PA11 Pulse改变占空比
}
else{
if(motor2 > 99) motor2 = 99;
//现在是 0 1 99
//我们赋值 0 1 99
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, motor2);//修改定时器1 通道4 PA11 Pulse改变占空比
}
}
然后我们连接电机主函数进行测试
HAL_Delay(500);
Motor_Set(0,0);
本章结束兄弟们
下章继续-编码器测速部分
联系:Q,1930299709