前言
STM32CubeMX 直流电机控制、HAL库、cubemx
通过encoder来获取当前转速。
使用的芯片是stm32f401ccu6
电机控制使用的是tb6612
一、STM32CubeMX环境配置
1.1 PWM输出配置
PWM的频率大概是10KHZ,CK_CNT=TIMXCLK/(PSC+1)。所以我们将预分配系数为0,arr寄存器的值为8400-1;
1.2电机控制引脚配置
对于定时器而言除了红色位置需要修改以外其他地方不需要修改。(其他基础配置不做解析)。
TB213A需要两个引脚来控制电机的正反转以及停止所以我们在定义两个gpio为输出:
(为了方便我们使用user label)
注:TB213A还有一个STBY引脚他需要使能高电平,直接接入单片机的vcc+即可。
二、代码
1.主函数开启
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//开启pwm输出
2.moto代码
新建一个moto.h 和moto.c文件
moto.c
#include "moto.h"
#include "tim.h"
/**************************************************************************
函数功能:赋值给PWM寄存器
入口参数:PWM
返回 值:无
**************************************************************************/
void Set_Pwm(int moto)//赋值给PWM寄存器
{
int pwm_abs;
if(moto>0) Moto(1);
else Moto(0);
pwm_abs=myabs(moto);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwm_abs);
}
/**************************************************************************
函数功能:电机的正反转//
入口参数:mode mode=1时为正转 mode=0时反转 mode =3时关闭
返回 值:无
**************************************************************************/
static void Moto(int mode)
{
if(mode==1)
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);
}
else if(mode==0)
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
}
if(mode==3)
{
HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
}
}
/*
* 函数功能:取绝对值
* 入口参数:int
* 返回值:无 unsingned int
*/
static int myabs(int num)
{
int temp;
if(num<0) temp=-num;
else temp =num;
return temp;
}
moto.h
#ifndef __MOTO_H
#define __MOTO_H
#include "main.h"
static void Moto(int mode);
static int myabs(int num);
void Set_Pwm(int moto);//赋值给PWM寄存器
#endif
3. 主循环代码
Set_Pwm(4200);//取值只能在 -8400---+8400