STM32
直播中

七上八下

8年用户 785经验值
私信 关注
[问答]

STM32定时器输出一路PWM

STM32输出PWM原理是什么?
STM32的定时器输出PWM有几种模式?

回帖(1)

刘玲

2021-10-19 14:47:15
  STM32定时器输出一路PWM(控制LED灯的亮度)
  STM32的定时器具有强大的功能,今天的输出PWM功能是属于其中的输出比较功能。
  stm32输出PWM原理:(以下为个人理解,如果错误的地方 请多多指教OoO)
  CNT是计数值 ARR是重装载值 CCRx是比较值
  定时器输出PWM有两种模式:
  PWM 模式1 计数值大于比较值 输出有效电平 否则输出无效电平
  PWM 模式2 计数值大于比较值 输出无效电平 否则输出有效电平(有效电平我们自己设定,电平输出作用在定时器PWM的输出通道)
  例如:
  ARR=1000 CCRx=500 有效电平为:高电平
  当CNT《CCRx 时(即CNT在(0,500)的范围时)输出无效电平(即低电平)
  当CNT》CCRx 时(即CNT在(501,1000)的范围时) 输出有效电平(高电平)
  高低电平时间各占一半,即PWM的占空比为50%,重装载值为PWM的周期(即定时器的更新时间为PWM的周期)
  定时器时间的计算在我的另外一篇文章定时器控制LED灯中有说到,有不懂得如何计算小伙伴可以去看一下
  
  一、定时器–》配置
  1、新建工程,配置RCC、Clock、GPIO(这是对于STM32F407ZG,大家根据自己的开发板的具体参数去配置)
  RCC
  
  Clock
  
  GPIO(设置两个按键PE2、PE3,来改变CCRx的值的大小从而改变占空比的大小;PF10作为指示灯,按键按一次改变一次状态)
  
  
  按键配置(K1、K2配置类似)
  
  2、配置TIM(这里选用TIM14,CH1,输出端口为PF9)
  Pluse为比较值,这里先设置为0(在程序里面会有改动)
  
  二、输出代码
  输出配置
  
  三、添加自定义代码
  1、选择开发板型号
  
  2、添加自定义代码
  定义全局变量(Pulse比较值)
  uint16_t TIM_Pulse=500;//初值设置为500(占空比50%)
  添加函数,功能:重新设定Pulse的值
  void TIM14_SetPulse(uint16_t pulse)
  {
  TIM_OC_InitTypeDef sConfigOC = {0};
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = pulse;//占空比的值
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
  Error_Handler();
  }
  HAL_TIM_PWM_Start (&htim14,TIM_CHANNEL_1);//使通道一开始产生PWM
  }
  添加按键函数
  #define K1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)//读取PE2、PE3的状态
  #define K2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)
  void Key_Work()
  {
  if(K1==0)
  {
  HAL_Delay(10);
  if(K1==0)
  {
  TIM_Pulse+=50;//占空比增加
  printf(“%dn”,TIM_Pulse);//使用串口输出占空比的值
  HAL_GPIO_TogglePin(GPIOF,LED_Pin);//指示灯转态改变
  TIM14_SetPulse(TIM_Pulse);//重新设置
  }
  while(!K1);
  }
  else if(K2==0)
  {
  HAL_Delay(10);
  if(K2==0)
  {
  TIM_Pulse-=50;
  printf(“%dn”,TIM_Pulse);
  HAL_GPIO_TogglePin(GPIOF,LED_Pin);
  TIM14_SetPulse(TIM_Pulse);
  }
  while(!K2);
  }
  }
  在主函数的while中调用按键函数,并添加
  HAL_TIM_PWM_Start (&htim14,TIM_CHANNEL_1);//使通道一开始产生PWM,第一次启动
  编译并烧入开发板,改变Pulse的值 LED灯的暗亮也随之改变
举报

更多回帖

发帖
×
20
完善资料,
赚取积分