历史上的今天
今天是:2024年09月06日(星期五)
2019年09月06日 | STM32L4 PWM蜂鸣器
2019-09-06 来源:eefocus
一、定时器
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()函数使其工作
史海拾趣
|
有需要请联系我 免费的 截止时间2009.6.28(上班了,就没时间了) [ 本帖最后由 sjl105105 于 2009-6-26 12:31 编辑 ]… 查看全部问答> |
|
CE上开发MC3000的程序,我去MC3000下他的SDK,没有搞清楚应该下载下面的哪个. 1:Platform SDK for MC3000 v1.1 with Windows CE 5.0 Core 2:Platform SDK for MC3000 v1.1 with Windows CE 5.0 Professional 不知道这两个有什么区别. 另外还有一 ...… 查看全部问答> |
|
我在用proteus做LPC2132的串口通信仿真时,外接一个虚拟终端和示波器,用示波器来查看数据发送的波形 当把示波器和虚拟终端接在一起然后连到Txd0 Rxd0上时,虚拟终端上面不能显示LPC2132发过来的数据,但是示波器可以看到LPC2132串口数据发送的波 ...… 查看全部问答> |
|
1.如果想实现定周期While循环时,需要用Wait(ms).vi而不是Wait Until Next ms Multiple.vi2.Wait(ms).vi在与代码并行时可以保证整个运行时间为设定值,这个功能一般都会以为是Wait Until Next ms Multiple.vi的特性3.Wait Until Next ms Multipl ...… 查看全部问答> |
|
近来一直在学习在fpga如何进行异步信号的处理,有一些心得,开个贴,把自己的一些体会贴出来,跟大家分享,也期待可以得到高手的指点。 目录如下: &n ...… 查看全部问答> |
|
如题,我在练习的时候遇到了一个可能比较基本的问题:不通过定时器,只写一个delay函数来实现LED灯的闪烁和数码管的点亮。 我自己用这种方式写的(8个LED闪烁,点亮2个数码管),无法实现上述功能。LED能闪烁,但是两位数码管中的第一位不能稳定显 ...… 查看全部问答> |
|
看到论坛里面有用1602显示汉字的,很好奇,也整弄了下 找了个区模的软件,能很好的取模,共享给大家 第一步:先新建一个 x*y 的模; 第二步:自己一个点点自己点; 第三步:使字模左右翻转下; 第四部:设置(看图片) 第五部: ...… 查看全部问答> |




