历史上的今天
返回首页

历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2019年08月22日 | STM32 PWM之实现呼吸灯

2019-08-22 来源:eefocus

一、简述


        记--使用定时器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 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;

}

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的值设置比较值,调整占空比


推荐阅读

史海拾趣

Hirschmann公司的发展小趣事
虽然TC4013的时钟频率不是直接决定延时时间的因素,但它会影响定时器的触发频率和输出信号的周期。通过调整时钟信号的频率,可以在一定程度上改变输出信号的周期或占空比,从而间接影响定时电路的延时效果。然而,这种方法通常用于调整输出信号的频率特性,而非直接调整延时时间。
协顺电子(Finecables)公司的发展小趣事

近年来,随着电子行业技术的不断革新和市场环境的变化,协顺电子也面临着前所未有的挑战。为了应对这些挑战,公司开始进行转型升级。一方面,公司加大研发投入,推动产品创新和技术升级;另一方面,公司也积极探索新的业务领域和市场机会。同时,协顺电子还加强了与供应商和客户的合作关系,共同应对市场变化和挑战。这些努力使得公司在激烈的市场竞争中保持了良好的发展态势。

Delphi Connection Systems公司的发展小趣事

随着全球对环保意识的不断提高,Delphi Connection Systems公司也积极响应环保号召,致力于研发和生产环保型连接器产品。公司采用环保材料和工艺,减少生产过程中的污染排放,同时推出可回收、可再利用的连接器产品。这一举措不仅符合了环保要求,也为客户提供了更加环保的解决方案。

GTM公司的发展小趣事

随着全球对环保意识的不断提高,Delphi Connection Systems公司也积极响应环保号召,致力于研发和生产环保型连接器产品。公司采用环保材料和工艺,减少生产过程中的污染排放,同时推出可回收、可再利用的连接器产品。这一举措不仅符合了环保要求,也为客户提供了更加环保的解决方案。

Advanced Thermal Solutions公司的发展小趣事

ATS始终坚持以创新为驱动力,不断提升研发创新能力。公司设立了专门的研发团队,负责新技术和新产品的研发工作。通过与高校和研究机构的合作,ATS不断引入前沿的科技成果和人才资源,为公司的创新发展提供了有力支持。此外,ATS还建立了完善的研发流程和质量控制体系,确保每一款产品都能达到最高的性能和质量标准。

AMI [American Megatrends Inc]公司的发展小趣事

ATS公司成立于1989年,最初是一家专注于电子产品热管理咨询的公司。创始人团队凭借其深厚的电子工程背景和敏锐的市场洞察力,识别到电子产品热管理领域的潜在机遇。经过数月的研究和开发,ATS成功研发出了一种新型散热技术,显著提高了电子设备的散热效率。这一技术突破迅速赢得了市场的认可,ATS开始收到来自各大电子产品制造商的咨询和合作请求。

问答坊 | AI 解惑

晶体振荡器的工作原理

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 关键字: 晶振 振荡器 石英晶体 石英晶体振荡器是高精度和高稳定度的振荡器,被广泛应用于彩电、计算机、遥控器等各类振荡电路中,以及通信系统中用于频率发生器、为数据处理设备产生时钟信号和为特 ...…

查看全部问答>

困扰许久的数码管显示问题!

用两个传统的573 控制 数码管显示,奇怪的是单个显示时,一切正常。待到多位扫描显示时,就出现了奇怪的顺序和段码,小弟不才, 望大虾们,不吝赐教! #include <reg52.h> sbit dula=P2^0;sbit wela=P2^1; void delay(int i){ int j=1 ...…

查看全部问答>

鼠标指针的刷新问题

加了USB鼠标,能够显示鼠标指针。只移动鼠标,显示正常。点击鼠标时,不论左右键,鼠标指针背景就不对了,看起来是上一帧的图案。在右键菜单上下移动鼠标就会留下一行轨迹。 平时移动鼠标,没有异常,那么显示驱动里SetPointerShape应该是对的吧。 ...…

查看全部问答>

CE6.0中如何将串口配置信息保存到注册表?

WIN32下,CE6.0中如何将串口配置信息保存到注册表?大概过程是怎样的?应该保存在哪个主键中?…

查看全部问答>

谈菜鸟的FGPA学习方法

结合本人最近FGPA学习谈一下学习方法。由于本人也是FPGA菜鸟一枚,所以在做设计的时候总是会遇到各种问题,即使这种问题对于老手都会觉得“本来就 是这样!”这么简单,但对新手来说就是想觉得很奇怪。在学习的过程中,我们一般会遇到几类问题,一 ...…

查看全部问答>

STM32 USART串口中断

 main(void)  {    /*PC4  PC13 PB10 PA0 */  USART_InitTypeDef USART_InitStructure;  USART_InitStructure.USART_BaudRate = 9600;  USART_InitStructure.USART_WordLength = USART_WordLengt ...…

查看全部问答>

求430和PT100连接最简单的低功耗电路。请指点

求430和PT100连接最简单的低功耗电路。请指点 要能I/O控制节能的~…

查看全部问答>

使用usb(ch376或者ch375)完成PC和FPGA的通信

只是读写。   写,pc上的信息通过USB写如FPGA在数码管上显示。   读,读FPGA,ram里的信息,传给PC。 现在编verilog代码出现问题了。 谁要是有这个代码更好。 如果没有我想问一下,CH376并行通信的芯片中断管脚是怎么 ...…

查看全部问答>

点亮一个数码管

  之前虽然在开发板上学习了74HC573,但是当时连它的datasheet都没怎么看,就照着程序来写,所以对很多的芯片都不是很了解,对芯片很迷茫。终于决定要把以前做的试验在面包板上搭一遍体验体验。所以就有了今天的实验。经过几个小时的努力 ...…

查看全部问答>

工程师经验

工程师经验       人才的范围很宽泛,我的知识使我无法涵盖之。因此,在这里我还是仅以技术人员为主来跟大家探讨一下。下面我从发展方向、自我定位、过程实 现三个方面去分析,发展方向是目标,自我定位是基础,过程实现是 ...…

查看全部问答>