本次测试PWM的输出准备使用外部的示波器进行查看,PWM是我们比较常用的功能之一,不管是步进电机的驱动还是咱们常见的呼吸还是咱们常见的呼吸灯,实际上都是通过PWM来实现的。还有一些驱动器件的基准也需要通过其提供。实际上PWM是定时器的一个高级功能,我们都知道定时器是通过预分频以及计数来实现的,而我们的pwm就是在达到百分比的一个计数的时候实现的一个状态的翻转,也可以理解为在定时器的周期内插入了一个状态的一个反转。和其他的高级功能一样,都要依托于定时器的基本定时计数功能。
PWM这类的高级功能就不只是内部模块的使用了,还是需要配合着GPIO的引脚进行工作,PWM需要GPIO进行输出。
我们开启一个高级定时看一下PWM的实际使用方法:
打开定时器后我们可以看到通道的配置,这些通道最后就会连接到固定的一些引脚上,我们看一下CH1对应的默认引脚:
我们可以看到对应的PA0已经自动配置了:
需要注意的事PWM的输出不需要中断的参与,也就是说不用开启中断,但是必要的定时器参数还是需要配置的和定时器的配置方法是一致的,比如配置为1kHz的频率,如下:
高级定时器还可以进行死区配置,不过咱们这里就不用了,对开始的输出状态也没有太大要求,就按照默认的来:
初始化阶段需要先开启PWM输出:
<p>HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);</p><p>__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);</p>
接下来我们在上面的三个模式中加入不同的PWM占比:
<p>void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)</p><p>{</p><p> if(GPIO_Pin == GPIO_PIN_13)</p><p> {</p><p> LED_Mode++;</p><p> LED_Mode %= 3;</p><p> LED_TimeCnt = 0;</p><p> HAL_GPIO_TogglePin(User_LED1_GPIO_Port, User_LED1_Pin);</p><p> if(LED_Mode == 0){</p><p>__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,250);</p><p> }</p><p> else if(LED_Mode == 1){</p><p>__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);</p><p> }</p><p> else if(LED_Mode == 2){</p><p>__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,750);</p><p> }</p><p> }</p><p>}</p>
三个按键对应三个状态,以下是对应的不同占空比,也是正确的:
|