设定.ioc档
这边选择TIM2来做,首先进到.ioc当中先确认系统时钟频率为多少,这边我的是16Mhz
接着点选左侧的Timer选择TIM2进行PWM的设置,在Channel 1的地方选择PWM Generation CH1,同时CH_1的接脚为PA0。
接着可以看到下方的配置部分,Prescaler与auto-reload preload(ARR)在前几篇Timer有介绍过,Prescaler设置为15 ARR设置为5000会得到200Hz的PWM方波,Pulse设置为3750会得到佔空比75%,要注意这边选择模式1,高电位会在CNT小于Pluse时产生。
函数介绍
启动PWM输出模式(放在main当中启动一次就可以了)//第一个参数为定时器//第二个参数为通道HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)//EXHAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
修改ARR值 : 可以改变PWM的频率//将TIM3的ARR值改为1000//第一个参数为定时器//第二个参数为要修改的值__HAL_TIM_SET_AUTORELOAD(&htim3, 1000);
修改Pulse值 : 可以改变佔空比//将TIM3的Pulse值改为1000//第一个参数为定时器//第二个参数为输出通道//第三个参数为要修改的值__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,1000);
呼吸灯实作
由于手边没有马达可以做测试,这边就先使用PWM来输出LED~
假设以1Hz的频率去输出LED灯,那也就代表1秒当中0.5为亮灯0.5会熄灯,这时会看到LED是闪烁的状况。
以200Hz的频率去输出LED灯,5ms当中暗与亮各佔一半,这时因为频率太快导致看起来只有亮度减少。
所以在频率相同时改变佔空比可以改变LED的亮度达到呼吸灯的效果。
/* USER CODE BEGIN 2 */ HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ for(x=0;x<=4999;x++) //从最暗到最亮 { __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,x); HAL_Delay(5); //方便观察LED灯明暗变化 } for(x=4999;x>=0;x--) //从最亮到最暗 { __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,x); HAL_Delay(5); } } /* USER CODE END 3 */
暗到亮

有兴趣的话也可以结合其他中断方式去做不同模式变化~~
以上内容如果有误的话,麻烦各位通知我。感谢~