stm32设置占空比
时间: 2024-12-27 09:22:05 浏览: 32
### STM32 设置 PWM 占空比
为了在 STM32 上设置 PWM 的占空比,可以使用如下方法:
定义头文件 `PWM.h` 中的相关宏用于指定使用的引脚、端口以及定时器等资源[^1]。
```c
#ifndef _PWM_H_
#define _PWM_H_
// 定义引脚和定时器
#define PWM_PIN GPIO_Pin_1
#define PWM_PORT GPIOB
#define PWM_TIMER TIM3
#define PWM_CHANNEL TIM_Channel_4
// 定义初始化函数及相关操作函数声明
void Pwm_Init(void);
void Pwm_SetFrequency(uint32_t frequency);
void Pwm_SetDutyCycle(uint8_t duty_cycle);
#endif /* _PWM_H_ */
```
实现部分则可以在对应的 `.c` 文件中完成。下面是一个简单的例子来展示如何通过改变比较寄存器 (Capture/Compare Register, CCR) 来调整 PWM 波形的占空比。
```c
#include "PWM.h"
#include "stm32f1xx_hal.h"
TIM_HandleTypeDef htim3;
void Pwm_Init(void){
__HAL_RCC_TIM3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = PWM_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(PWM_PORT, &GPIO_InitStruct);
// 初始化定时器
htim3.Instance = PWM_TIMER;
htim3.Init.Prescaler = 79; // 假设系统时钟为80MHz,则预分频系数=80-1得到1us计数间隔
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999; // 自动重装载值ARR设定周期为1ms(即频率为1kHz)
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if(HAL_TIM_PWM_Init(&htim3)!= HAL_OK){
Error_Handler();
}
// 配置通道4作为PWM输出模式1
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; // 初始脉冲宽度为零
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if(HAL_TIM_PWM_ConfigChannel(&htim3,&sConfigOC,PWM_CHANNEL) != HAL_OK){
Error_Handler();
}
}
void Pwm_SetDutyCycle(uint8_t duty_cycle){
uint32_t pulse_width = (__HAL_TIM_GET_AUTORELOAD(&htim3)+1)*duty_cycle/100;
__HAL_TIM_SET_COMPARE(&htim3, PWM_CHANNEL, pulse_width);
}
```
上述代码展示了如何利用 HAL 库中的 API 函数来进行 PWM 输出配置,并提供了一个接口用来动态更改占空比。当调用 `Pwm_SetDutyCycle()` 函数并传入期望的百分比数值时,将会更新相应的捕获/比较寄存器从而达到调节占空比的效果。
阅读全文
相关推荐
















