先开个头,让小车动起来,明天将进行
串口控制小车、蓝牙控制小车、点动控制小车、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------让小车动起来