STM32学习(7)PWM 输出实验

脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用
微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出!
1) 开启 TIM3 时钟以及复用功能时钟,配置 PB5 为复用输出。
要使用 TIM3,我们必须先开启 TIM3 的时钟,这点相信大家看了这么多代码,应该明白了。
这里我们还要配置 PB5 为复用输出,这是因为 TIM3_CH2 通道将重映射到 PB5 上,此时, PB5属于复用功能输出。 库函数使能 TIM3 时钟的方法是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器 3 时钟
这在前面一章已经提到过。 库函数设置 AFIO 时钟的方法是:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用时钟使能
这两行代码很容易组织,这里不做过多重复的讲解。 设置 PB5 为复用功能输出的方法在前面的几个实验都有类似的讲解,相信大家很明白,这里简单列出 GPIO 初始化的一行代码即可:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
2) 设置 TIM3_CH2 重映射到 PB5 上。
因为 TIM3_CH2 默认是接在 PA7 上的,所以我们需要设置 TIM3_REMAP 为部分重映射(通过 AFIO_MAPR 配置),让 TIM3_CH2 重映射到 PB5 上面。 在库函数函数里面设置重映射的函数是:
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
在前面 STM32 重映射章节 4.4.2 已经讲解过, STM32 重映射只能重映射到特定的端口。 第一个入口参数可以理解为设置重映射的类型,比如 TIM3 部分重映射入口参数为
GPIO_PartialRemap_TIM3,这点可以顾名思义了。 所以 TIM3 部分重映射的库函数实现方法是:GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
3) 初始化 TIM3,设置 TIM3 的 ARR 和 PSC。
在开启了 TIM3 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来控制输出 PWM 的
周期。当 PWM 周期太慢(低于 50Hz)的时候,我们就会明显感觉到闪烁了。因此, PWM 周
期在这里不宜设置的太小。 这在库函数是通过 TIM_TimeBaseInit 函数实现的,在上一节定时器
中断章节我们已经有讲解,这里就不详细讲解,调用的格式为:
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的
4) 设置 TIM3_CH2 的 PWM 模式,使能 TIM3 的 CH2 输出。
接下来,我们要设置 TIM3_CH2 为 PWM 模式(默认是冻结的),因为我们的 DS0 是低电
平亮,而我们希望当 CCR2 的值小的时候, DS0 就暗, CCR2 值大的时候, DS0 就亮,所以我
们要通过配置 TIM3_CCMR1 的相关位来控制 TIM3_CH2 的模式。 在库函数中, PWM 通道设
置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的, 不同的通道的设置函数不一样, 这里我
们使用的是通道 2,所以使用的函数是 TIM_OC2Init()。
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于使用STM32F4的PWM输出控制蜂鸣器的实验。以下是步骤: 1. 首先,在STM32F4上启用PWM输出功能。可以使用CubeMX(STM32CubeMX软件)配置PWM输出。在Pinout和配置选项卡中选择TIMx(其中x是您要使用的定时器编号)并启用PWM输出。选择PWM输出通道并设置频率和占空比。 2. 连接蜂鸣器。将蜂鸣器连接到STM32F4的PWM输出引脚和接地引脚。 3. 在代码中初始化PWM输出。使用HAL库函数初始化TIMx定时器和PWM输出通道。设置PWM输出频率和占空比。 4. 在代码中控制PWM输出以控制蜂鸣器。使用HAL库函数设置PWM输出占空比来控制蜂鸣器的音调和持续时间。 下面是一个简单的示例代码,可以用作参考: ```c #include "stm32f4xx.h" #include "stm32f4xx_hal.h" #define TIMx TIM2 #define TIMx_CLK_ENABLE __HAL_RCC_TIM2_CLK_ENABLE #define TIMx_CHANNEL TIM_CHANNEL_1 #define TIMx_GPIO_PORT GPIOA #define TIMx_GPIO_PIN GPIO_PIN_0 #define GPIO_AF_TIMx GPIO_AF1_TIM2 TIM_HandleTypeDef htim; GPIO_InitTypeDef GPIO_InitStruct; void TIM_Config(void); void GPIO_Config(void); int main(void) { HAL_Init(); TIM_Config(); GPIO_Config(); while (1) { //控制PWM输出占空比以控制蜂鸣器 for (int i = 0; i < 100; i++) { __HAL_TIM_SET_COMPARE(&htim, TIMx_CHANNEL, i); HAL_Delay(10); } for (int i = 100; i > 0; i--) { __HAL_TIM_SET_COMPARE(&htim, TIMx_CHANNEL, i); HAL_Delay(10); } } } void TIM_Config(void) { TIMx_CLK_ENABLE(); htim.Instance = TIMx; htim.Init.Prescaler = 0; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 100; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim); TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIMx_CHANNEL); HAL_TIM_PWM_Start(&htim, TIMx_CHANNEL); } void GPIO_Config(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = TIMx_GPIO_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF_TIMx; HAL_GPIO_Init(TIMx_GPIO_PORT, &GPIO_InitStruct); } ``` 在这个例子中,我们使用TIM2定时器和PA0引脚作为PWM输出通道。我们在main函数中使用for循环来控制PWM输出占空比以控制蜂鸣器。 希望这个例子可以帮助你完成PWM输出控制蜂鸣器的实验

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值