微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 03-定时器输出pwm

03-定时器输出pwm

时间:10-02 整理:3721RD 点击:

      脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。  
      STM32F412除了基本定时器TIM6和TIM7,其他的定时器都可以用来产生PWM输出,高级定时器TIM1和TIM8可同时产生多达7路的PWM输出,通用定时器也能同时产生多达4路的PWM输出,在当前例子里我们用定时器来产生PWM输出。     
      产生PWM输出除了基本定时器用到的寄存器外,还需要3个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)和捕获/比较寄存器(TIMx_CCR1~4)。
实验:PWM输出,产生呼吸灯效果
硬件:LED,TIMx
步骤:
一、STM32CubeMX新建工程
1)Pinout设置中时钟RCC选择的LSE晶振,而LD2的引脚PB7设为TIM4_CH2,在左侧边栏的TIM4的通道2选择PWM Generation。   


2)Clock Configuration设置如下图,根据数据手册,TIM4连接在APB1上,因此TIM4的时钟是100MHz。



3)Configuration设置中点击TIM4,预分频系数设为999,自动重载寄存器值为999,PWM频率则为100MHz/(49+1)(1999+1) = 1kHz。
4)生成Keil5工程及代码。
二、Keil5修改代码
      在主函数中调用函数HAL_TIM_PWM_Start启动定时器,在程序循环中修改TIM2的比较寄存器的值来调整PWM输出脉冲宽度。下载代码到板子上,就可以看到蓝色的LED淡入淡出的呼吸灯效果了。

  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */
  4.   int dir = 2;
  5.   int pwm_val = 0;

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* Configure the system clock */
  9.   SystemClock_Config();

  10.   /* Initialize all configured peripherals */
  11.   MX_GPIO_Init();
  12.   MX_TIM4_Init();

  13.   /* USER CODE BEGIN 2 */
  14.         HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);

  15.   /* USER CODE END 2 */

  16.   /* Infinite loop */
  17.   /* USER CODE BEGIN WHILE */
  18.   while (1)
  19.   {
  20.   /* USER CODE END WHILE */

  21.   /* USER CODE BEGIN 3 */
  22.     pwm_val += dir;
  23.     if(pwm_val <= 0 || pwm_val >= 1999)
  24.       dir = -dir;
  25.         
  26.     __HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,pwm_val);
  27.     HAL_Delay(1);

  28.   }
  29.   /* USER CODE END 3 */

  30. }

复制代码




Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top