f103c8t6 hal库 PWM L298N
时间: 2025-06-08 13:23:47 浏览: 12
### STM32 F103C8T6 使用 HAL 庢 实现 PWM 控制 L298N 电机驱动
#### 配置流程概述
为了实现 STM32F103C8T6 单片机通过 HAL 库控制 L298N 电机驱动模块,需完成硬件连接、软件配置以及代码编写三个主要部分。以下是详细的说明:
---
#### 硬件连接
L298N 是一种双 H 桥电机驱动芯片,能够驱动两个直流电机或者一个步进电机。其典型接法如下:
- **IN1 和 IN2**:分别连接到 STM32 的 GPIO 引脚,用于控制方向。
- **ENA**:连接到 TIMx_CHy(定时器通道),用于生成 PWM 波形来调节电机转速。
- **Vcc 和 GND**:分别为电源正负极输入端子。
- **Out1/Out2 或 Out3/Out4**:连接至电机两端。
注意,在实际应用中如果使用外部电池供电,则需要断开 STM32 开发板上的 5V 输出跳线帽[^5]。
---
#### 软件环境搭建
利用 STM32CubeMX 工具可以快速初始化项目结构并生成基础框架文件。具体操作步骤包括但不限于以下几个方面:
##### RCC (Reset and Clock Control)
设置系统时钟源为主晶振(MSI/HSE),并通过 PLL 提升频率以满足高性能需求[^3]。
##### SYS (System Configuration)
启用 USART 外设以便后续调试过程中可以通过串口打印日志信息;同时开启中断功能方便实时响应事件触发[^4]。
##### GPIO 初始化
定义哪些引脚作为输出模式用来传递逻辑高低电平信号给 L298N 输入端(INX);另外还要指定某个特定的TIM外设有多少路PWM输出,并关联相应的GPIO管脚[^2].
---
#### 主要代码片段
以下展示了一个简单的例子演示如何运用HAL库创建周期性的PWM波形从而调整马达的速度:
```c
// 定义全局变量存储当前设定的目标占空比百分比值
uint16_t duty_cycle_percent = 75;
void MX_TIM2_Init(void){
__HAL_RCC_TIM2_CLK_ENABLE(); // 启用定时器2时钟
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 83; // 设置预分频系数使得计数频率达到约1KHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 999; // 自动重装载寄存器加载数值决定脉宽最大长度(单位为毫秒级)
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if(HAL_TIM_PWM_Init(&htim2)!= HAL_OK ){
Error_Handler();
}
TIM_OC_InitTypeDef sConfigOC ;
sConfigOC.OCMode = TIM_OCMODE_PWM1 ;
sConfigOC.Pulse = ((duty_cycle_percent * htim2.Init.Period)/100);
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if(HAL_TIM_PWM_ConfigChannel (&htim2,&sConfigOC,TIM_CHANNEL_1 ) != HAL_OK ){
Error_Handler ();
}
}
/* 用户自定义函数 */
void adjust_motor_speed(uint16_t new_duty_cycle){
static uint16_t last_set_value=0;
if(new_duty_cycle!=last_set_value){
TIM_HandleTypeDef* tim_handler=(TIM_HandleTypeDef*)hTimHandlePtr;//假设已经赋好指针地址
uint32_t pulse_width=((new_duty_cycle*tim_handler->Init.Period)/100);
__HAL_TIM_SET_COMPARE(tim_handler, TIM_CHANNEL_1 ,pulse_width );
last_set_value=new_duty_cycle;
}
}
```
上述代码实现了基本的功能——即改变 `adjust_motor_speed` 函数参数即可动态修改正在运行中的PWM波形宽度进而影响最终输出功率大小^.
---
#### 注意事项
当设计涉及多个负载共享同一组电源轨时,请务必考虑总电流消耗是否会超出安全范围之外。此外,对于高速切换场景下的电磁干扰问题也应采取适当措施加以缓解比如加装滤波电路等.
---
阅读全文
相关推荐


















