【STM32--平衡车】TB6612FNG详解[特殊字符]——用于电机驱动

1. 介绍

TB6612FNG模块------用于电机驱动

L9110s:通过两个引脚,控制电机正转、反转、(PWM)转的多快转的多慢

TB6612FNG:两个 引脚,控制电机正转、反转,PWM信号单独拿出来控制转速

TB6612FNG接线

TB6612FNG的PWM信号(时钟)连接STM32的PA8和PA11⬅查产品手册

2. 电机驱动模块基本实现

motor

motor_init

经过前面介绍,motor要初始化2个东西:

①普通gpio口(PB12、PB13、PB14、PB15) ②PWM(PB8、PB11)

cpp 复制代码
void motor_gpio_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;          // 两个LED对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);
}

左轮前进、后退

cpp 复制代码
void motor_left_forward(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
}

void motor_left_backward(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
}

边写边调试

右轮前进、后退

cpp 复制代码
void motor_right_forward(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);
}

void motor_right_backward(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
}

但这时候还控制不了速度,所以要加入PWM控制转速(车速)

3. 电机驱动加入PWM

cpp 复制代码
void motor_pwm_init(uint16_t arr, uint16_t psc)
{
    TIM_OC_InitTypeDef pwm_config = {0};
    
    pwm_handle.Instance = TIM1;
    pwm_handle.Init.Prescaler = psc;
    pwm_handle.Init.Period = arr;
    pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&pwm_handle);
    
    pwm_config.OCMode = TIM_OCMODE_PWM1;
    pwm_config.Pulse = 0;
    pwm_config.OCPolarity = TIM_OCPOLARITY_HIGH;
    HAL_TIM_PWM_ConfigChannel(&pwm_handle, &pwm_config, TIM_CHANNEL_1);
    HAL_TIM_PWM_ConfigChannel(&pwm_handle, &pwm_config, TIM_CHANNEL_4);
    HAL_TIM_PWM_Start(&pwm_handle, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&pwm_handle, TIM_CHANNEL_4);
}
cpp 复制代码
void motor_init(void)
{
    motor_gpio_init();
    motor_pwm_init(7200 - 1, 0);
}

修改PWM的值

cpp 复制代码
//修改CCR值的函数
void pwm_left_motor_set(uint16_t val)
{
    __HAL_TIM_SET_COMPARE(&pwm_handle, TIM_CHANNEL_1, val);
}

void pwm_right_motor_set(uint16_t val)
{
    __HAL_TIM_SET_COMPARE(&pwm_handle, TIM_CHANNEL_4, val);
}

边写边调试,main函数中加入低速、中速、高速

我们想再智能点,把左轮右轮的值作为参数传进来,>0就是前进,<0就是后退

这个motor_pwm_set函数才是我们后面真正想要使用到的函数

cpp 复制代码
void motor_pwm_set(int16_t motor1, int16_t motor2)
{
    if(motor1 > 0)
    {
        motor_left_forward();
        pwm_left_motor_set(myabs(motor1));
    }
    else
    {
        motor_left_backward();
        pwm_left_motor_set(myabs(motor1));
    }
    
    if(motor2 > 0)
    {
        motor_right_forward();
        pwm_right_motor_set(myabs(motor2));
    }
    else
    {
        motor_right_backward();
        pwm_right_motor_set(myabs(motor2));
    }
}

其中,myabs是一个取绝对值函数

cpp 复制代码
int myabs(int a)
{
    int temp;
    
    if(a < 0)
        temp = -a;
    else 
        temp = a;
    
    return temp;
}

调试一下,main函数中

编码器测速模块👇

MPU6050测量小车姿态模块👇

相关推荐
零一iTEM4 小时前
MAX98357A_音频输出测试
单片机·嵌入式硬件·开源·音视频·硬件工程
逐步前行4 小时前
STM32_标准库结构
stm32·单片机·嵌入式硬件
Hello_Embed4 小时前
libmodbus STM32 主机实验(USB 串口版)
笔记·stm32·学习·嵌入式·freertos·modbus
不做无法实现的梦~5 小时前
PX4各个模块的作用(3)
linux·stm32·嵌入式硬件·机器人·自动驾驶
清风6666665 小时前
基于单片机的喷漆机器人自动控制系统
单片机·嵌入式硬件·机器人·毕业设计·课程设计·期末大作业
不能跑的代码不是好代码5 小时前
STM32独立看门狗(IWDG)知识点及标准库使用指南
stm32·嵌入式硬件
程序员良许5 小时前
嵌入式处理器架构
后端·单片机·嵌入式
来自晴朗的明天5 小时前
15、隔离 DC-DC 电源电路(18S12 模块)
单片机·嵌入式硬件·硬件工程
我送炭你添花6 小时前
电子世界的奇妙冒险:从一个电阻开始(系列目录)
人工智能·单片机·嵌入式硬件·fpga开发
VekiSon6 小时前
Linux内核驱动——设备树原理与应用
linux·c语言·arm开发·嵌入式硬件