但凡学到MCU,肯定会弄到PWM这个功能,其实PWM说白了也就是定时器产生的,PWM的应用很广泛,如电机和电源等方面。STM32L053系列64pin只有3个定时器,如下图:
定时器2有4个通道,而定时器21和定时器22各有两个通道。所以最多只能输出8路PWM。
对于我们一般的应用足以了。定时器2是挂在APB1桥的,而定时器21和定时器22挂在APB2桥的,这个大家要注意。
现在我的例程是打开定时器2的CH1和CH2,然后输出PWM。首先我们先决定哪个脚作为PWM输出口,我这里就选择了PA0和PA1作为PWM输出口。如下图的管脚功能分布图:
打开管脚复用的初始化使用以下函数:
PWM参数的初始化代码如下:
- void Config_PWM(int PULSE1_VALUE, int PULSE2_VALUE)
- {
- TIM_OC_InitTypeDef sConfig;
- TIM_HandleTypeDef TimHandle;
-
- TimHandle.Instance = TIM2;
-
- TimHandle.Init.Prescaler = 1;
- TimHandle.Init.Period = 1599;
- TimHandle.Init.ClockDivision = 0;
- TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
- if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
- {
- /* Initialization Error */
- Error_Handler();
- }
-
-
-
- sConfig.OCMode = TIM_OCMODE_PWM1;
- sConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
- sConfig.OCFastMode = TIM_OCFAST_DISABLE;
- /* Set the pulse value for channel 1 */
- sConfig.Pulse = PULSE1_VALUE;
- if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_1) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
-
- /* Set the pulse value for channel 2 */
- sConfig.Pulse = PULSE2_VALUE;
- if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_2) != HAL_OK)
- {
- /* Configuration Error */
- Error_Handler();
- }
-
-
-
-
- if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- /* Start channel 2 */
- if(HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_2) != HAL_OK)
- {
- /* Starting Error */
- Error_Handler();
- }
- }
频率计算时:F = SYSCLK/(( Prescaler + 1)*( Period + 1));最大占空比为 Period+ 1。
我这里设置了10K的PWM频率,我的SYSCLK是32M。
主函数很简单,就是把CH1和CH2的占空比设为25%和50%。如果一切无误,可以板上的led会亮,提示初始化成功,否则程序或者硬件有问题,导致初始化失败。
下面贴上我我的测试图:
HAL库还是挺容易上手的
附上源代码: