这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
定时器pwm实验_呼吸灯 [2020/07/04 10:55] zgf |
定时器pwm实验_呼吸灯 [2022/03/22 10:18] (当前版本) sean |
||
---|---|---|---|
行 3: | 行 3: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-07-04 | gingko | 初次建立 | | | V1.0 | 2020-07-04 | gingko | 初次建立 | | ||
行 49: | 行 48: | ||
* 要使STM32F767的定时器TIMx产生PWM输出,我们要用到几个寄存器来控制PWM。接下来我们简单介绍一下其中四个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)、断路和死区寄存器( TIMx_BDTR)。 | * 要使STM32F767的定时器TIMx产生PWM输出,我们要用到几个寄存器来控制PWM。接下来我们简单介绍一下其中四个寄存器:捕获/比较模式寄存器(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)、断路和死区寄存器( TIMx_BDTR)。 | ||
* **(1)**捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器一般有2个:TIMx _CCMR1和 TIMx _CCMR2。 TIMx_CCMR1 控制 CH1 和2,而 TIMx_CCMR2 控制 CH3 和 4。TIM1_CCMR2寄存器各位描述如图。 | * **(1)**捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器一般有2个:TIMx _CCMR1和 TIMx _CCMR2。 TIMx_CCMR1 控制 CH1 和2,而 TIMx_CCMR2 控制 CH3 和 4。TIM1_CCMR2寄存器各位描述如图。 | ||
- | + | {{ :icore4:icore4_arm_hal_8_2.png?direct |}} | |
* 该寄存器的有些位在不同模式下,功能不一样,所以在图中,把寄存器分了2层,上面一层对应输出而下面的则对应输入。这里我们需要说明的是模式设置位OC4M,此部分由4位组成。总共可以配置成13种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种PWM模式的区别就是输出电平的极性相反。另外CC4S用于设置通道的方向(输入/输出)默认设置为0,就是设置通道作为输出使用。 | * 该寄存器的有些位在不同模式下,功能不一样,所以在图中,把寄存器分了2层,上面一层对应输出而下面的则对应输入。这里我们需要说明的是模式设置位OC4M,此部分由4位组成。总共可以配置成13种模式,我们使用的是PWM模式,所以这4位必须设置为0110/0111。这两种PWM模式的区别就是输出电平的极性相反。另外CC4S用于设置通道的方向(输入/输出)默认设置为0,就是设置通道作为输出使用。 | ||
* **(2)**捕获/比较使能寄存器(TIMx_CCER)该寄存器控制着各个输入输出通道的开关。该寄存器的各位描述如图所示: | * **(2)**捕获/比较使能寄存器(TIMx_CCER)该寄存器控制着各个输入输出通道的开关。该寄存器的各位描述如图所示: | ||
- | + | {{ :icore4:icore4_arm_hal_8_3.png?direct |}} | |
* 该寄存器比较简单,我们这里只用到了CC4E位,该位是输入/捕获4输出使能位,要想PWM从IO口输出,这个位必须设置为1,所以我们需要设置该位为1。 | * 该寄存器比较简单,我们这里只用到了CC4E位,该位是输入/捕获4输出使能位,要想PWM从IO口输出,这个位必须设置为1,所以我们需要设置该位为1。 | ||
* **(3)**捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有4个,对应4个通道CH1~4。我们使用的是通道2,TIM1_CCR2寄存器的各位描述如图所示: | * **(3)**捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有4个,对应4个通道CH1~4。我们使用的是通道2,TIM1_CCR2寄存器的各位描述如图所示: | ||
- | + | {{ :icore4:icore4_arm_hal_8_4.png?direct |}} | |
* 在输出模式下,该寄存器的值与CNT的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制PWM的输出脉宽了。 | * 在输出模式下,该寄存器的值与CNT的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制PWM的输出脉宽了。 | ||
* **(4)**断路和死区寄存器(TIMx_BDTR),如果是通用定时器,则配置以上三个寄存器就够了,但是我们使用的是高级定时器,则还需要配置:断路和死区寄存器(TIMx_BDTR),该寄存器各位描述如图所示: | * **(4)**断路和死区寄存器(TIMx_BDTR),如果是通用定时器,则配置以上三个寄存器就够了,但是我们使用的是高级定时器,则还需要配置:断路和死区寄存器(TIMx_BDTR),该寄存器各位描述如图所示: | ||
- | + | {{ :icore4:icore4_arm_hal_8_5.png?direct |}} | |
* 该寄存器,我们只需要关注第15位:MOE位,要想高级定时器的PWM正常输出,则必须设置MOE位为1,否则不会有输出。 | * 该寄存器,我们只需要关注第15位:MOE位,要想高级定时器的PWM正常输出,则必须设置MOE位为1,否则不会有输出。 | ||
* 本实验中,iCore4的蓝色LED连接在定时器的输出接口上,可以通过定时器的PWM输出控制LED的亮度,从而实验呼吸灯的功能。 | * 本实验中,iCore4的蓝色LED连接在定时器的输出接口上,可以通过定时器的PWM输出控制LED的亮度,从而实验呼吸灯的功能。 | ||
- | 四、实验程序 | + | ==== 四、实验程序 ==== |
- | 1、主函数 | + | |
+ | === 1、主函数 === | ||
<code c> | <code c> | ||
int main(void) | int main(void) | ||
行 93: | 行 94: | ||
</code> | </code> | ||
- | 2、开启TIM3和GPIO时钟 | + | === 2、开启TIM3和GPIO时钟 === |
* 要使用TIM1,我们必须先开启TIM1 的时钟,这里我们还要配置PA9为复用输出,才可以实现TIM1_CH2的PWM经过PA9输出。HAL库中使能TIM1和GPIO的方法如下: | * 要使用TIM1,我们必须先开启TIM1 的时钟,这里我们还要配置PA9为复用输出,才可以实现TIM1_CH2的PWM经过PA9输出。HAL库中使能TIM1和GPIO的方法如下: | ||
<code c> | <code c> | ||
行 134: | 行 136: | ||
</code> | </code> | ||
- | 3、控制占空比 | + | === 3、控制占空比 === |
* PWM 开始输出之后其占空比和频率都是固定的,而我们通过修改比较值TIM1_CCR2则可以控制CH2的输出占空比,继而控制LED的亮度。HAL库中并没有提供独立的修改占空比函数,这里我们可以编写这样一个函数如下: | * PWM 开始输出之后其占空比和频率都是固定的,而我们通过修改比较值TIM1_CCR2则可以控制CH2的输出占空比,继而控制LED的亮度。HAL库中并没有提供独立的修改占空比函数,这里我们可以编写这样一个函数如下: | ||
<code c> | <code c> |