【STM32--智能小车】1. 让小车动起来

先开个头,让小车动起来,明天将进行

串口控制小车、蓝牙控制小车、点动控制小车、PWM调速小车

欢迎一起学习交流!

1. 组装

2. 电机驱动模块------L9110S

平衡小车项目中也用到电机驱动模块,不过和这个不一样,可以看看哟

平衡小车TB6612FNG电机驱动模块https://blog.csdn.net/2301_76153977/article/details/155577282?spm=1011.2415.3001.5331
L9110S 有二路和四路两种,二路可以驱动 2 个直流电机,或者 1 个 4 线 2 相式步进电机;四路可以驱动 4个直流电机,或者 2 个 4 线 2 相式步进电机。
此项目我们使用的是二路的。

L9110S STM32 备注
B-1A GPIO 控制电机
B-1B GPIO 控制电机
VCC 外接电源正极
GND 外接电源负极
A-1A GPIO 控制电机
A-1B GPIO 控制电机

用杜邦线可以直接插进模块绿色的接口,其他的线用螺丝刀调整接口大小即可接入。
接通 VCC 、 GND ,模块电源指示(红)灯亮。
以驱动 2 个直流电机为例:
A-1A 输入高电平,A-1B 输入低电平,MotorA 电机正转;
A-1B 输入低电平,A-1A 输入高电平,MotorA 电机反转;
B-1A 输入高电平,B-1B 输入低电平,MotorB 电机正转;
B-1B 输入低电平,B-1A 输入高电平,MotorB 电机反转。

3. "让小车动起来"功能实现

3.1 初始化

cpp 复制代码
void motor_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_10;          // 两个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);
    
    motor_stop();

}

3.2 前进后退

PB0、PB1控制左轮,PB2、PB10控制右轮

cpp 复制代码
void motor_go_forward(void)
{
    //左轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    
    //右轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}

void motor_go_backward(void)
{
    //左轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
    
    //右轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET);
}

3.3 左转右转

cpp 复制代码
void motor_go_left(void)
{
    //左轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    
    //右轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}

void motor_go_right(void)
{
    //左轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    
    //右轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}

3.4 停止

cpp 复制代码
void motor_stop(void)
{
    //左轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
    
    //右轮
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET);
}

3.5 验证

main函数中:

cpp 复制代码
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "motor.h"

int main(void)
{
    HAL_Init();                         /* 初始化HAL库 */
    stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */
    led_init();                         /* 初始化LED灯 */
    uart1_init(115200);
    motor_init();
    printf("hello world!\r\n");

    while(1)
    {  
        motor_go_forward();
        delay_ms(1000);
        motor_go_backward();
        delay_ms(1000);
        motor_go_left();
        delay_ms(1000);
        motor_go_right();
        delay_ms(1000);
        motor_stop();
        delay_ms(1000);
    }
}

烧录后效果:

智能小车1------让小车动起来

相关推荐
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11014 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元4 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133974 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315204 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书5 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang5 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟5 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126915 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315205 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机