基于STM32的PWM呼吸灯系统设计

发布者:温柔阳光最新更新时间:2021-11-02 来源: eefocus关键字:STM32  PWM 手机看文章 扫描二维码
随时随地手机看文章

一、简述


记--使用定时器4输出PWM来实现呼吸灯效果。


在人眼辨识能力范围内,调节LED亮的时间,达到LED灯的亮度不同。例:给低电平LED就亮,如果一个脉冲中全是低电平那么LED最亮,如果一个脉冲一半是高电平,一半是低电平,那么LED就显得有点暗,这样调整脉冲中的高低电平的比例就可以达到LED的亮度调节。

 

二、效果

LED1逐渐由暗变亮,接着由亮变暗。

 

三、工程结构

四、源文件

#include "stm32f4xx.h"

#include "led.h"

#include "pwm.h"

 

//粗延时

void delay_ms(int ms)

{

int i,j;

for(i=0; i for(j=0; j<10000;j++);

}

 

 

//主函数

int main(void)

{

int i;

//中断优先级分组

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

LED_Init();//初始化LED

Pwm_Init();//设置定时器4输出PWM

while(1)//呼吸灯

{

//从暗到亮

for(i=1; i<499; i++)//定时器4重装载值为499

{

TIM_SetCompare1(TIM14,i);//根据i的值设置比较值,调整占空比

delay_ms(20);//根据实际情况进行调整,方便观察效果

}

//从亮到暗

for(i=499; i>0; i--)

{

TIM_SetCompare1(TIM14,i);

delay_ms(20);

}

}

return 0;

}


#ifndef __PWM_H_

#define __PWM_H_

#include "stm32f4xx.h"

 

void Pwm_Init(void);

 

#endif

#include "pwm.h"

 

void Pwm_Init(void)

{

GPIO_InitTypeDef  GPIO_InitStruct;

TIM_OCInitTypeDef TIM_OCInitStruct;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;

//1、使能定时器14时钟:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);

//初始化GPIOF组时钟

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

//2、初始化PF10引脚

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;  //引脚10 LED1

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; //复用

GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //速度

GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽

GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;  //上拉

GPIO_Init(GPIOF,&GPIO_InitStruct);

//3、引脚功能映射

GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); 

//4、初始化定时器,配置ARR,PSC。

TIM_TimeBaseInitStruct.TIM_Prescaler = 84-1; //分频系统  84MHZ/84 = 1MHZ  每秒数1000 000数 1us数一个数 

TIM_TimeBaseInitStruct.TIM_Period = 500-1; //重装值 500数,用时500us

TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数

TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子

TIM_TimeBaseInit(TIM14,&TIM_TimeBaseInitStruct);

 

TIM_OCInitStruct.TIM_OCMode =  TIM_OCMode_PWM1;   //PWM1模式

TIM_OCInitStruct.TIM_OutputState=  TIM_OutputState_Enable;//输出使能

TIM_OCInitStruct.TIM_OCPolarity =  TIM_OCPolarity_Low;   //极性低

TIM_OC1Init(TIM14,&TIM_OCInitStruct);

//5、使能预装载寄存器: 

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); 

//6、使能自动重装载的预装载寄存器允许位

TIM_ARRPreloadConfig(TIM14,ENABLE);

//7、使能定时器。

TIM_Cmd(TIM14,ENABLE);

}

五、总结

 

 5.1 LED亮度调节实现

 

             

 

5.2 相关概念

 

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
频率  :时钟速度   1GHZ = 1000MHZ = 1000 000 KHZ =1 000 000 000 HZ    (如12MHz:1秒12 000 000个脉冲)
占空比:占空比是指在一个脉冲循环内,通电时间(有效电平)相对于一个脉冲总时间所占的比例。(可以简单理解为该高、低电平的占脉冲总时间的比例)
       

5.3 设置定时器4输出PWM
           

TIM_OCInitStruct.TIM_OCMode      =  TIM_OCMode_PWM1;       //PWM1模式
TIM_OCInitStruct.TIM_OutputState    =  TIM_OutputState_Enable;   //输出使能
TIM_OCInitStruct.TIM_OCPolarity     =  TIM_OCPolarity_Low;    //极性低,设置低电平为有效状态
 
TIM_TimeBaseInitStruct.TIM_Period  = 500-1;     //重装值 500,用时500us          
 
TIM_SetCompare1(TIM14,i);//根据i的值设置比较值,调整占空比


关键字:STM32  PWM 引用地址:基于STM32的PWM呼吸灯系统设计

