精华内容
下载资源
问答
  • 基于STM32PWM驱动LED呼吸灯
    2022-04-10 21:40:33

    一,PWM基本原理

    所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比。频率,就是周期的倒数;占空比,就是高电平在一个周期内所占的比例。如当周期T=T1+T2;T1为高电平时间,T2为低电平时间,此时频率F的值为1/(T1+T2),占空比D的值为T1/(T1+T2)。通过改变单位时间内脉冲的个数可以实现调频;通过改变占空比可以实现调压。占空比越大,所得到的平均电压也就越大,幅值也就越大;占空比越小,所得到的平均电压也就越小,幅值也就越小,如动图演示所示。PWM方波的示意图如下图所示:

                                 

    二,PWM基本结构及配置PWM步骤

    第1步,RCC开启时钟,把我们要用的TlM外设和GPIO外设的时钟打开。

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

    第2步,配置时基单元,包括时钟源选择

        TIM_InternalClockConfig(TIM2);//这里选用内部时钟

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置参数
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;
        TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;
        TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

    第3步,配置输出比较单元

    void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
    void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

    OC就是Output Compare(输出比较)OC1,OC2,OC3,OC4,一个函数配置一个单元(输出比较通道),上面这四个函数用于设置输出PWM时用到的参数,包括选择PWM输出模式,选择输出极性,设置比较值。注意:设置输出时是按输出通道分的库函数。即需要初始化哪个通道,就调用哪个函数。不同的通道对应的GPIO口也是不一样的。

        TIM_OCInitTypeDef  TIM_OCInitStructure;配置参数                      TIM_OCStructInit(&TIM_OCInitStructure);//用来给输出比较结构体成员赋一个默认值的,下面        就可以再更改你想改的值就行了。可以避免结构体成员没有配置完整。
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStructure.TIM_Pulse = 0;
        TIM_OC1Init(TIM2, &TIM_OCInitStructure);

    第4步,配置GPIO

        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    //GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

    第五步,运行控制,启动计数器,这样就能输出PWM了。
    void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
    void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
    void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
    void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

    这四个函数是用来单独更改CCR寄存器值的函数,可以运行的时候,更改占空比。TIM_Cmd(TIM2, ENABLE);
    TIM_SetCompare1(TIM2, Compare1);

    第6步,主程序
        while(1)
        {
            for (uint8_t i = 0; i < 100; i ++)
            {
                PWM_SetCompare1(i);
                delay_ms(10);
            }
            for (uint8_t i = 0; i < 100; i ++)
            {
                PWM_SetCompare1(100 - i);
                delay_ms(10);
            }
            delay_ms(500);
        }

    更多相关内容
  • stm32PWM呼吸灯

    2019-01-17 15:46:01
    适用于stm32初学者的基于PWM呼吸灯,其中PWM是初学STM32的一个难点,因此可以通过此例程加强理解。
  • 基于STM32单片机设计的PWM呼吸灯控制KEIL工程源代码,PWM信号是一种脉宽调制信号,广范用于LED和电机控制等场合。PWM信号其实类似于方波,只有0和1两种状态。PWM信号可以调节占空比。不同占空比可以使LED产生不同...
  • 电子-STM32PWM呼吸灯详解.docx,单片机/嵌入式STM32-F0/F1/F2
  • STM32_PWM呼吸灯

    千次阅读 多人点赞 2021-03-30 11:16:57
    1、什么叫呼吸灯? 由亮到暗逐渐变化,很有节奏感地一起一伏,感觉好像人在呼吸,当手机收到消息,屏幕上的指示灯会渐变,比较显眼,能起到一个通知提醒的作用,其实这就一个呼吸灯。 (备注:现在由于手机都在往...

    1、什么叫呼吸灯?
    由亮到暗逐渐变化,很有节奏感地一起一伏,感觉好像人在呼吸,当手机收到消息,屏幕上的指示灯会渐变,比较显眼,能起到一个通知提醒的作用,其实这就是一个呼吸灯。
    (备注:现在由于手机都在往全面屏发展,因此很多手机取消了呼吸灯这一功能,取而代之的是息屏显示,而这篇文章的目的也不是单纯地点亮一个呼吸灯,而是要了解背后的原理,知道什么是PWM,应该如何使用)

    2、什么是PWM?
    PWM:Pulse Width Modulation,脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

    可以将PWM理解为:对脉冲信号的处理技术,这里的“处理”指就的是改变占空比,从而改变最后呈现的效果。

    既然是针对的是脉冲信号,肯定会有以下这些概念(关于脉冲就是不断跳跃的波,而PWM脉冲信号是矩形波):

    PWM的频率:是指1秒钟内,信号从高电平到低电平再回到高电平的次数,也就是说一秒钟PWM有多少个周期。
    单位:Hz

    一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感(因人而异)。
    频率太小的话看起来就会闪烁,那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是一个常亮的LED灯。
    频率很高时,看不到闪烁,占空比越大,LED越亮(平均电压越大);频率很低时,可看到闪烁,占空比越大,LED越亮。
    所以,在频率一定下,可以用不同占空比改变LED灯的亮度,使其达到一个呼吸灯的效果。

    PWM的周期:T=1/f
    如果频率为50Hz,也就是说一个周期是20ms,那么一秒钟就有50次PWM周期。

    占空比:在一个周期内,高电平的时间占整个周期时间
    duty=t1/T
    单位:% (0%-100%)

    脉宽时间:高电平时间。

    在这里插入图片描述

    PWM原理:
    单片机的IO引脚输出的是数字信号,且只能输出1和0。

    TTL电平中,高电平为5V,低电平为0V,但是我们想要输出不同的模拟电压,比如输出3.75V应该怎么操作?

    这里就要用到PWM,通过改变IO引脚输出方波的占空比,从而得到不同的模拟电压值,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。

    在这里插入图片描述

    模拟电压=最大电压*占空比,这里的模拟电压是平均值,占空比越大,则模拟电压也越大。

    在这里插入图片描述
    在这里插入图片描述

    如何产生PWM波?
    使用单片机中的定时器I/O口可以产生PWM波。

    那么下面再介绍一下定时器,区别于SysTick滴答定时器(一般只用于系统时钟的定时)
    在这里插入图片描述
    基本定时器只具有定时功能;而高级定时器比通用定时器多了三相六步电机的接口以及刹车功能,而这里我们只需要输出PWM波,使用通用定时器就够了。

    如何使用定时器输出PWM波?换个问法就是:如何配置定时器输出PWM波?

    通用定时器可以利用GPIO引脚进行脉冲输出,但是并不是任意GPIO 都具有STM32 定时器的输出通道功能,这需要根据芯片的引脚功能选择具有定时器输出通道功能的引脚来控制RGB 灯。
    在这里插入图片描述

    与定时器输出PWM有关的库函数:

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在本次实验中使用的是PB5复用功能(重映射),也就是定时器3的通道2功能,呼吸灯是红灯。

    实验:通过PWM波实现单色呼吸灯(LED从亮渐灭,再从灭渐亮,以此循环)

    下面讲解代码:

    pwm.h

    #ifndef __TIMER_H
    #define __TIMER_H
    
    #include "stm32f10x.h"
    
    void TIM3_Config(void);
    
    #endif
    

    pwm.c

    #include "pwm.h"
    
    
    //定时器3配置
    void TIM3_Config(void)
    {	
    	static GPIO_InitTypeDef				GPIO_InitStructure;
    	static TIM_TimeBaseInitTypeDef		TIM_TimeBaseStructure;
    	static TIM_OCInitTypeDef       		TIM_OCInitStructure;
    	
    	//1.使能定时器3时钟和GPIO时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
    	
    	//2.TIM3部分重映射
    	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5  
    	
    	//3.配置GPIO引脚为复用功能
    	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//选择GPIOB组的第0根引脚
    	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//选择引脚为复用推挽功能
    	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//选择引脚速度	
    	GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化GPIO
    	
    	
    	//4.配置定时器3的频率,包括:分频值、计数值等
    	TIM_TimeBaseStructure.TIM_Period=99;		//计数值
    	TIM_TimeBaseStructure.TIM_Prescaler=0;			//分频值
    	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
    	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);  //初始化定时器
    	
    	
    	//5.配置定时器3的通道2占空比
    	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
    	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//打开或者关闭脉冲输出
    	TIM_OCInitStructure.TIM_Pulse = 50;	//比较值
    	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //有效电平设置为高状态		
    	TIM_OC2Init(TIM3,&TIM_OCInitStructure);//初始化定时器通道2
    		
    	//6.使能定时器3工作
    	TIM_Cmd(TIM3,ENABLE);
    
    }
    

    delay.h

    #ifndef __DELAY_H
    #define __DELAY_H
    
    #include "stm32f10x.h"
    
    void delay_us(uint32_t n);
    void delay_ms(uint32_t n);
    
    #endif
    
    

    delay.c

    
    //延时函数
    void delay_ms(uint32_t n)
    {
    	while(n--) //延时值
    	{
    		SysTick->CTRL=0;			//关闭滴答定时器,从最初的状态开始
    		SysTick->LOAD=(720000*n)-1;   //配置计数值为(720000)-1 ~ 0(递减)
    		SysTick->VAL=0;				//清除当前计数值值
    		SysTick->CTRL=5;			//使能定时器时钟
    		while((SysTick->CTRL & 0x10000)==0);  //等待计数值归为0
    			
    	}
    	SysTick->CTRL=0;		//关闭滴答定时器
    }
    
    void delay_us(uint32_t n)
    {
    	SysTick->CTRL = 0; 			// Disable SysTick,关闭系统定时器
    	SysTick->LOAD = (72*n)-1; // 配置计数值(72*n)-1 ~ 0
    	SysTick->VAL  = 0; 		// Clear current value as well as count flag
    	SysTick->CTRL = 5; 		// Enable SysTick timer with processor clock
    	while ((SysTick->CTRL & 0x10000)==0);// Wait until count flag is set
    	SysTick->CTRL = 0; 		// Disable SysTick	
    }
    
    

    main.c

    #include "stm32f10x.h"
    #include "pwm.h"
    #include "delay.h"
    
    
     int main(void)
    {
    	int32_t i=0;   //为了使定时器比较值发生变化使用,这样可以实现动态PWM波
    		
    	//调用定时器3的配置函数
    	TIM3_Config();
    			
    	//主函数循环
    	while(1)
    	{
    		//灯渐灭
    		for(i=20;i>=0;i--)
    		{
    			TIM_SetCompare2(TIM3,i);//赋值给定时器的比较值不断减1,
    			delay_ms(1);
    		}
    		
    		//灯渐亮
    		for(i=0;i<=20;i++)
    		{
    			TIM_SetCompare2(TIM3,i);//赋值给定时器的比较值不断加1,
    			delay_ms(1);
    		}
    	}
    		
    }
    

    这是实现呼吸灯所有需要自己的代码,中断为空,下面为实验效果图:
    在这里插入图片描述

    在这里插入图片描述

    /*Arduino实现呼吸灯程序*/
    int LED_PIN=9;
    
    void setup(){
     //setup不做任何处理 
     }
    
    void loop(){
      
      //LED渐亮
      for(int fadeValue=0;fadeValue<=255;fadeValue+=5){
        //输出PWM
        analogWrite(LED_PIN,fadeValue);//fadeValue是脉冲宽度,即高电平的时间,也就是占空比
        delay(30);
      }  
    
      //LED渐灭
      for(int fadeValue=255;fadeValue>=0;fadeValue-=5){
        analogWrite(LED_PIN,fadeValue);
        delay(30);  
      }  
    }
    

    最后一个是使用Arduino UNO板实现呼吸灯,相比STM32这个Arduino呼吸灯程序非常地简单,但是点亮呼吸灯并不是最终目的,而是要通过呼吸灯学会用定时器输出PWM波,每个板子都有板子的适用场所,相比Arduino,可以使用32实现一些更加复杂的功能,比如通过PWM波还可以控制舵机方向、电机转速等。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    由于本人也是刚开始学习STM32,属于新手一枚,在学习途中肯定会遇到很多疑问,所以自己建了一个STM32技术交流群,欢迎大家进群交流技术,彼此解答疑惑。
    在这里插入图片描述

    作者能力水平有限,文章难免存在错误和纰漏,请大佬不吝赐教,非常欢迎大家与小白杨进行技术交流,希望在此能遇到志同道合的朋友,一起学习技术。

    展开全文
  • #include<stm32f10x.h> #define Fremap #ifdef Premap #define Ch1 GPIO_Pin_4 #define Ch2 GPIO_Pin_5 #define Ch3 GPIO_Pin_0 #define Ch4 GPIO_Pin_1 #else #ifdef Fremap #define Ch1 ...
  • PWM脉宽调制LED的亮度。
  • 描述基于stm32pwm呼吸灯使用定时器来控制I/O口输出PWM波形,从而驱动LED灯出现类似呼吸频率一般的亮灭。硬件电路图:我的收获:这是STM32数据手册上对TIM3通用定时器复用功能重映象的描述,假设让PA6作为PWM输出,...

    描述

    基于stm32的pwm呼吸灯

    使用定时器来控制I/O口输出PWM波形,从而驱动LED灯出现类似呼吸频率一般的亮灭。

    硬件电路图:

    ffd37d0471842ab6338f3f2d1f0accc6.png

    我的收获:

    dd8a3ca7a84f799c53377fdddf54d995.png

    这是STM32数据手册上对TIM3通用定时器复用功能重映象的描述,假设让PA6作为PWM输出,从图中可以看出PA6对应TIM3的通道1,

    使能TIM3通道1的函数为

    TIM_OC1Init();1

    同样的,如果想要使能PA7,它对应的是TIM3的通道2,那么使能通道2的函数便是:

    TIM_OC2Init()1

    以此类推,需要注意,使能不同相同定时器不同通道的函数是有一点小差别的,防止在程序中调用TIM_OC1Init()函数来使能TIM3通道2这种情况的发生。

    51df6adec33269884d91b2f14357c5d6.png

    注意看这里,假设使用的是TIM3的通道1,那么这里就要写成

    TIM3-》CCR11

    类似的如果用TIM3定时器的通道2,这里就要相应的改为

    TIM3-》CCR21

    这同样是为了防止本来计划使用的是TIM3的通道1,反而在这里自摆乌龙写为了TIM-》CCR2的情况,这样的错误一般很隐蔽,不容易查找。

    相应的程序已经上传,但是不知道为什么在这里无法显示程序的下载地址,需要下载可以去我的资源里下载。

    工程文件为

    Progect–》RVMDK(uv4)–》iSO_STM32

    7095af371680352e9743887c375a98f6.png

    STM32PWM输出实现LED灯渐亮渐灭程序:

    /**说明:

    *PA0:KEY1;PA1:KEY2;

    *PA2:LED1;PA3:LED2;

    *PA9:USART1_TX;PA10:USART1_RX

    */

    #include “stm32f10x.h”

    #include “stm32f10x_rcc.h”

    #include “stm32f10x_gpio.h”

    #include “stm32f10x_tim.h”

    #include “stm32f10x_pwr.h”

    #include “stm32f10x_exti.h”

    #include “system_stm32f10x.h”

    #include “misc.h”

    void RCC_Configuration(void);

    void GPIO_Configuration(void);

    void TIM2_Configuration(void);

    void delay_ms(u16 time);

    int main()

    {

    u8 led_fx=1;

    u16 led_dt=0;

    RCC_Configuration();

    GPIO_Configuration();

    TIM2_Configuration();

    while(1)

    {

    delay_ms(10);

    if(led_fx==1)

    {

    led_dt++;

    }else{

    led_dt--;

    }

    if(led_dt》100) led_fx=0;//可以和初始值一样

    if(led_dt==0) led_fx=1;

    TIM_SetCompare3(TIM2,led_dt);//通道3没有重影像是PA2对应LED1

    TIM_SetCompare4(TIM2,led_dt);//通道4没有重影像是PA3对应LED2

    }

    }

    void RCC_Configuration(void)

    {

    SystemInit();

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

    //GPIO_AFIODeInit();和下面相同效果,可以查看源码证明

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    }

    void GPIO_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    //GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//端口映射函数

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//GPIO_Pin_3对应channel3,主函数改为:TIM_SetCompare3

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    }

    void TIM2_Configuration(void)

    {

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

    TIM_DeInit(TIM2);

    TIM_InternalClockConfig(TIM2);

    //定时器初始化

    TIM_TimeBaseStructure.TIM_Period = 100-1;//初始值是100,2MHz=2000KHz,2MHz/100=0.02MHz,所有周期T=1/0.02MHz=50us,示波器显示周期应该为50us

    TIM_TimeBaseStructure.TIM_Prescaler = 36-1;//36倍分频,72MHz/36=2MHz

    TIM_TimeBaseStructure.TIM_ClockDivision = 0;

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    //PWM初始化

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_Pulse = 50;//占空比值是50,所以占空比是:50/100=50%

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

    TIM_OC3Init(TIM2,&TIM_OCInitStructure);

    TIM_OCInitStructure.TIM_Pulse = 20;

    TIM_OC4Init(TIM2,&TIM_OCInitStructure);

    //TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);

    //TIM_ARRPreloadConfig(TIM2, ENABLE);

    TIM_Cmd(TIM2,ENABLE);

    TIM_CtrlPWMOutputs(TIM2,ENABLE);

    }

    void delay_ms(u16 time)

    {

    u16 i=0;

    while(time--)

    {

    i=12000;

    while(i--);

    }

    }

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • STM32 PWM之实现呼吸灯

    万次阅读 多人点赞 2019-01-22 20:35:43
    STM32 PWM之实现呼吸灯 一、简述  记--使用定时器4输出PWM来实现呼吸灯效果。  在人眼辨识能力范围内,调节LED亮的时间,达到LED灯的亮度不同。例:给低电平LED就亮,如果一个脉冲中全是低电平那么LED最亮,...

    STM32 PWM之实现呼吸灯

    一、简述

            记--使用定时器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<ms; 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的值设置比较值,调整占空比

    展开全文
  • 和CSDN上的同名博客想配套的程序,基于stm32,使用定时器来实现控制IO口输出PWM波形,从而是LED出现类似呼吸的现象。
  • STM32单片机通过定时器3定时,控制PWM亮度慢慢降低或亮度慢慢升高,即呼吸灯,亲测程序可用。
  • STM32 pwm控制呼吸灯代码,编写呼吸灯闪烁的主程序代码
  • STM32PWM控制呼吸灯实验

    千次阅读 2021-01-02 20:06:01
    目录一.PWM简介PWM生成方法二、PWM控制单色LED—单色呼吸灯硬件说明代码分析进行验证示波器查看波形呼吸灯 一.PWM简介 PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制。 PWM是一种...
  • 基于Stm32F103C8T6的PWM呼吸灯,由PWM占空比调节LED灯的亮度
  • 对于 STM32F1 芯片,要么输出高电平(3.3V),要么输出低电平(0),假如要输出 1.5V 的电压,就必须通过相应的处理,比如WM 输出,只要保证数字信号脉宽足够就可以使用 PWM 进行编码,从而输出 1.5V 的电压。...
  • STM32F4PWM呼吸灯实验例程.rar
  • 基于stm32单片机的用定时器产生PWM控制LED呼吸
  • STM32 使用PWM实现呼吸灯

    千次阅读 2020-03-26 22:22:06
    STM32 PWM实现呼吸灯 使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在GPIOD,GPIO_PIN13引脚LED1产生呼吸灯效果。 实验工具:MDK5,STM32F103ZET6开发板 使用固件库编程 实验效果:LED灯亮——逐渐变暗——全灭——...
  • 这一篇来介绍STM32的定时器,STM32的定时器分为三类: 基本定时器(Basic timers):从0计数到预设的值,并触发中断或DMA,没有其它功能,其内部与DAC相连,可以用于触发DAC; 通用定时器(General-purpose timers)...
  • stm32 pwm 呼吸灯

    2018-07-10 14:06:55
    stm32f0xx_hal.h" /* USER CODE BEGIN Includes */ int i=0; /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ TIM...
  • STM32的定时器实现PWM呼吸灯

    千次阅读 2020-11-12 16:37:07
    STM32的定时器实现PWM呼吸灯 1.程序比较简单,不再啰嗦。首先是STM32CubeMX里的关键信息配置,下面没截图到的就按默认的没改。我的板子是ST官方的STM32F429ZIT6-NUCLEO,时钟设置的内部时钟源的180MHz,TIM1在APB2...
  • stm32+cubemx输出pwm波,实现呼吸灯

    千次阅读 2022-02-15 17:14:17
    stm32 定时器 输出PWM呼吸灯 PWM简介 PWM一般指脉冲宽度调制,PWM波指脉冲宽度可调的方波。 描述pwm波特征的主要参数: 占空比 Duty : 方波高电平时间与周期的比值 (即图中的) Duty=dynTsTs Duty = { d_{yn}...
  • 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。
  • STM32 PWM简介及呼吸灯实验

    万次阅读 2017-01-07 16:21:27
    1.PWM简介 ...这里我们使用STM32F4的TIM14的CH1产生一路PWM输出。 值得一提的是控制PWM的三个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2),捕获/比较使能寄存器(TIMx_CCER),捕获/比较寄存器(TIMx
  • 基于stm32pwm呼吸灯

    万次阅读 2016-05-07 11:52:29
    STM32开发指南(库函数版本)》 正点原子著使用定时器来控制I/O口输出PWM波形,从而驱动LED出现类似呼吸频率一般的亮灭。硬件电路图: 我的收获: 1 这是STM32数据手册上对TIM3通用定时器复用功能重映象的
  • 基于STM32PWM三色呼吸灯 通过按键控制三色呼吸灯。按键中断打开捕获使能,定时器中断使能,核心级中断使能,从而进入定时器中断服务子程序,进行pwm控制呼吸灯。 main.c文件程序 #include "stm32f4xx.h" #include ...
  • 基于Stm32CubeMx的TIM2 PWM输出实现呼吸灯
  • STM32 PWM实现呼吸灯

    千次阅读 2018-12-19 15:35:44
    STM32 PWM控制呼吸灯程序(脉冲宽度调制) PWM工作原理 ARR:自动预装载寄存器 CNT:自动装载计数器 CRR:比较器 图解:在一个周期t2内,随着计数器(CNT)值的不断增加,取任一时刻t1,CNT的值与CCR的值进行比较,...
  • STM32呼吸灯设计

    2020-08-12 03:27:15
    听说呼吸灯是很久以前的事情了,那时候刚刚学习51单片机,没有单片机的基础。后来在网上看到了一个...在接触了STM32后,发现呼吸灯还是比较容易实现的,而且不需要什么硬件知识就可以完成。于是开始尝试做呼吸灯了。
  • stm32_呼吸灯.zip

    2020-11-04 15:28:33
    /** ****************************************************************************** * @file main.c * @author fire * @version V1.0 * @date 2013-xx-xx * @brief 用3.5.0版本库建的...#include "stm32f1

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 962
精华内容 384
关键字:

stm32pwm呼吸灯