STM32L4 PWM蜂鸣器

一、定时器

STM32F1系列的产品,除了互联型产品外,工位8个定时器 TIM6、TIM7是基本定时器,TIM2、3、4、5是通用定时器,TIM1、TIM8是高级定时器

 

基本定时器

1.时钟源

定时器时钟TIMxCLK,即内部时钟CK_INT,经APB1预分频提供。

在STM32L4:

Tim1是高级时钟可做PWM输出

Tim15、Tim16是通用时钟,他们的时钟来源是APB2总线

Tim2、Tim3通用时钟,Tim6,Tim7基本时钟的时钟来源是APB1总线

2.计数器时钟

定时器时钟CK_CNT,用来驱动计数器计数。PSC是一个16位的预分频器,CK_CNT = TIMxCLK/(PSC+1)

3.计数器

计数器CNT是一个16位的寄存器,最大计数值为65535.当计数达到自动重载寄存器的值ARR的时候产生更新事件,并清零从头开始计数

4.自动重载寄存器

自动重载寄存器ARR是个16位寄存器,里面装着计数器能计数达到最大的值。当计数到这个值时,如果使能了中断,定时器会产生溢出中断

 

基本定时器没有捕获通道不能做PWM输出,可以做中断

定时器时钟CK_CNT = CK_INT/(PSC+1),T=1/f,则计数器计数一次的时间是1/CK_CNT;

当计数值达到ARR的时候也就是计数了ARR次,产生一次中断,中断一次的时间是(1/CK_CNT)*ARR。

二、PWM

 

脉冲宽度调制(PWM),是英文“Pulse Width Modulation"的缩写,简称脉宽调制

 

PWM的产生,在STM32定时器1-8中除了Timer6和Timer7不能产生PWM外,其它都可以产生。高级定时器1和8可以产生7路的PWM波,其它的可以产生4路。对于波的输出频率也利用公式1进行计算,至于波的占空比取CCR/ARR。

如图为向上计数:

     定时器重装载值为ARR,比较值CCRx

     t时刻对计数器值和比较值进行比较

     如果计数器值小于CCRx值,输出低电平

     如果计数器值大于CCRx值,输出高电平

PWM的一个周期

    定时器从0开始向上计数

    当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平

    t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平

    当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程

    至此一个PWM周期完成

影响因素

    ARR : 决定PWM周期(在时钟频率一定的情况下,当前为默认内部时钟CK_INT)

    CCRx : 决定PWM占空比(高低电平所占整个周期比例)

 

通过在timx_ccmrx寄存器里的OCXM位中写入“0110”(脉宽调制模式1)或“0111”(脉宽调制模式2)。

捕获/比较模式寄存器(TIMx_CCMR1/2):该寄存器总共有 2 个, TIMx _CCMR1和 TIMx _CCMR2。 TIMx_CCMR1 控制 CH1 和 2,而 TIMx_CCMR2 控制 CH3 和 4。

 

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为有效电平,否则为无效电平。

 

三、STM32蜂鸣器模块

当 PA1 输出高电平的时候,蜂鸣器将发声, 当 PA1 输出低电平的时候,蜂鸣器停止发声。R10U为了防止蜂鸣器误发声,下拉输出,推挽输出

 

有源蜂鸣器内含振荡源,只要一通电就发声,但发生频率固定,音色单一;无源蜂鸣器内部不含振荡源,内部结构相当于电磁场扬声器,可以通过给他输出一定频率的信号才能发声。

人耳能听到的频率范围在20Hz--20kHz之间,通过STM32的GPIO引脚快速切换高低电平输出就能实现无源蜂鸣器的发声,切换的频率不同,发出的音调就不一样。当CNT达到ARR值的时候,重新归零,然后重新向上计数,依次循环。改变CCRx的值,就可以改变PWM输出的占空比;改变ARR的值,就可以改变PWM输出的频率。

由上面知道Tim2的时钟来源是APB1


 

80MHZ,

PWM的时钟80MHz/PSC,PWM频率80MHz/PSC/ARR,PWM周期1*ARR/(80MHz/PSC),占空比CRRx/ARR。

GPIO mode设置成复用推挽输出,因为PWM会输出高低电平,GPIO下拉防止蜂鸣器误发声音。

生成代码

写个函数改变这几个值便能控制PWM

TIMx_CHxN是互补通道,与对应的TIM_CHx是相反的输出

要用HAL_TIMEx_PWMN_Start()函数使其工作

猜你喜欢

转载自blog.csdn.net/caijiwyj/article/details/88411116