一、简述
记--使用定时器4输出PWM来实现呼吸灯效果。
在人眼辨识能力范围内,调节LED亮的时间,达到LED灯的亮度不同。例:给低电平LED就亮,如果一个脉冲中全是低电平那么LED最亮,如果一个脉冲一半是高电平,一半是低电平,那么LED就显得有点暗,这样调整脉冲中的高低电平的比例就可以达到LED的亮度调节。
例子:链接: https://pan.baidu.com/s/1UEoZCFGvJSwpzSynFv73gA 提取码: 3ipx
二、效果
LED1逐渐由暗变亮,接着由亮变暗。
三、工程结构
四、源文件
main.c文件
#include "stm32f4xx.h"
#include "led.h"
#include "pwm.h"
//粗延时
void delay_ms(int ms)
{
int i,j;
for(i=0; i } //主函数 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; } pwm.h文件 #ifndef __PWM_H_ #define __PWM_H_ #include "stm32f4xx.h" void Pwm_Init(void); #endif pwm.c文件 #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的值设置比较值,调整占空比
上一篇:STM32F103_SD卡FatFs文件系统移植
下一篇:基于STM32利用TIM3的通道输出四个不同的PWM波
推荐阅读
史海拾趣
Caddell-Burns Manufacturing公司的创立源于两位创始人Caddell和Burns的远见卓识。上世纪80年代初,电子制造业正值蓬勃发展之际,两人看到了其中的商机,决定联手创办一家专注于电子零部件生产的公司。他们凭借自己的技术背景和行业经验,成功研发出了几款具有竞争力的产品,并逐渐在市场上站稳脚跟。在创业初期,公司虽然规模不大,但凭借过硬的产品质量和良好的客户服务,赢得了客户的信任和支持。
随着市场竞争的加剧,Brilliance公司意识到只有不断创新才能在行业中立足。于是,公司加大了对研发的投入,引进了一批高端人才和先进设备。经过无数次的试验和改进,Brilliance成功研发出了一项具有颠覆性的技术,并将其应用于新产品中。这款新产品不仅性能卓越,而且具有极高的性价比,迅速占领了市场份额。
随着技术的不断进步,伊士曼柯达公司不断推出新的产品和服务,以满足市场的多样化需求。在20世纪初,柯达已成为全球最大的胶卷供应商,并占据了美国摄影市场的绝大部分份额。此外,公司还积极向国际市场扩张,通过设立分支机构和办事处,将产品销往全球各地。这一时期,柯达不仅凭借其优质的产品赢得了广泛的客户基础,还树立了良好的品牌形象。
随着市场的不断变化和客户需求的升级,安美通意识到只有不断创新才能在竞争中立于不败之地。因此,公司加大了对研发的投入,积极引进高端人才,并与多所高校和研究机构建立了紧密的合作关系。通过持续的技术创新,安美通成功推出了一系列具有自主知识产权的新产品,进一步巩固了其在行业内的领先地位。
近年来,随着全球半导体市场的不断变化和终端产品需求的多样化,FIDELIX积极调整市场策略,加大产品创新力度。公司不断推出具有高性能、低功耗、高可靠性的存储芯片产品,以满足不同客户群体的需求。同时,FIDELIX还积极开拓新市场,拓展产品线,努力提升品牌影响力和市场竞争力。
以上五个故事均基于FIDELIX公司在电子行业里的发展情况模拟编写,旨在展示其发展历程中的关键节点和重要事件。每个故事都尽量保持客观性和事实性描述,不涉及任何主观评价或褒贬。
按照开发板上的说明,出现的P表示正在进行烧写,我粗略的计算过,正常情况下每4秒出现一个P,每行会出现32个P,总共需要编写25行,烧写一个LOGO大概需要53.333min。可是当我将LOGO中的进度条变窄后,烧写的时间缩减至一半,不明白是什么原因,希望 ...… 查看全部问答∨ |
我写的一个程序通过URL下载一些文件到本地,就是用了函数InternetOpen(); InternetOpenUrl();InternetReadFile();在模拟器上可以实现功能,拿到实际的WinCE器材上就不行了。函数连接不上。请问是什么问题啊? 在模拟器上我用的ActiveSync ...… 查看全部问答∨ |
要求一:对2440的硬件比较熟悉;能熟练绘制或修改PCB图; 要求二:对2440的WINCE BSP 比较熟悉;常用的驱动:如显示;串口;键盘等比较熟悉;目前系统用的是WINCE5.0; PS : 最后要求在北京 有具备要求一的或要求二的,欢迎和我联系。 希望高手 ...… 查看全部问答∨ |
|
邮箱投递几次消息后任务就不切换了两个任务,一个任务投递键值一个任务依据键值显示菜单。我用邮箱投递键值,投递几次之后,邮箱的地址就不对了,然后这两个任务也不切换了。这是为什么?… 查看全部问答∨ |