精华内容
下载资源
问答
  • 2022-04-03 21:41:11

    pwm.h

    #ifndef _PWM_H
    #define _PWM_H
    #include"sys.h"
    void TIM1_PWM_Init(u16 arr,u16 psc);
    
    #endif
    

    pwm.c

    #include "pwm.h"
    #include "led.h"
    
    void TIM1_PWM_Init(u16 arr,u16 psc)
    {  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //gpio外设使能
    	                                                                     	
    
     //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    	
    	TIM_TimeBaseStructure.TIM_Period = arr; 
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; 
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
    	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); 
    
     
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //模式2
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    	TIM_OCInitStructure.TIM_Pulse = 0;
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
    	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  
    
      TIM_CtrlPWMOutputs(TIM1,ENABLE);	//主输出MOE使能 
    
    	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能 
    	
    	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能装载在TIM1上的ARR预装载寄存器使能
    	
    	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
     
       
    }

    main.c

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "pwm.h"
     int main(void)
     {	
    		u16 led0pwmval=0;
    		u8 dir=1;
    		delay_init();
    		LED_Init();
    		TIM1_PWM_Init(899,0);//72000/(899+1)
    	 
    		while(1)
    		{
    			delay_ms(10);
    			if(dir)led0pwmval++;
    			else led0pwmval--;
    			if(led0pwmval>300)dir=0;
    			if(led0pwmval==0)dir=1;
    			TIM_SetCompare1(TIM1,led0pwmval);
    		}
     }

    更多相关内容
  • 这一篇来介绍STM32的定时器,STM32的定时器分为三类: 基本定时器(Basic timers):从0计数到预设的值,并触发中断或DMA,没有其它功能,其...对于STM32F103C8T6来说,用于3个通用定时器和1个高级定时器(手册中)。
  • 基于Stm32F103C8T6的PWM呼吸灯,由PWM占空比调节LED灯的亮度
  • 基于STM32F103 PWM呼吸灯设计

    千次阅读 2020-07-29 23:02:35
    基于STM32F103 PWM呼吸灯设计 1、线性呼吸灯 bsp.c #include<includes.h> void RCC_Configuration(void); /* 初始化系统时钟 */ void TIM3_Configuration(void); /* PWM配置 */ void BSP_Init (void) { RCC...

    基于STM32F103 PWM呼吸灯设计

    1、线性呼吸灯

    bsp.c

    #include<includes.h>
    
    void RCC_Configuration(void);	/* 初始化系统时钟 */
    void TIM3_Configuration(void);	/* PWM配置 */
    
    void  BSP_Init (void)
    {
    	RCC_Configuration();	/* 初始化系统时钟 */
    	TIM3_Configuration();	/* PWM配置 */
    }
    /*********************************************************************************************************
    * 名    称 :RCC_Configuration
    * 功能描述 : 初始化系统时钟
    * 输入参数 : none
    * 返回参数 : none.
    * 作    者 : 
    * 修    改 :(日期、修改人名、修改原因)
    * 特殊说明 : (特殊功能说明,例如:有参数检查等)
    *********************************************************************************************************/
    void RCC_Configuration(void)
    {
    	SystemInit(); 
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
    }
    
    /*********************************************************************************************************
    * 名    称 :TIM3_Configuration
    * 功能描述 : 初始化定时器  PWM
    * 输入参数 : none
    * 返回参数 : none.
    * 作    者 : 
    * 修    改 :(日期、修改人名、修改原因)
    * 特殊说明 : (特殊功能说明,例如:有参数检查等)
    *********************************************************************************************************/
    void TIM3_Configuration(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_OCInitTypeDef TIM_OCInitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	
    	//通道1 PA7
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	
    	//通道2 PA6
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	//通道3 PB0  
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    		
    	//通道4 PB1
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	        	
    	/* Time base configuration */
    	TIM_TimeBaseStructure.TIM_Period = (100- 1);					//arr  设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    	TIM_TimeBaseStructure.TIM_Prescaler = (40-1);	 			 	//分频	psc  影响周期
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0;				 	//时钟分割,一般写0
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	 	//设置为向上计数模式
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    	/* PWM1 Mode configuration: Channel1*/
    	TIM_OCInitStructure.TIM_Pulse =0;						// 初始值
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;			   //pwm模式1
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//使能通道
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//高电平
    	
    	
    	//通道1
    	TIM_OC1Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    	
      //通道2 
    	TIM_OC2Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    		
    	//通道3 
    	TIM_OC3Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    		
    	//通道4
    	TIM_OC4Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    	
    	TIM_Cmd(TIM3, ENABLE);	/* 使能 */
    }
    
    
    

    main.c

    
    #include <includes.h>
    #include <stdlib.h> 
    
    extern void  BSP_Init (void);
    
    /*********************************************************************************************************
    * 名    称 :main
    * 功能描述 : 初始化STM32
    * 输入参数 : none
    * 返回参数 : none.
    * 作    者 : 
    * 修    改 :(日期、修改人名、修改原因)
    * 特殊说明 : (特殊功能说明,例如:有参数检查等)
    *********************************************************************************************************/ 
    int main(void)
    {
    	int  n1,n2,n3,n4;
    	int i;
    	n1=100;
    	n2=100;
    	n3=100;
    	n4=100;
    	BSP_Init();
    	while(1)
    	{     
    		for(i=0;i<100;i++)
    		{
    		  TIM_SetCompare1(TIM3,i);
    		  TIM_SetCompare2(TIM3,i);
    		  TIM_SetCompare3(TIM3,i);
    		  TIM_SetCompare4(TIM3,i);
    			delay_ms(19);
    		}
    		for(i=100;i>=0;i--)
    		{
    		  TIM_SetCompare1(TIM3,i);
    		  TIM_SetCompare2(TIM3,i);
    		  TIM_SetCompare3(TIM3,i);
    		  TIM_SetCompare4(TIM3,i);
    			delay_ms(19);
    		}
    		delay_ms(300);
    	}
    }
    
    2、正弦函数呼吸灯

    bsp.c

    #include<includes.h>
    
    void RCC_Configuration(void);	/* 初始化系统时钟 */
    void TIM3_Configuration(void);	/* PWM配置 */
    
    void  BSP_Init (void)
    {
    	RCC_Configuration();	/* 初始化系统时钟 */
    	TIM3_Configuration();	/* PWM配置 */
    }
    /*********************************************************************************************************
    * 名    称 :RCC_Configuration
    * 功能描述 : 初始化系统时钟
    * 输入参数 : none
    * 返回参数 : none.
    * 作    者 : 
    * 修    改 :(日期、修改人名、修改原因)
    * 特殊说明 : (特殊功能说明,例如:有参数检查等)
    *********************************************************************************************************/
    void RCC_Configuration(void)
    {
    	SystemInit(); 
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE);
    }
    
    /*********************************************************************************************************
    * 名    称 :TIM3_Configuration
    * 功能描述 : 初始化定时器  PWM
    * 输入参数 : none
    * 返回参数 : none.
    * 作    者 : 
    * 修    改 :(日期、修改人名、修改原因)
    * 特殊说明 : (特殊功能说明,例如:有参数检查等)
    *********************************************************************************************************/
    void TIM3_Configuration(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_OCInitTypeDef TIM_OCInitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	
    	//通道1 PA7
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	
    	//通道2 PA6
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	//通道3 PB0  
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	
    		
    	//通道4 PB1
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	                   
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;		 //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB, &GPIO_InitStructure);
    	        	
    	/* Time base configuration */
    	TIM_TimeBaseStructure.TIM_Period = (100- 1);					//arr  设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    	TIM_TimeBaseStructure.TIM_Prescaler = (40-1);	 			 	//分频	psc  影响周期
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0;				 	//时钟分割,一般写0
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;	 	//设置为向上计数模式
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    	/* PWM1 Mode configuration: Channel1*/
    	TIM_OCInitStructure.TIM_Pulse =0;						// 初始值
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;			   //pwm模式1
    	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//使能通道
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//高电平
    	
    	
    	//通道1
    	TIM_OC1Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    	
      //通道2 
    	TIM_OC2Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    		
    	//通道3 
    	TIM_OC3Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    		
    	//通道4
    	TIM_OC4Init(TIM3, &TIM_OCInitStructure);	                  
    	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);			//使能或者失能TIMx在CCR3上的预装载寄存器
    	
    	TIM_Cmd(TIM3, ENABLE);	/* 使能 */
    }
    
    
    

    main.c

    
    #include <includes.h>
    #include <stdlib.h> 
    #include <math.h>
    extern void  BSP_Init (void);
    
    /*********************************************************************************************************
    * 名    称 :main
    * 功能描述 : 初始化STM32
    * 输入参数 : none
    * 返回参数 : none.
    * 作    者 : 
    * 修    改 :(日期、修改人名、修改原因)
    * 特殊说明 : (特殊功能说明,例如:有参数检查等)
    *********************************************************************************************************/ 
    int main(void)
    {
    	int  n1,n2,n3,n4;
    	int i;
    	n1=100;
    	n2=100;
    	n3=100;
    	n4=100;
    	BSP_Init();
    	while(1)
    	{     
    		for(i=0;i<314;i++)
    		{
    		  TIM_SetCompare1(TIM3,100*sin(i/100.0));
    		  TIM_SetCompare2(TIM3,100*sin(i/100.0));
    		  TIM_SetCompare3(TIM3,100*sin(i/100.0));
    		  TIM_SetCompare4(TIM3,100*sin(i/100.0));
    			delay_ms(10);
    		}
    		for(i=314;i>=0;i--)
    		{
    		  TIM_SetCompare1(TIM3,100*sin(i/100.0));
    		  TIM_SetCompare2(TIM3,100*sin(i/100.0));
    		  TIM_SetCompare3(TIM3,100*sin(i/100.0));
    		  TIM_SetCompare4(TIM3,100*sin(i/100.0));
    			delay_ms(10);
    		}
    		delay_ms(300);
    	}
    }
    
    展开全文
  • 不要以为控制电压大小就行,STM32F103C8T6最小系统板没法控制电压渐渐变大变小,但是我们可以通过PWM的占空比来实现呼吸灯,程序用keil5软件编写,编译无错,实现效果完美,望如您所愿。其中PA6作为波形输出口。
  • STM32F103单片机的外设资源,时钟,IO,PWM输出配置
  • stm32 f103 pwm呼吸灯

    2019-08-15 14:06:58
    // 这边是实现呼吸灯的效果  }   } //TIM3 PWM部分初始化  //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM4_PWM_Init(u16 arr,u16 psc) {  GPIO_InitTypeDef GPIO_...

    硬件:小灯是高电平亮

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    为了明白,完全重映射 , 以 TIM4_CH1为例

     int main(void)
     {        
         u16 led0pwmval=0;
        u8 dir=1;    
        delay_init();             //延时函数初始化      
    //    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    //    uart_init(115200);     //串口初始化为115200
    //     LED_Init();                 //LED端口初始化
         TIM4_PWM_Init(899,0);     //不分频。PWM频率=72000000/900=80Khz
           while(1)
        {
             delay_ms(1);     
            if(dir)led0pwmval++;
            else led0pwmval--;

             if(led0pwmval>300)dir=0;
            if(led0pwmval==0)dir=1;                                         
            TIM_SetCompare1(TIM4,led0pwmval);        // 这边是实现呼吸灯的效果

        }     
     }

    //TIM3 PWM部分初始化 
    //PWM输出初始化
    //arr:自动重装值
    //psc:时钟预分频数
    void TIM4_PWM_Init(u16 arr,u16 psc)
    {  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);    //使能定时器3时钟
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  , ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

       //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形    GPIOB.6
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
     
       //初始化TIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        
        //初始化TIM3 Channel2 PWM模式     
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
        TIM_OC1Init(TIM4, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

        TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //使能TIM3在CCR1上的预装载寄存器
     
        TIM_Cmd(TIM4, ENABLE);  //使能TIM3
        

    }

    下面配置的是完全重映射

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
        
        GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4重映射   

     

     

     

    展开全文
  • 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸。
  • stm32f103pwm实现呼吸灯(寄存器)

    千次阅读 多人点赞 2019-09-22 17:19:58
    stm32f103pwm实现呼吸灯(寄存器) 一、pwm_init()代码 void pwm_init() { //1.配置AFIO 进行端口映射 //使能AFIO RCC->APB2ENR |= 1 << 0; //使能GPIOB RCC时钟 RCC->APB2ENR |= 1 <<...

    stm32f103pwm实现呼吸灯(寄存器)

    一、思路

    1. 通过 Tim 定时器可以设置多路 PWM 实现呼吸灯,所以我们使能一个 TIM3,因为 TIM3 的通道2(CH2)正好映射到 PB5(LED)
    2. 然后配置 PB5 为复用推挽输出,50MHZ
    3. pwm通过定时器 TIM3 的计数器 CNT 从 0 到 ARR(ARR可以设置为0-65535) 进行周期的自增或自减, CNT 每自增或自减一次与 CCR2 比较一次,CCR2的值由我们自己设置,一般通过 while 循环按照我们希望的时间 比如1s增加1
      如果在PWM模式1下 CNT向上计数时 CNT < CCR2 则将 PB5设为高电平
      如果在PWM模式2下 CNT向上计数时 CNT < CCR2 则将 PB5设为低电平
      通过 占空比 = 高电平时间 / 总时间 的变化实现呼吸灯效果
      在这里插入图片描述

    二、pwm_init()代码

    void pwm_init() {
    		//1.配置AFIO 进行端口映射
    		//使能AFIO
    		RCC->APB2ENR |= 1 << 0;
    		//使能GPIOB RCC时钟
    		RCC->APB2ENR |= 1 << 3;
    		//使能TIM3
    		RCC->APB1ENR |= 1 << 1;
    		//把TIM3部分映射到GPIOB5
    		AFIO->MAPR |= 1 << 11;
    		AFIO->MAPR &= ~(1 << 10);
    		
    		//2.配置GPIOB5端口
    		//设置GPIOB5为 复用推挽输出 即 [23:22] = CNF[1:0]
    		GPIOB->CRL |= 1 << 23;
    		GPIOB->CRL &= ~(1 << 22);
    		//设置GPIOB5为 输出模式 速度50MHZ   即 [21:20] = MODE[1:1]
    		GPIOB->CRL |= 1 << 21;
    		GPIOB->CRL |= 1 << 20;
    		//LED-OFF
    		GPIOB->ODR |= 1 << 5;
    		
    		//3.配置TIM3
    		//PSC为定时器的分频器
    		TIM3->PSC = 0;
    		//ARR为定时器计数上限  设置自动重装载值
    		TIM3->ARR = 5000;	
    		//TIM3->CH2 设置PWM模式1
    		TIM3->CCMR1 |= 6 << 12;
    		//TIM3->CH2 预装载使能
    		TIM3->CCMR1 |= 1 << 11;
    		//TIM3->CH2 输出使能
    		TIM3->CCER |= 1 << 4;
    		//使能 ARPE   ARR寄存器的值被装入缓冲器。
    		TIM3->CR1 |= 1 << 7;
    		//使能计数器
    		TIM3->CR1 |= 1 << 0;
    		//通过while循环设置TIM3->CCR2的值
    		int nFlag = 1;
    		int nPwmValue = 0;
    		while (1) {
    			//通过for循环设置每次变化时间
    		    for (volatile int i = 0; i < 100; i++) {}
    		    //通过设置 nFlag 的设置自增或自减
    		    if (nFlag) {
    		        nPwmValue++;
    		    } else {
    		        nPwmValue--;
    		    }
    		    //设置周期最大值
    		    if (nPwmValue >= 5000) {
    		        nFlag = 0;
    		    }
    		    //设置周期最小值
    		    if (nPwmValue <= 0) {
    		        nFlag = 1;
    		    }
    		    //设置 CCR2 的值
    		    TIM3->CCR2 = nPwmValue;
    		}
    }
    

    三、 分步讲解

    1.配置AFIO 进行端口映射 (部分芯片可能不支持 可采用跳线方式实现)

       	//使能AFIO
       	RCC->APB2ENR |= 1 << 0;
       	//使能GPIOB RCC时钟
       	RCC->APB2ENR |= 1 << 3;
       	//使能TIM3
       	RCC->APB1ENR |= 1 << 1;
       	//把TIM3部分映射到GPIOB5
       	AFIO->MAPR |= 1 << 11;
       	AFIO->MAPR &= ~(1 << 10);
    

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


    2.配置GPIOB5端口

       	//设置GPIOB5为 复用推挽输出 即 [23:22] = CNF[1:0]
       	GPIOB->CRL |= 1 << 23;
       	GPIOB->CRL &= ~(1 << 22);
       	//设置GPIOB5为 输出模式 速度50MHZ   即 [21:20] = MODE[1:1]
       	GPIOB->CRL |= 1 << 21;
       	GPIOB->CRL |= 1 << 20;
       	//LED-OFF
       	GPIOB->ODR |= 1 << 5;
    

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


    3.配置TIM3

       	//PSC为定时器的分频器
       	TIM3->PSC = 0;
       	//ARR为定时器计数上限  设置自动重装载值
       	TIM3->ARR = 5000;
       	
       	//TIM3->CH2 设置PWM模式1
       	TIM3->CCMR1 |= 6 << 12;
       	//TIM3->CH2 预装载使能
       	TIM3->CCMR1 |= 1 << 11;
       	
       	//TIM3->CH2 输出使能
       	TIM3->CCER |= 1 << 4;
       	
       	//使能 ARPE   ARR寄存器的值被装入缓冲器。
       	TIM3->CR1 |= 1 << 7;
       	//使能计数器
       	TIM3->CR1 |= 1 << 0;
       	
       	//通过while循环设置TIM3->CCR2的值
       	int nFlag = 1;
       	int nPwmValue = 0;
       	while (1) {
       		//通过for循环设置每次变化时间
       	    for (volatile int i = 0; i < 100; i++) {}
       	    //通过设置 nFlag 的设置自增或自减
       	    if (nFlag) {
       	        nPwmValue++;
       	    } else {
       	        nPwmValue--;
       	    }
       	    //设置周期最大值
       	    if (nPwmValue >= 5000) {
       	        nFlag = 0;
       	    }
       	    //设置周期最小值
       	    if (nPwmValue <= 0) {
       	        nFlag = 1;
       	    }
       	    //设置 CCR2 的值
       	    TIM3->CCR2 = nPwmValue;
       	}
    

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


    展开全文
  • 、、、pwm函数、、、 void TIM3_CH1_PWM_Init(u16 arr,u16 psc) { RCC->APB1ENR |= 1;//使能tim3时钟 RCC->APB2ENR |= 1;//映射使能 RCC->APB2ENR |= 1;//c端口使能 AFIO->MAPR &=0XFFFF3FF;//清除映射端口 ...
  • STM32F103_WS2812B灯带pwm+dma方式驱动控制程序软件源码 #include "sys.h" #include "delay.h" #include "usart.h" #include "ws2812b.h" #define mode 1 //mode = 1为呼吸灯 mode = 2为流水灯 int main(void) {...
  • stm32f103呼吸灯PWM脉冲宽度调制)

    千次阅读 2020-12-30 11:45:25
    stm32f103呼吸灯PWM脉冲宽度调制)一、PWM脉冲宽度调制二、硬件说明三、编程实现1、硬件相关宏定义2、GPIO初始化3、定义 PWM表4、定时器 PWM配置5、定时器中断服务函数6、计算拟合周期四、呼吸灯演示1、PWM输出...
  • #include "stm32f10x.h" #include "math.h" #include "stdio.h" u8 counter=0; int pwm=100; int flag=0; int mode =0; int velocity =0; int turning=1; //主要函数功能 void RCC_Configuration(void); //时钟...
  • 由于之前做过Nucleo-F429ZI的呼吸灯实验,所以就想当然地把那个实验的数据搬了过来。把PWM定时器和更改电平值定时器的prescaler都设置成了71,ARR也都设置成了9999。 将代码编译下载后,发现LED灯在闪烁中变换亮度...
  • STM32单片机通过定时器3定时,控制PWM亮度慢慢降低或亮度慢慢升高,即呼吸灯,亲测程序可用。
  • 即板是LED灯的亮灭实验程序,呼吸灯就是LED灯从亮慢慢变暗,再从暗慢慢变亮,不要以为控制电压大小就行,STM32F103C8T6最小系统板没法控制电压渐渐变大变小,但是我们可以通过PWM的占空比来实现呼吸灯,程序用keil5...
  • STM32F103ZET控制WS2811/SM16703P驱动RGB全彩LED呼吸灯。本人已用示波器确定好归零码时序,可直接使用。
  • STM32F103入门 | 12.PWM实现呼吸灯

    万次阅读 多人点赞 2019-05-01 08:45:52
    重要补充:由于STM32F103入门这个系列的教程都是基于6.工程模板的建立里面的那个工程模板进行编程的,所以,在6.工程模板的建立的第 (11) 那里,LIB 需要添加<src>文件夹中所有的 .c 文件。(不然的话,从9....
  • 基于STM32F103C8T6通过PWM波输出控制呼吸灯
  • 参考正点原子的代码,通过stm32 PWM实现呼吸灯的例程
  • PWM与LED呼吸灯有啥关系? 我们学过物理的同学应该知道,我们的占空比越大,做的功就越大,所以LED灯就越亮,反之,一样的原理。就像我们学过的物理一样(W=UIt),所以我们调节占空比就能灯的亮度。 二、代码编写
  • STM32 pwm控制呼吸灯代码,编写呼吸灯闪烁的主程序代码
  • STM32_PWM 呼吸灯 MDK 源代码

    热门讨论 2013-03-16 11:27:59
    STM32_PWM 呼吸灯 利用PWM功能使LED灯呼吸效果,非常漂亮.
  • STM32F103VET6呼吸灯之寄存器操作PWM

    千次阅读 2020-07-20 09:07:31
    本程序是基于stm32f103vet6单片机驱动led,使用pwm达到呼吸效果 PA2 TIM2 CH1 PWM PWM:Pulse Width Modulation 脉冲宽度调剂,是一种对模拟信号电平进行数字编码的方法。 随着电子技术的发展,出现了多种脉冲...
  • 基于STM32单片机设计的PWM呼吸灯控制KEIL工程源代码,PWM信号是一种脉宽调制信号,广范用于LED和电机控制等场合。PWM信号其实类似于方波,只有0和1两种状态。PWM信号可以调节占空比。不同占空比可以使LED产生不同...
  • STM32F103VET6实现呼吸灯

    2021-11-23 15:33:58
    STM32F103VET6开发板实现呼吸灯 文章目录STM32F103VET6开发板实现呼吸灯前言一、相关知识介绍1.呼吸灯简介2. 硬件简介二、实现呼吸灯1.单色呼吸灯2.初始化GPIO3.定义 PWM表4.定时器 PWM配置5.定时器中断服务函数6....

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 298
精华内容 119
关键字:

stm32f103pwm呼吸灯