0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >LED应用 > 基于stm32的PWM输出呼吸灯设计方案

基于stm32的PWM输出呼吸灯设计方案

来源: elecfans
2021-08-05
类别:LED应用
eye 25
文章创建人 拍明

原标题:基于stm32的PWM输出呼吸灯设计方案

  基于stm32的pwm呼吸灯

  硬件电路图:

  

基于stm32的pwm呼吸灯


  我的收获:

  

image.png


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

  使能TIM3通道1的函数为

  TIM_OC1Init();1

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

  TIM_OC2Init()1

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

  image.png


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

  TIM3-》CCR11

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

  TIM3-》CCR21

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

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

  工程文件为

  Progect–》RVMDK(uv4)–》iSO_STM32

  

image.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--);

  }

  }


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

标签: stm32 pwm呼吸灯

相关资讯