当前位置:首页 > 单片机 > 单片机
[导读]这两天应工作需求研究了一下M3处理器的PWM(脉宽调制)实现对蜂鸣器的异步控制。鉴于阻塞式对蜂鸣器的控制比较耗时,影响用户体验,因此对原有阻塞式控制方案进行了改善,提出了异步控制蜂鸣器的实现方法。以下主要对

这两天应工作需求研究了一下M3处理器的PWM(脉宽调制)实现对蜂鸣器的异步控制。鉴于阻塞式对蜂鸣器的控制比较耗时,影响用户体验,因此对原有阻塞式控制方案进行了改善,提出了异步控制蜂鸣器的实现方法。以下主要对实现中需要注意的重点知识以及所遇到的问题进行了讨论。

PWM波利用M3的定时器产生,出于对平台资源的有效利用,选择定时器1用来输出脉宽调制信号。这就引出了本文的重点,M3定时器的应用。

M3的定时器资源一共有11个,其中两个高级定时器(Timer1和Timer8)、4个通用定时器(Timer2-Timer5)、2个普通定时器(Timer6-Timer7)、2个看门狗定时器以及一个SysTick定时器。相对于普通定时器来说,高级定时器的功能更为强大,相对应的应用自然更为复杂,这个主要体现在电机控制中,比如直接输出具有调节死区时间的PWM。不过本项目的应用不涉及此点,也就不做讨论了。

M3的高级定时器理解为一个可供用户编程的预分频器驱动16bit的计数器。主要功能包括利用它的输入捕获模式可以实现对输入信号脉冲宽度的测量,利用PWM和输出比较模式可以实现波形输出。

M3具有复杂的时钟系统,它的外设都有自己独立的时钟控制,这就造成在应用上相对比较复杂一些,但是这为系统在降低功耗方面带了不小的优势。在实际应用中我们可以关掉那些不用的外设,这样就可以大大的降低功耗。因此,要想熟练的掌握M3,就必须对它的时钟树要很清楚,定时器的应用当然也不例外。我们就从时钟开始一步步的揭秘M3定时器的奥妙之处。

高级定时器1的时钟信号流向通过图1可以清楚的看到。M3处理器使用外部8M高速时钟,然后通过内部的倍频因数为9的锁相环将频率加倍到72M,将此时钟作为系统时钟。系统时钟通过分频因数为1的AHB预分频器将72M时钟提供给AHB总线,AHB总线通过分频因数为1的APB2预分频器将72M的时钟提供给APB2总线。APB2总线将时钟通过一个倍频器,与其他倍频器不同的是这个倍频器根据APB2分频因数有系统自动设置,如果APB2分频因数为1,则保持时钟不变,否则进行2倍频。通过倍频之后,接将72M的时钟信号提供给高级定时器1,而时钟信号在定时器内部又通过PSC的分频来驱动定时器1的计数器。我们对定时器的操作实际上主要是通过设置PSC的分频值和计数器的装载值来达到准确的定时和输出需要的波形等功能。。

图1 Timer1的时钟信号流向

理解了定时器的工作原理及时钟信号工作情况后,我们就来具体分析一下如何应用。从上文可以看出要想让M3的定时器工作首先必须得打开时钟,因此在系统进行初始化后得到72M的时钟后,打开Timer1的时钟。这个可以通过设置PB2ENR寄存器的第二位实现,后者也可以利用库函数RCC_APB2PeriphClockCmd直接使能。接下来就需要设置计数器初始装载值TIME1_ARR、分频器PSC,具体设置根据公式1进行设置。例如定时器1输入时钟为72M时,设置PSC(预分频器)为7199,当ARR(计数器装载数)为9时,一次中断我们就可以得1ms的定时。至于怎么配置中断函数以及中断函数然后编写此处不做赘述,详情可以参考STM32中文参考手册。

Time = (1+ARR)*(1+PSC)/Fsys

公式1 定时器时间计算公式

接下来讨论一下PWM的产生,在STM32定时器1-8中除了Timer6和Timer7不能产生PWM外,其它都可以产生。高级定时器1和8可以产生7路的PWM波,其它的可以产生4路。对于波的输出频率也利用公式1进行计算,至于波的占空比取CCR/ARR。我们以图2中3路不同占空比的波来看,它们的频率都一样约为1.2khz,计算值与测量值存在13hz的误差,这个是处理器本身的精度造成的。对于第一个波形来说ARR = 59999、CCR = 30000,就得到了约等于1.2Khz且50%占空比的波。而第二个波的ARR = 59999、CCR = 15000,就得到了频率约为1.2khz且25%占空比的波。


