历史上的今天
今天是: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 } //主函数 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的值设置比较值,调整占空比

史海拾趣
|
本帖最后由 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 ...… 查看全部问答> |
|
结合本人最近FGPA学习谈一下学习方法。由于本人也是FPGA菜鸟一枚,所以在做设计的时候总是会遇到各种问题,即使这种问题对于老手都会觉得“本来就 是这样!”这么简单,但对新手来说就是想觉得很奇怪。在学习的过程中,我们一般会遇到几类问题,一 ...… 查看全部问答> |
|
main(void) { /*PC4 PC13 PB10 PA0 */ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLengt ...… 查看全部问答> |
|
使用usb(ch376或者ch375)完成PC和FPGA的通信 只是读写。 写,pc上的信息通过USB写如FPGA在数码管上显示。 读,读FPGA,ram里的信息,传给PC。 现在编verilog代码出现问题了。 谁要是有这个代码更好。 如果没有我想问一下,CH376并行通信的芯片中断管脚是怎么 ...… 查看全部问答> |