上一篇:stm32f103呼吸灯(PWM脉冲宽度调制)
下一篇:STM32f103核心板点呼吸灯教程

推荐阅读最新更新时间:2024-11-17 09:18

STM32开漏,推挽的知识
有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别 有关推挽输出、开漏输出、复用开漏输出、复用推挽输出 以及上拉输入、下拉输入、浮空输入、模拟输入的区别 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO_M
[单片机]
基于PWM的限流保护电路的设计研究
1引言 过载保护的功能是指在负载过载情况下能有效保护DC-DC变换器不致由于过热而损坏,即主要是控制功率MOSFET管的过载电流(输入电流)。由于用电负载不同,对过载保护功能要求也不同。如卫星控制系统要求过载后DC-DC变换器不能断电,因此采取限流保护;有效载荷系统要求可以在过载后DC-DC变换器断电,因此采取截流保护。本文提出了一种基于PWM的限流保护电路的设计方法,以及设计验证。 2 电流环控制方式的过流保护 电流型控制是双环控制系统,由开关器件的峰值电流信号反馈的电流环(内环)和输出电压信号反馈的电压环(外环)构成。功率变换部分是由电流环控制的电流源,电压外环控制功率级的电流环。电流内环负责输出电感的动态变化,而电压外环只需
[电源管理]
基于<font color='red'>PWM</font>的限流保护电路的设计研究
stm32delay函数怎么写
STM32的延时函数可以使用SysTick定时器来实现。SysTick定时器是一个24位的计数器,它可以在每个时钟周期自动减少计数值,直到计数值为0时触发中断。我们可以利用SysTick定时器的特性来实现精确的延时函数。 以下是一个实现延时函数的示例代码: #include stm32xxxx.h void SysTick_Handler(void) { // 在这里可以写一些需要周期执行的操作,但是要尽量保持简洁 } void delay_us(uint32_t us) { uint32_t ticks = us * (SystemCoreClock / 1000000); // 将微秒转换为滴答数 Sys
[单片机]
一个关于STM32内部USART的波特率配置话题
某日,一工程师咨询在使用STM32F407 MCU开发产品时用到UART5和USART6做串行异步通信,将二者波特率配置为1200bps时,发现UART5正常,而USART6工作不正常。 咋听起来的确有点奇怪。怀疑其相关配置有问题,查看代码并无异常,而且当波特率调高时,二者都表现正常。这基本断定代码配置没有逻辑或流程上的错误。 结合技术手册来看,UART5与USART6的差别主要体现在挂在不同的外设总线上,UART5挂在APB1上,USART6挂在APB2总线上。对于32f407而言,APB1最高时钟42M, APB2最高时钟可达84M。 经进一步了解,客户系统的APB1总线时钟工作在42M
[单片机]
一个关于<font color='red'>STM32</font>内部USART的波特率配置话题
使用keil调试stm32时不能run
在使用keil时其断点不能超过5个,如果超过5个断点将不能进入调试界面 调试过程中打超过5个断点后,会出现报警信息或错误提示 修正: 之前根据经验说断点不能超过5个,现在修正一下;对于每个处理器不一样,在Cotex-M3 user Guide里有这么一句话 也就是说Cotex-M3内核处理器最大同时支持8个硬件断点。 对于Cotex-M0+ 内核有这么一句话 这句话没有指出支持多少硬件断点,但是从stm32l01x参考手册里 这里面说提供四个断点寄存器,是不是说最多支持四个断点呢?我们验证一下: 这是打五个断点的时候 在输出框找到 也就是最多支持4个断点!
[单片机]
使用keil调试<font color='red'>stm32</font>时不能run
STM32开发笔记1: STM32F407时钟配置
单片机型号:STM32F407 本文讲解STMF407时钟的使用及其配置方法。 1、STM32F407的分类 a、LSI是低速内部时钟,RC震荡器,频率为32KHz左右。供独立看门狗和自动唤醒单元使用。 b、LSE是低速外部时钟,接频率为32.768KHz的石英晶体。这个主要是RTC的时钟源。 c、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz-26MHz。 d、HSI是高速内部时钟,RC振荡器,频率为16MHz。可以直接作为系统时钟或者用作PLL输入。 e、PLL为锁相环倍频输出,STM32F4有两个PLL: 主P
[单片机]
<font color='red'>STM32</font>开发笔记1: STM32F407时钟配置
STM32串口通信--数据打包发送
串口及其中断初始化 void USART1Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
[单片机]
基于ARM的电脑鼠控制系统研究
1 电脑鼠工作原理 电脑鼠周围安装六组红外传感器,分别感知左方、左前方、前方、右前方、右方,发射端发射一定频率的红外线,接收端通过六个方向的反射波来判断是否有障碍物,实时地储存单元格的资料,通过六组红外传感器反馈的迷宫信息,控制电脑鼠完成避障、转弯、加速等动作,运用智能算法对迷宫的部分单元格或全部单元格进行遍历,并将迷宫的信息以有效的数据结构存储,微控制器根据这些记录信息运用迷宫高效算法找到一条最优化路径,从而实现从起点到终点的最大化冲刺。 2 硬件电路设计 为完成迷宫探测和冲刺任务,电脑鼠需具备以下各功能模块:ARM微处理器作为控制核心协调各功能模块正常工作;电机及驱动模块实时控制电机启动、制动;红外检测模块负责红外线探测
[单片机]
基于ARM的电脑鼠控制<font color='red'>系统</font>研究

