stm32f103ze小车控速代码l298
时间: 2025-06-30 15:09:53 浏览: 14
### 电机控制与 PWM 设置
在 STM32F103ZE 微控制器中,通过 L298N 模块驱动直流电机时,通常使用定时器的 PWM 输出功能来调节电机速度。L298N 的 ENA 和 ENB 引脚分别用于控制左右两个电机的速度,而 IN1、IN2、IN3、IN4 则用于设置电机的转动方向。
STM32F103ZE 提供多个通用和高级定时器,适合用于多路 PWM 输出。例如,TIM3 可以配置为生成一路或两路 PWM 信号,结合 GPIO 控制方向引脚即可实现对单个电机的正反转和调速控制 [^1]。
以下是一个基于 HAL 库的初始化代码示例:
```c
#include "main.h"
TIM_HandleTypeDef htim3;
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3;
htim3.Init.Prescaler = 71; // 假设系统时钟为 72MHz,则此处为 72MHz / (Prescaler+1) = 1MHz
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999; // 自动重载寄存器值,决定 PWM 周期(1ms)
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}
```
#### 占空比设置函数
通过修改比较寄存器的值,可以调整 PWM 波形的占空比,从而控制电机转速:
```c
// 设置 PWM 占空比(0~100%)
void set_pwm_duty_cycle(uint8_t duty)
{
uint32_t pulse = (htim3.Instance->ARR * duty) / 100;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pulse);
}
```
### 方向控制逻辑
为了控制电机的正反转,需要将方向控制引脚连接至 STM32 的 GPIO 端口,并根据需求设置其高低电平状态。例如:
```c
#define DIR_PIN_1 GPIO_PIN_0
#define DIR_PORT_1 GPIOA
#define DIR_PIN_2 GPIO_PIN_1
#define DIR_PORT_2 GPIOA
void motor_forward()
{
HAL_GPIO_WritePin(DIR_PORT_1, DIR_PIN_1, GPIO_PIN_SET); // 正向
HAL_GPIO_WritePin(DIR_PORT_2, DIR_PIN_2, GPIO_PIN_RESET);
}
void motor_backward()
{
HAL_GPIO_WritePin(DIR_PORT_1, DIR_PIN_1, GPIO_PIN_RESET); // 反向
HAL_GPIO_WritePin(DIR_PORT_2, DIR_PIN_2, GPIO_PIN_SET);
}
void motor_stop()
{
HAL_GPIO_WritePin(DIR_PORT_1, DIR_PIN_1, GPIO_PIN_RESET); // 停止
HAL_GPIO_WritePin(DIR_PORT_2, DIR_PIN_2, GPIO_PIN_RESET);
}
```
### 主程序逻辑
主函数中可设定初始方向并启动 PWM 信号输出,随后根据外部输入或其他条件动态调整占空比:
```c
int main(void)
{
HAL_Init();
SystemClock_Config(); // 系统时钟配置
MX_GPIO_Init(); // GPIO 初始化
MX_TIM3_Init(); // 定时器初始化
motor_forward(); // 设定前进方向
set_pwm_duty_cycle(50); // 设置 50% 占空比,即中等速度
while (1)
{
// 在这里可以添加传感器反馈逻辑或远程控制指令处理
}
}
```
### 多电机控制扩展
若需同时控制多个电机,可以通过配置其他定时器通道来实现。例如,使用 TIM3 的 CH1 和 CH2 分别控制两个电机的 PWM 信号,同时使用不同的 GPIO 引脚组合控制每个电机的方向 [^1]。
---
阅读全文
相关推荐

















