[讨论] 【Nucleo心得】+ PWM输出

强仔00001   2014-12-2 02:07 楼主
   但凡学到MCU,肯定会弄到PWM这个功能,其实PWM说白了也就是定时器产生的,PWM的应用很广泛,如电机和电源等方面。STM32L053系列64pin只有3个定时器,如下图:
QQ截图20141202013522.png
定时器24个通道,而定时器21和定时器22各有两个通道。所以最多只能输出8PWM
对于我们一般的应用足以了。定时器2是挂在APB1桥的,而定时器21和定时器22挂在APB2桥的,这个大家要注意。

现在我的例程是打开定时器2CH1CH2,然后输出PWM。首先我们先决定哪个脚作为PWM输出口,我这里就选择了PA0PA1作为PWM输出口。如下图的管脚功能分布图:
QQ截图20141202014319.png
打开管脚复用的初始化使用以下函数:
QQ截图20141202014454.png
PWM参数的初始化代码如下:
  1. void Config_PWM(int PULSE1_VALUE, int PULSE2_VALUE)
  2. {
  3.         TIM_OC_InitTypeDef sConfig;
  4.   TIM_HandleTypeDef    TimHandle;
  5.        
  6.         TimHandle.Instance = TIM2;
  7.   
  8.   TimHandle.Init.Prescaler     = 1;
  9.   TimHandle.Init.Period        = 1599;
  10.   TimHandle.Init.ClockDivision = 0;
  11.   TimHandle.Init.CounterMode   = TIM_COUNTERMODE_UP;
  12.   if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
  13.   {
  14.     /* Initialization Error */
  15.     Error_Handler();
  16.   }
  17.        
  18.        
  19.        
  20.   sConfig.OCMode     = TIM_OCMODE_PWM1;
  21.   sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  22.   sConfig.OCFastMode = TIM_OCFAST_DISABLE;

  23.   /* Set the pulse value for channel 1 */
  24.   sConfig.Pulse = PULSE1_VALUE;  
  25.   if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
  26.   {
  27.     /* Configuration Error */
  28.      Error_Handler();
  29.   }
  30.   
  31.   /* Set the pulse value for channel 2 */
  32.   sConfig.Pulse = PULSE2_VALUE;
  33.   if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)
  34.   {
  35.     /* Configuration Error */
  36.     Error_Handler();
  37.   }
  38.        
  39.        
  40.   
  41.        
  42.          if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
  43.   {
  44.     /* Starting Error */
  45.     Error_Handler();
  46.   }
  47.   /* Start channel 2 */
  48.   if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
  49.   {
  50.     /* Starting Error */
  51.     Error_Handler();
  52.   }


  53. }
频率计算时:F = SYSCLK/(( Prescaler + 1)*( Period + 1));最大占空比为 Period+ 1
我这里设置了10KPWM频率,我的SYSCLK32M
主函数很简单,就是把CH1CH2的占空比设为25%50%。如果一切无误,可以板上的led会亮,提示初始化成功,否则程序或者硬件有问题,导致初始化失败。

下面贴上我我的测试图:
IMG_20141202_012748.jpg IMG_20141202_012818.jpg
HAL库还是挺容易上手的
附上源代码:
PWM_TEST.zip (682.92 KB)
(下载次数: 209, 2014-12-2 02:06 上传)



回复评论 (4)

赞,好细致啊
点赞  2014-12-2 08:30
非常不错。。。。。。。。。。。。。
我的博客
点赞  2014-12-2 08:33
引用: zhaojun_xf 发表于 2014-12-2 08:33
非常不错。。。。。。。。。。。。。
感觉还可以,谢谢版主支持
点赞  2014-12-2 11:53
引用: tianshuihu 发表于 2014-12-2 08:30
赞,好细致啊
感谢支持
点赞  2014-12-6 00:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复