s3c2440 PWM使用之蜂鸣器驱动移植

目录

一、蜂鸣器驱动介绍

二、PWM定时器简述:

三.我们进到drivers/input/misc目录下的Kconfig文件中找到并修改注释掉

四.修改内核配置并检验效果

 五、s3c2440 PWM使用之蜂鸣器驱动移植常遇问题及处理


一、蜂鸣器驱动介绍

蜂鸣器是一种简单的声响发生器,常用于电子产品中作为警示或提醒作用。其基本原理是通过交替改变直流电的电压方向来产生声音,一般使用交替电流产生声音会比较稳定。

蜂鸣器通常分为有源和无源两种,有源的蜂鸣器需要外接驱动电路以使其发声,而无源蜂鸣器则直接由电源驱动产生声音。

蜂鸣器驱动电路一般由振荡电路、驱动电路、电源电路、滤波电路组成。其中振荡电路产生频率稳定、幅度适当的交流电压信号,驱动电路将这个信号输出到蜂鸣器上,使其产生声音。电源电路为驱动电路和振荡电路提供稳定的电源,滤波电路则消除电源噪声,提高声音质量。

在驱动蜂鸣器时,可以通过改变输出信号的频率和幅度来控制蜂鸣器发出不同的声音。常用的驱动器有单片机、集成电路、普通放大电路等,根据不同的需求和电路复杂度可以选择不同的驱动方式。

二、PWM定时器简述:

S3C2440一共有5个16位的定时器,其中定时器0、1、2、3有PWM(脉冲宽度调制)功能,它们都有一个输出引脚(如TOUTn【n为0~3】),可以通过定时器来控制引脚周期性的高、低电平变化,但是定时器4没有输出引脚。

      定时器顾名思义需要时钟去维持,那么它的时钟源为PCLK,首先通过两个8位的预分频降低频率,其中,定时器0共用第一个预分频器,定时器2、3、4共用第二个预分频器。预分频器的输出将进入第二级分频器,它们输出5种频率的时钟,2、4、8、16和TCLK0/1(外部时钟),每个定时器的工作时钟就是从这5种频率中选择得来的啦。

   8位预分频是通过TCFG0寄存器来设置的,4位分频是通过TCFG1来设置的。定时器的结构示意图如下:

 

S3c2440datesheet分布原理图如下:

    通过S3C2440原理图可知蜂鸣器接2440的GPB0/TOUT0.即我们的蜂鸣器是通过GPB0 IO口使用PWM信号驱动工作的,而且GPB0口是一个复用的IO口,要使用它得把他设置成TOUT0 PWM输出模式。

   蜂鸣器可以发声,靠的不仅仅是蜂鸣器硬件的驱动,还有linux下的PWM(脉冲宽度调制)这种变频技术,靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。通过改变频率可以使蜂鸣器发出不同的声音。

三、修改内核代码

[leiyuxing@centos6 linux-3.0]$ vim ./arch/arm/mach-s3c2440/mach-smdk2440.c

235 #include <linux/gpio.h>  //add by leiyuxing,2016.8.18
236 /* beeper add by leiyuxing 2016.8.18*/
237 static struct platform_device smdk2440_beeper_device= {
238         .name= "pwm-beeper",
239         .dev= {
240                 .parent = &s3c_device_timer[0].dev,//采用具有PWM脉冲宽度调制功能的定时器0;
241                 .platform_data = 0,
242 },      
243         .id= 0,
244 };
245 /* beeper add by leiyuxing 2016.8.18*/
246
247 static struct platform_device *smdk2440_devices[] __initdata = {
248         &s3c_device_ohci,
249         &s3c_device_lcd,
250         &s3c_device_wdt,
251         &s3c_device_i2c0,
252         &s3c_device_iis,
253         &s3c_device_dm9000,
254         &uda1340_codec,
255         &s3c24xx_uda134x,
256         &samsung_asoc_dma,  
257         &s3c_device_adc,    /* modify by leiyuxing */
258         &s3c_device_ts,    /* modify by leiyuxing */
259         &s3c_device_rtc,//add by leiyuxing
260        
261         
262         &s3c_device_timer,//add by leiyuxing,2016.8.18
263         &smdk2440_beeper_device,//add by leiyuxing,2016.8.18
264 };
 
288 static void __init smdk2440_machine_init(void)
289 {
290         s3c24xx_fb_set_platdata(&smdk2440_fb_info);
291         s3c_i2c0_set_platdata(NULL);
292         s3c24xx_ts_set_platdata(&smdk2440_ts_cfg);/*Add Touch Screen info by leiy    uxing*/
293
294  /* PWM beeper add by leiyuxing 2016.8.18*/
295         gpio_request(S3C2410_GPB(0),"beeper");//IO口使用GPB0  
296         s3c_gpio_setpull(S3C2410_GPB(0), S3C_GPIO_PULL_NONE);
297         s3c_gpio_cfgpin(S3C2410_GPB(0), S3C2410_GPB0_TOUT0);//设置为TOUT0 PWM输出模式 
298  /* PWM beeper add by leiyuxing 2016.8.18*/


三.我们进到drivers/input/misc目录下的Kconfig文件中找到并修改注释掉

[leiyuxing@centos6 linux-3.0]$ vim drivers/input/misc/Kconfig

321
322 config INPUT_PWM_BEEPER
323         tristate "PWM beeper support"
324         #depends on HAVE_PWM  //注释掉
325         help
326           Say Y here to get support for PWM based beeper devices.
327
328           If unsure, say N.
329
330           To compile this driver as a module, choose M here: the module will be
331           called pwm-beeper


四.修改内核配置并检验效果

[leiyuxing@centos6 linux-3.0]$make menuconfig

SystemType  --->
 [ * ] PWM device support

DeviceDrivers  --->
           Input device support  --->
                       [* ] Miscellaneous devices  --->
                                    < * > PWM beeper support
           - * - Pules-Width Modulation (PWM) Supprot --->
                      --- Pulse-Width Modulation (PWM) Support
                       - *-     Samsung pwmsupport

到此,蜂鸣器的简单驱动配置就已经完成了,编译后烧进内核中重启后在启动内核成功时就能听到哔的一声了,这说明蜂鸣器已经配置正确可以使用了。另外在启动的过程中,系统会输出下列语句:

 

我们也可以通过查看输入子系统的设备来进一步确认:

 

当然这是最简单的,并没有调整修改频率而发出来的声音。

参考链接:

http://blog.csdn.net/zhaocj/article/details/8843892

 五、s3c2440 PWM使用之蜂鸣器驱动移植常遇问题及处理

在s3c2440中使用PWM驱动蜂鸣器时,常遇到以下问题:

  1. PWM时钟的选择和设置:在使用PWM时需要选择合适的时钟源以及对时钟进行设置,否则可能会导致PWM输出频率不准确或不正常工作;
  2. PWM输出的占空比设置:占空比的不准确设置可能会导致蜂鸣器输出的声音不稳定或者无声;
  3. GPIO的配置:需要将GPIO配置为PWM输出模式,否则就无法将PWM信号输出到蜂鸣器上。

针对这些问题,可以采取以下措施:

  1. 在使用PWM时,需要确保时钟的选择和设置是正确的,可参考s3c2440的手册进行设置;
  2. 对于占空比的设置,需要根据具体情况进行调节,可以通过改变PWM的周期和占空比,来调整输出频率和声音大小;
  3. 在GPIO的配置时,需要设置GPIO为正确的PWM输出模式,可参考相关的代码示例或手册进行配置。

总之,要顺利使用s3c2440的PWM功能驱动蜂鸣器,需要充分理解并掌握PWM的工作原理和相关配置方法,同时也需要注意以上提到的问题及解决方法。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的雷神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值