图2 Time1 PWM波仿真图

既然需要输出波对Beep进行控制,那么就需要进行IO口的设置,基本IO口的设置大家应该比较清楚,这里只介绍比较容易出错的地方,这就是关于管脚重映射,具体设置见图表1。由于在本项目中Beep是连接到PA11的,由表1可见PA11没有完全映像,因此对它只进行复用设置或者设置成部分映像。这里对时钟的设置除了打开PA口时钟,还需打开复用时钟。

表1 定时器1管脚复用功能映像



除了以上设置之外当然还有一些基本设置比如设置计数器向上加模式、极性为正、输出使能、使用PWM模式1或者模式2、使能预装载寄存器等基本设置。

因为要实现异步控制,因此还利用了M3的定时器2,利用定时器2对PWM波的输出进行控制。定时器2的应用与1类似,只需配置成定时模式即可。根据需要定时一定的时间,在中断处理函数中关掉定时器1即可。

转载请注明出处。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

这是一个很好的时钟,有很大的片段,你可以设置每个片段的颜色和强度。有三个按钮,蜂鸣器,光传感器和RTC与备用电池。时钟通过USB C供电,具有当前时间,计时器和秒表等功能。请随意添加您自己的功能!

关键字: 蜂鸣器 光传感器 RTC

Holtek新推出专为感烟报警器应用设计的Flash MCU - BA45F25752/BA45F25762,整合双通道感烟侦测AFE、红外/蓝光LED驱动、万年历与蜂鸣器驱动等功能。相较于先前的BA45F5750/BA...

关键字: 感烟报警器 MCU 蜂鸣器

HT16K24操作电压为2.4V~5.5V,内建I²C通信接口,提供三种LCD显示与按键模式:24SEG × 4COM + 24 KEY;22SEG × 6COM + 22 KEY;20SEG × 8COM + 20 K...

关键字: LCD MCU 蜂鸣器

Holtek新推出集成感烟探测AFE、双通道LED驱动及9 V蜂鸣器驱动的32-bit Arm® Cortex®-M0+ MCU HT32L62141,采用超低功耗ULP (Ultra-Low Power) 设计,并提供...

关键字: MCU 烟探测器 蜂鸣器

这个项目是农业自动化的一个有趣的旋转:一个机器人松露嗅探器,可以自主导航一个空间,识别代表松露热点的AprilTags,并收集“松露”(用彩色球模拟)。灵感来源于现实生活中用猪和狗来定位地下的松露。

关键字: 机器人 蜂鸣器 计算机视觉

本项目将向您介绍来自Elecrow的新型1.28英寸圆形显示器,该显示器集成了ESP32C3芯片等!该项目将演示将设备固件更新到MicroPython并显示自定义消息的步骤。

关键字: 显示器 ESP32C3 蜂鸣器

把“G”分开是对吉尼斯啤酒饮用技巧的真正考验——准确地喝一口,液体的水平面要正好落在吉尼斯标志上“G”的中间。作为一个不喝酒的人,我想看看我是否能设计出一条通往成功的道路。所以,我做了一个设备,使用非接触式液体传感器和蜂...

关键字: 传感器 Arduino 蜂鸣器

在现代电子设备中,蜂鸣器作为一种能够发出声音信号的器件,被广泛应用于各种领域,如电子玩具、报警器、电子设备的提示音等。其中,有源压电式蜂鸣器以其只需接上额定直流电压即可发声的特点,受到了工程师们的青睐。那么,有源压电式蜂...

关键字: 蜂鸣器 器件 直流电压

我有很多魔方。有些很大;有些很小;有些花费了一大笔钱。两年前,我的弟弟把我的一个立方体扔在地上,毁了它,从那以后,我花了90美元升级了安全设备,以防止这种情况再次发生。但即使他没有破坏我的立方体,他也会在我展示的时候破坏...

关键字: Arduino Uno LCD 闪光灯 蜂鸣器

蜂鸣器是一种非常常用的电子元器件,广泛用于各种电子设备中的声音输出。而三极管则是一种半导体器件,具有放大和开关等功能。通过三极管的开关状态,可以驱动蜂鸣器产生声音。

关键字: 蜂鸣器 三极管
关闭