stm32利用PWN实现呼吸灯的亮度变化函数部分
时间: 2023-05-30 17:07:33 浏览: 290
Stm32_PWM控制LED由暗变亮(占空比可调)
5星 · 资源好评率100%
以下是一个基于STM32的PWM实现呼吸灯的亮度变化函数部分的示例代码:
```c
#include "stm32f10x.h"
// 定义PWM输出引脚
#define LED_PIN GPIO_Pin_13
#define LED_GPIO GPIOC
// 定义PWM通道
#define PWM_CHANNEL TIM_OCMode_PWM1
// 定义呼吸灯周期
#define BREATHE_PERIOD 1000
// 定义计数器初始值
#define COUNTER_INIT 0
// 定义计数器最大值
#define COUNTER_MAX 1000
// 初始化PWM
void PWM_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO, &GPIO_InitStructure);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = BREATHE_PERIOD - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = PWM_CHANNEL;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = COUNTER_INIT;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
}
// 呼吸灯亮度变化函数
void Breathe_LED(void)
{
static uint16_t counter = COUNTER_INIT;
static uint8_t direction = 0;
if (counter >= COUNTER_MAX) {
direction = 1;
} else if (counter <= COUNTER_INIT) {
direction = 0;
}
if (direction == 0) {
counter++;
} else {
counter--;
}
TIM_SetCompare1(TIM3, counter);
}
int main(void)
{
PWM_Init();
while (1) {
Breathe_LED();
}
}
```
该函数使用了STM32的定时器和PWM输出来实现呼吸灯的亮度变化。在初始化函数中,我们使用了TIM3定时器和GPIOC的13号引脚作为PWM输出引脚。定时器的时钟频率为72MHz,预分频器为71,计数器最大值为999,因此定时器的周期为1ms,也就是呼吸灯的周期为1s。
在呼吸灯亮度变化函数中,我们使用了一个静态变量`counter`来记录当前PWM的占空比。`direction`变量用于记录占空比的变化方向,0表示占空比增加,1表示占空比减小。当占空比达到最大值或最小值时,我们需要改变占空比的变化方向。
最后,我们使用`TIM_SetCompare1()`函数来设置PWM的占空比,从而实现呼吸灯的亮度变化。函数中的`TIM3`和`TIM_OC1`分别表示使用的定时器和PWM通道。`counter`变量的值将被设置为PWM的占空比。
阅读全文