推荐帖子

画板子搞设计要懂规格书里的三视图
在学校学习的时候,三视图一般都会多少学过,可能结构设计学的多,电子专业的学的少一些,但三视图的几个图相信大家还是知道一些的。三视图就是主视图、俯视图、左视图的总称。pcblayout培训在元器件规格书里面,大多数情况是很规范的三视图,当然有些简单是有两个图,因为这两个图已经可以表达所有的尺寸关系了。有些时候,还附带有立体图,那这样就更好理解。我们要习惯看没有立体图的较抽象的尺寸图,在很多时候,我们是先做好板,再看到实物的。一个物体有六个视图:从物体的前面向后面投射所得
qwqwqw2088 PCB设计
菜鸟请教D12驱动应用程序问题
菜鸟请教D12驱动应用程序问题小弟使用D12和51做一个大量数据传输的东西。固件使用ZLG的,驱动是用DriverStudio3.1直接生成的。使用DS里面的函数OpenByInterf()打开USB设备,用ReadFile()阻塞模式来读取USB数据因为在51那里是连续发的,所以我的应用程序也是循环读取,但老是读不到数据如果只是读一次(ReadFile())的话,就可以读到数据但我使用循环读的时候,在读完一帧数据的时候(端点2,64Byte),再Sleep几十微秒,也可以正确的读
lmx5078 嵌入式系统
NJR_Wearable_Shanghai_201608
NJR_Wearable_Shanghai_201608
lemonade815 汽车电子
【MSP430 编译器使用经验】+Energia初探
Energia是一种挺有意思的工具,界面简单,功能清晰。如果用习惯了CCS,KEIL,就会觉得有些简陋。不过用一段时间后,才发现,用在MSP430上,正好。CCS是集成的开发工具,包括了全部的TI产品,以及丰富的文档。但是MSP430系列本身就具有低功耗,精简系统和集成的特点,其实有限的硬件资源上实现功能,代码开发是非常精简的。为了帮助开发,TI有GRACE,非常简单易用,不过多少牺牲了灵活性。但是用ENERGIA,即能集成了MSP430的全部开发流程。而且文档也很丰富,访问http://e
fyaocn 微控制器 MCU
16-TCP 协议(同时关闭)
有同学会问,为什么不写同时打开?(同时打开指的是两端都是服务器,两端同时向对方建立连接请求)。一方面,在我们实际生活中几乎遇不到;另一方面,很多操作系统实际都不能正确的支持同时打开,所以,这里就不写了,如果你对这个很感兴趣,请参考《TCP/IP详解卷1:协议》的18.8小节。1.同时关闭同时关闭,指的是已建立连接的两端同时发起主动关闭。TCP协议允许这种事情发生。见图1.图1同时关闭应用层的进程,同时发出关闭命令,两端均从ESTABLIS
兰博 嵌入式系统
学学绕制高频变压器
变压器参数需:磁芯:EE22原边:134T(1-3脚),辅助:32T(5-4脚),输出:15T(10-9脚)原边电感:138010%uH漏感:44uH引脚分布图:特别注意:绕制方法为网上下载,其中变压器绕制方法是对的,但其中存在着很多问题(比如,正规变压器的绕组的头和尾是要添加铁氟龙套管的,每一层之间也得打挡墙增加绝缘,要使变压器耦合好,通常的做法是三明治绕法,比如,1-3先绕35圈然后10-9,然后3-2绕35圈,然后绕5-
qwqwqw2088 模拟与混合信号
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved