STM32F103C8T6+HAL库驱动L298N控制直流有刷电机

        记录一下学习过程,L298N相关资料请看其他博主,这里直接照着我的做也能成功。

网上找的 L298N引脚图,要和stm32共地,统一参考电压

电机用的这款

        需要注意的是,我使用的外部供电是12v不需要拔掉板载5v使能的插线帽,不过要驱动电机就要用PWM,也就是本文使用的通道使能B(把插线帽拔掉),IN3和IN4都对应B通道,最初都给低电平,处于等待中。

以下是cubemx的配置图

1、使用外部时钟晶振

2、开启Serial Wire

3、启动B通道,这里使用TIM2内部时钟通道1

4、设置GPIO,IN3和IN4,OutPut模式,这里设置的PB4和PB5,顺便给它们改个名字

5、保存生成

 

        最后来看一下代码和连接图,代码非常简单,只需要先开启PWM通道,再给定GPIO的高低电平,设置正反转,以及占空比,就可以启动电机了,这里只给启动,有需要可以再新建一个.c文件封装几个函数,就可以调用实现正反转及停止,多用几个就可以驱动小车啦!

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */

  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	HAL_GPIO_WritePin(PB4_GPIO_Port,PB4_Pin,GPIO_PIN_SET);
	HAL_GPIO_WritePin(PB5_GPIO_Port,PB5_Pin,GPIO_PIN_RESET);
	__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,100);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

        注意下载完程序后,再接入12v外接电源,如图所示(接地要引出两根线噢

### 使用 STM32 HAL 控制 L298N 驱动模块 #### 初始化设置 为了使用 STM32HAL 控制 L298N 驱动模块,首先需要完成基本的初始化工作。这包括启动 HAL 并配置必要的 GPIO 引脚。 ```c #include "stm32f1xx_hal.h" // 定义用于控制电机方向和使能信号的引脚 #define MOTOR_IN1_PIN GPIO_PIN_0 #define MOTOR_IN2_PIN GPIO_PIN_1 #define MOTOR_ENA_PIN GPIO_PIN_2 #define MOTOR_PORT GPIOA void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { // HAL初始化 HAL_Init(); // 系统时钟配置 SystemClock_Config(); // GPIO初始化 MX_GPIO_Init(); while (1) { // 主循环逻辑可以在这里编写 } } ``` #### GPIO 配置 接下来定义具体的 GPIO 初始化函数 `MX_GPIO_Init()` 来设定哪些引脚作为输出端口用来发送指令给 L298N 模块: ```c static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 // 设置IN1, IN2 和 ENA为推挽输出模式 GPIO_InitStruct.Pin = MOTOR_IN1_PIN | MOTOR_IN2_PIN | MOTOR_ENA_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(MOTOR_PORT, &GPIO_InitStruct); } ``` #### 控制电机转动 通过改变输入到 L298N 的高低电平组合,就可以实现对直流电机正转、反转以及停止的操作。下面是一个简单的例子展示如何让电机顺时针旋转一段时间后再逆时针旋转: ```c while(1){ // 让电机顺时针运转(假设IN1=HIGH && IN2=LOW) HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN1_PIN,GPIO_PIN_SET); HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN2_PIN,GPIO_PIN_RESET); HAL_Delay(5000); // 延迟5秒 // 刹车/停止状态(IN1=LOW && IN2=LOW) HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN1_PIN,GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN2_PIN,GPIO_PIN_RESET); HAL_Delay(2000); // 反向运行(IN1=LOW && IN2=HIGH) HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN1_PIN,GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN2_PIN,GPIO_PIN_SET); HAL_Delay(5000); // 再次刹车/停止 HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN1_PIN,GPIO_PIN_RESET); HAL_GPIO_WritePin(MOTOR_PORT,MOTOR_IN2_PIN,GPIO_PIN_RESET); HAL_Delay(2000); } ``` 上述代码展示了利用 STM32 HAL 配合 L298N 实现简单电机控制的方法[^1]。需要注意的是,在实际应用中还需要考虑 PWM 波形生成等功能以调节电机速度,并且要确保硬件连接正确无误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值