用户工具

站点工具


定时器pwm实验_呼吸灯

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
定时器pwm实验_呼吸灯 [2020/07/04 10:52]
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 ​ |  初次建立 ​ | 
行 17: 行 16:
   - 掌握KEILMDK 集成开发环境使用方法。   - 掌握KEILMDK 集成开发环境使用方法。
 二、实验设备及平台 二、实验设备及平台
-  - iCore4 双核心板。 +  - iCore4 双核心板[[https://​item.taobao.com/​item.htm?​spm=a1z10.1-c-s.w4004-22598974120.15.5923532fsFrHiE&​id=551864196684|点击购买]]。 
-  - JLINK(或相同功能)仿真器。+  - JLINK(或相同功能)仿真器[[https://​item.taobao.com/​item.htm?​id=554869837940|点击购买]]
   - Micro USB线缆。   - Micro USB线缆。
   - Keil MDK 开发平台。   - Keil MDK 开发平台。
行 39: 行 38:
   * 其中:ARR为重新装载值;PSC为预分频系数;TCLK为定时器时钟频率。如本次实验中TCLk为84M,选择ARR为499,PSC为83,其一个周期为0.5ms。   * 其中:ARR为重新装载值;PSC为预分频系数;TCLK为定时器时钟频率。如本次实验中TCLk为84M,选择ARR为499,PSC为83,其一个周期为0.5ms。
   * **PWM工作步骤解析:** ​       ​   * **PWM工作步骤解析:** ​       ​
-  ​* (1)CCR1捕获比较值寄存器设置比较值,将其与当前值寄存器的值比较,​要说明的是修改TIM_CCMR1寄存器的OC1M[2:​0]位可控制 PWM模式,方法如下: +    ​* (1)CCR1捕获比较值寄存器设置比较值,将其与当前值寄存器的值比较,​要说明的是修改TIM_CCMR1寄存器的OC1M[2:​0]位可控制 PWM模式,方法如下: 
-    * 110:PWM模式1——向上计数时,一旦TIMx_CNT<​TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>​TIMx_CCR1时通道1为无效电平(OC1REF=0),​否则有效电平(OC1REF=1)。 +      * 110:PWM模式1——向上计数时,一旦TIMx_CNT<​TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>​TIMx_CCR1时通道1为无效电平(OC1REF=0),​否则有效电平(OC1REF=1)。 
-    * 111:PWM模式2——在向上计数时,一旦TIMx_CNT<​TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>​TIMx_CCR1时通道1为有效电平,否则为无效电平。 +      * 111:PWM模式2——在向上计数时,一旦TIMx_CNT<​TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>​TIMx_CCR1时通道1为有效电平,否则为无效电平。 
-(2)经过输出控制器后,得到OC1ref电平还要经过一个选择,其由TIMx_CCRE寄存器的CC1P位控制:输入/​捕获1输出极性。0:高 电平有效。1:低电平有效 +    ​* ​(2)经过输出控制器后,得到OC1ref电平还要经过一个选择,其由TIMx_CCRE寄存器的CC1P位控制:输入/​捕获1输出极性。0:高 电平有效。1:低电平有效 
-(3)选择完成后经过输出电路来输出,输出电路由TIM_xCCRE寄存器的CC1E位控制。 +    ​* ​(3)选择完成后经过输出电路来输出,输出电路由TIM_xCCRE寄存器的CC1E位控制。 
-控制方式为0:关闭1:打开。+      ​* ​控制方式为0:关闭1:打开。
 === 3、寄存器介绍 === === 3、寄存器介绍 ===
   * STM32F767的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这里我们仅使用TIM1的CH2产生一路PWM输出。   * STM32F767的定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出。而通用定时器也能同时产生多达4路的PWM输出,这里我们仅使用TIM1的CH2产生一路PWM输出。
   * 要使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>
定时器pwm实验_呼吸灯.1593831173.txt.gz · 最后更改: 2020/07/04 10:52 由 zgf