赞
踩
STM32CubeMX 直流电机控制、HAL库、cubemx
通过encoder来获取当前转速。
使用的芯片是stm32f401ccu6
电机控制使用的是tb6612
PWM的频率大概是10KHZ,CK_CNT=TIMXCLK/(PSC+1)。所以我们将预分配系数为0,arr寄存器的值为8400-1;
对于定时器而言除了红色位置需要修改以外其他地方不需要修改。(其他基础配置不做解析)。
TB213A需要两个引脚来控制电机的正反转以及停止所以我们在定义两个gpio为输出:
(为了方便我们使用user label)
注:TB213A还有一个STBY引脚他需要使能高电平,直接接入单片机的vcc+即可。
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//开启pwm输出
新建一个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
Set_Pwm(4200);//取值只能在 -8400---+8400
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。