- 硬件准备 在开始之前,我们需要准备以下硬件:
- STM32开发板(例如STM32F411RCT6)
- 电机(直流电机或步进电机)
- 驱动电路(例如L298N)
- 电源(5V或12V)
-
硬件连接 将电机连接到驱动电路上,并将驱动电路连接到STM32开发板上。根据电机类型的不同,连接方式也会有所不同。必须要确保外接电源给驱动电路板供5-12V电,12V最佳,可以从L298N的5V接口引出一条线接到开发板5V接口,以供给开发板供电。
STM32开发环境设置 使用适当的IDE(集成开发环境)设置STM32开发环境。我们推荐使用STM32CubeIDE,它是STMicroelectronics官方提供的IDE。
创建新项目 在STM32CubeIDE中,创建一个新的STM32项目。选择适当的MCU系列和型号,并配置项目设置。
接下来我将开始演示cubmx配置:
-
首先开始生成一个新的cubmx,点击画圈区域。
-
第二步,我们需要选择自己开发板类型
-
-
第三步,对rcc和sys进行配置,如图所示,几乎所有项目rcc和sys都是这样配置
-
第四步开启tim通道,选择pwm输出,几个电机选几个通道,可以选在一个tim,也可以分开选择
-
第五步,对其进行设置,驱动电机速度是调节其占空比,至于原理可以看看其他人的,每一种型号不同,这里以我使用的为例。
-
第六步,选择四个引脚用GPIO_OUTPUT,分别命名AIN1,AIN2,BIN1,BIN2,通过控制这四个引脚高低电平控制电机正反转,其中AIN1,AIN2是调节左侧电机的,BIN1,BIN2是调节右侧电机的。
-
第七步,配置时钟,HCLK更具芯片输入最大值,我这里是100MHZ,之后按回车,其他地方会自动配置好
-
第八步,设置项目名称和路径
-
第十步,生成文件
-
在生成的keil5中点进main.c文件中,里面是cubmx封装好的代码,往下滚动滑轮,找到
所在位置添加两行代码,用以开启htim2的一通道和四通道
-
/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); /* USER CODE END 2 */
接下来在while循环中添加代码
-
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,500); HAL_Delay(2000); __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,0); HAL_Delay(1000); __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,500); HAL_Delay(2000); __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,0); HAL_Delay(1000); } /* USER CODE END 3 */
在此段代码中开启htim2一通道,改变500和0数字可以调节电机速度,HAL_Delay是延时2s。
-
在之后调节电机方向和速度(将前面代码删除,在指定位置输入这段代码),创建一个对左右电机控制的函数,其中AIN1/BIN1高电平正转,AIN2/BIN2高电平反转,但是由于要安装在小车上,所以对方向值设置引脚高低电平值相反。
-
/* USER CODE BEGIN 0 */ // 电机右控制函数 void motorControlR(uint8_t direction, uint16_t speed) { // 启动 htim2 的 TIM_CHANNEL_2 通道的 PWM 输出 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); /* 根据方向值设置 IN1 和 IN2 引脚的电平状态 */ HAL_GPIO_WritePin(GPIOC, BIN1_Pin, (direction & 0x01)); HAL_GPIO_WritePin(GPIOC, BIN2_Pin, ((direction & 0x01) ^ 0x01)); /* 设置 TIM_CHANNEL_2 通道的比较值,从而控制 PWM 占空比,实现速度控制 */ __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, speed); } // 电机左控制函数 void motorControlL(uint8_t direction, uint16_t speed) { // 启动 htim2 的 TIM_CHANNEL_1 通道的 PWM 输出 HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); /* 根据方向值设置 AIN1 和 AIN2 引脚的电平状态 */ HAL_GPIO_WritePin(GPIOA, AIN2_Pin, (direction & 0x01)); HAL_GPIO_WritePin(GPIOA, AIN1_Pin, ((direction & 0x01) ^ 0x01)); /* 设置 TIM_CHANNEL_1 通道的比较值,从而控制 PWM 占空比,实现速度控制 */ __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, speed); } /* USER CODE END 0 */
之后在while循环中输入如下代码
-
/* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ // 控制电机左转动 motorControlL(AIN2_Pin, 100); // 调用电机左控制函数,设置方向为 AIN2_Pin,速度为 100 // 控制电机右转动 motorControlR(BIN2_Pin, 100); // 调用电机右控制函数,设置方向为 BIN2_Pin,速度为 100 /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
将AIN1_Pin改成AIN2_Pin,可以改变电机旋转方向,改变数值可以改变速度,同理,另一侧电机也是如此。