当前位置: 首页 > news >正文

PWM控制实现呼吸灯

一.呼吸灯原理

    呼吸灯指灯光的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减,很有节奏感地一起一伏,就像是在呼吸一样,被广泛应用于手机、电脑、电视等电子设备的指示灯中。
    通过调节PWM占空比实现呼吸灯效果。通过调节定时器的比较寄存器的值,来调节PWM占空比。PWM占空比 = CCR/(ARR+1);ARR:自动装载寄存器的值 ;CCR: 比较寄存器。

二.实验过程

在这里插入图片描述
    上图是 RGB 彩灯,里面由红蓝绿三个小灯构成,通过调节PB0引脚PWM占空比实现绿灯的呼吸灯效果。

三.源代码

1.bsp_generalpwm.c

#include "bsp_generalpwm.h"
//使用TIM3的 输出比较通道3 对应的GPIO-PB0初始化
void INIT_GENERAL_GPIO_CONFIG()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PB0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推免输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}/* ----------------   PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)
void INIT_GENERAL_PWM_CONFIG()
{//初始化 TIM_TimeBaseInitTypeDef//开启定时器时钟,即内部时钟CK_INT=72MRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1;//分频因子TIM_TimeBaseInitStructure.TIM_Period = 100-1;//重载寄存器的值TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化 TIM_OCInitTypeDefTIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//使用PWM1模式TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//输出通道电平极性 低电平有效 (即CNT<CCR(比较寄存器)输出电平)TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能TIM_OCInitStructure.TIM_Pulse = 0;//占空比:TIM_Pulse/(Period +1)TIM_OC3Init(TIM3,&TIM_OCInitStructure);//使能计数器TIM_Cmd(TIM3,ENABLE);
}void DELAY_MS(uint32_t value)
{uint32_t i;for(i=value;i>0;i--){}
}

2.main.c

#include "bsp_generalpwm.h"
int main(void)
{	uint8_t i = 0;INIT_GENERAL_GPIO_CONFIG();INIT_GENERAL_PWM_CONFIG();while(1){for(i=0;i<100;i++){TIM_SetCompare3(TIM3,i);//设置输出比较寄存器(CCR)的值DELAY_MS(0x5FFFF);}for(i=100;i>0;i--){TIM_SetCompare3(TIM3,i);DELAY_MS(0x5FFFF);}}
}

四.实现效果

呼吸灯效果演示

stm32呼吸灯

http://www.dtcms.com/a/352626.html

相关文章:

  • 基于CentOS7:Linux服务器的初始化流程
  • 基于51单片机的指纹红外密码电子锁
  • 【Elasticsearch】k-NN 搜索深度解析:参数优化与分数过滤实践
  • Pascal使用TMediaPlayer播放MIDI文件时的错误
  • 红外遥控模块
  • 逻辑流图、作业图、执行图、物理图
  • 嵌入式软件移植
  • 【制作100个Unity游戏】从零开始构建类《月圆之夜》《杀戮尖塔》的卡牌游戏(附带项目源码)
  • Windows远程协助安全配置与使用限制
  • STM32G4 SVPWM VF开环强拖电机
  • 2026 届最新大数据专业毕设选题推荐,毕业设计题目汇总
  • 达索 Enovia 许可管理技术白皮书:机制解析与智能优化实践
  • 段式存储、页式存储、段页式存储:三种内存管理策略的演进与权衡
  • PyTorch生成式人工智能——PatchGAN详解与实现
  • Docker实战系列:使用Docker部署YouTrack项目管理系统
  • Linux修改bootflag(启动标签)到指定分区
  • RedHat 5.7升级为PAE内核,并更新yum源
  • 软件产品线过程模型全景解析:双生命周期、SEI 与三生命周期
  • 《数据之心》——鱼小妖全传
  • 数据结构07(Java)-- (堆,大根堆,堆排序)
  • JHipster 一个基于 Yeoman 的全栈应用生成器
  • 常见软件优化功能项
  • More Effective C++ 条款09:使用析构函数防止资源泄漏
  • 用友NCC 如何通过OpenApi 上传附件
  • 【计组】总线与IO
  • 【C++】智能指针底层原理:引用计数与资源管理机制
  • 菜鸡还没有找到工作(DAY41)
  • 永磁同步电机无速度算法--高频脉振正弦波注入到两相静止坐标系
  • 全新机器人遥操作触觉感知解决方案
  • postman使用教程