首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于 2.6 内核的 pwm 蜂鸣器驱动设计(3)

基于 2.6 内核的 pwm 蜂鸣器驱动设计(3)

 __raw_writel(tcnt/2, S3C2410_TCMPB(0)); //设置定时器 0 比较缓存 寄存器的值 tcon = __raw_readl(S3C2410_TCON); 的值 tcon &= ~0x1f; tcon |= 0xb; //关闭死区、自动重载、关反相器、更新 TCNTB0&TCMPB0、启动定时器 0 __raw_writel(tcon, S3C2410_TCON); 0-4 位,即对定时器 0 进行控制 tcon &= ~2; __raw_writel(tcon, S3C2410_TCON); //清除定时器 0 的手动更新位 } return 0; } //设备操作结构体 static struct file_operations pwm_fops = //设置定时器控制寄存器的 //读取定时器控制寄存器
  { .owner .open = THIS_MODULE, = pwm_open,
  .release = pwm_close, .ioctl }; //定义一个设备类 static struct class *pwm_class; static int __init pwm_init(void) { //注册为字符设备,主设备号为 0 让系统自动分配,设备名为 my2440_pwm,注册成功返回动态生成的主设备号 device_major = register_chrdev(PWM_MAJOR, PWM_NAME, &pwm_fops); if(device_major < 0) { printk(PWM_NAME " register falid!\n"); return device_major; } //注册一个设备类,使 mdev 可以在/dev/目录下自动建立设备节点 pwm_class = class_create(THIS_MODULE, PWM_NAME); if(IS_ERR(pwm_class)) { printk(PWM_NAME " register class falid!\n"); return -1; } = pwm_ioctl,
  //创建一个设备节点,设备名为 PWM_NAME,即:my2440_pwm device_create(pwm_class, NULL, MKDEV(device_major, 0), NULL, PWM_NAME); return 0; } static void __exit pwm_exit(void) { //注销设备 unregister_chrdev(device_major, PWM_NAME); //删除设备节点 device_destroy(pwm_class, MKDEV(device_major, 0)); //注销设备类 class_destroy(pwm_class); } module_init(pwm_init); module_exit(pwm_exit); MODULE_LICENSE("PGL"); MODULE_AUTHOR("Huang Gang"); MODULE_DESCRIPTION("my2440 pwm driver"); 4. 将 PWM 蜂鸣器驱动代码部署到内核中。
  tristate "My2440 PWM Beep Device" depends on ARCH_S3C2440 default y ---help---
  My2440 PWM Beep
  5.配置内核,选择 PWM 蜂鸣器设备选项 Character devices ---> <*> My2440 PWM Beep Device (NEW) 6. 编译内核并下载到开发板上。这里要注意,现在我们不需要手动的在开 发板上创建设备的节点了,因为我们现在使用了 mdev 进行管理了(使用方法请 看:设备文件系统剖析与使用),在驱动程序中也添加了对类设备接口的支持。 之前讲的一些驱动都没有,以后我们都使用这种方法。现在可以查看到/dev 目 录下自动创建好的 my2440_pwm 设备节点,就直接可以使用它了。 7. 编写 PWM 蜂鸣器驱动的测试程序。文件名:pwm_test.c ============================================== Name Author Date Copyright : pwm_test.c : Huang Gang : 25/11/2009 : GPL
  Description : my2440 pwm driver test ============================================== */ #include #include #include #include int main(int argc, char **argv) { int tmp;
  int fd; int i; //打开蜂鸣器设备 fd = open("/dev/my2440_pwm", O_RDWR); if(fd < 0) { printf("Open PWM Device Faild!\n"); exit(1); } //提示用户输入一个参数来对蜂鸣器进行调频,0 表示停止 工作 printf("please enter the times number(0 is stop):\n"); while(1) { //输入参数 scanf("%d", &tmp); printf("times = %d\n", tmp); //IO 控制 ioctl(fd, tmp); if(tmp <= 0) { break; } } //关闭设备
  close(fd); return 0; } 8. 在开发主机上交叉编译测试应用程序,并复制到文件系统的/usr/sbin 目 录下,然后重新编译文件系统下载到开发板上。 9. 在开发板上运行测试程序。可以看到根据你输入参数的大小,蜂鸣器也 会发生不同频率的叫声,输入 0 蜂鸣器停止鸣叫。
  来自: http://hi.baidu.com/shentuhongfeng/blog/item/cf7c0b36d76c22d0a2cc2b22.html
  转:基于 EasyARM2103 的交流蜂鸣器音乐播放设计 133331457 1.1 蜂鸣器简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流或者交流供电,广泛应用于计算机、打印 机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中的发声器件。 蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“LB”、“JD”等)表示。蜂鸣器的外观如 下图所示。 图 1.1 蜂鸣器 根据发声材料、 结构和驱动方式的不同, 蜂鸣器可以分为压电式、 电磁式等, 如表 1.1 所示。
  1.1.1 驱动电路分析与参数计算 根据上述的几个蜂鸣器驱动电路分析发现,蜂鸣器驱动电路无一例外都包含以下几个部分: 一个三极管、一个蜂鸣器、一个续流二极管和一个电源滤波电容。驱动电路如图 1.2 所示。
  图 1.2 蜂鸣器驱动电路 蜂鸣器驱动电路分析如下: 1.蜂鸣器 发声元件,在其两端施加直流电压(有源蜂鸣器)或者方波(无源蜂鸣器)就可以发声,其 主要参数是外形尺寸、发声方向、工作电压、工作频率、工作电流、驱动方式(直流/方波) 等。这些都可以根据需要来选择。 2.续流二极管 蜂鸣器本质上是一个感性元件,其电流不能瞬变,因此必须有一个续流二极管提供续流。否 则,在蜂鸣器两端会产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的 其它部分。 3.滤波电容 滤波电容C1 的作用是滤波, 滤除蜂鸣器电流对其它部分的影响, 也可改善电源的交流阻抗, 如果可能,最好是再并联一个 220uF 的电解电容。 4.三极管 三极管 Q1 起开关作用,其基极的高电平使三极管饱和导通,使蜂鸣器发声;而基极低电平 则使三极管关闭,蜂鸣器停止发声。 1.1.2 驱动程序设计 1. 直流蜂鸣器驱动程序 直流蜂鸣器的驱动是非常简单的, 只要在其两端施加额定工作电压, 蜂鸣器就发声。 NPN 以 三极管驱动电路为例,只要在三极管的基极接入高电平,蜂鸣器就能发声。例如:蜂鸣器每 秒钟发声 100mS 时,三极管基极的驱动波形如图 1.3 所示。
  图 1.3 NPN 管驱动直流蜂鸣器 2. 交流蜂鸣器驱动程序 交流蜂鸣器的驱动相对复杂一点, 要在蜂鸣器两端施加额定电压的方波。 蜂鸣器的工作频率 范围通常是很窄的, 这意味着一个蜂鸣器通常只能工作在其额定频率才会有良好的发声效果
  (包括声压和音色等)。有些蜂鸣器的工作频率范围是比较宽的,这样就可以通过调整驱动 方波的频率而使蜂鸣器发出音乐,演奏歌曲。例如:蜂鸣器每秒钟发声 100mS 时,三极管 基极的驱动波形如下图 1.4 所示。
  图 1.4 驱动交流蜂鸣器 1.2 设计原理 本实例采用 LPC2103 的定时器 1 产生 PWM 脉冲控制 8050 导通与闭合,使交流蜂鸣器两 端产生方波信号,驱动蜂鸣器发声。三个 LED 分别显示高、中和低音的状态。电路原理如 图 1.5 所示。
  图 1.5 原理图 1.3 电路制作 1.3.1 元器件选择
  本文电路制作中需要用到的元件如表 1.3 所列。
  表 1.3 元件列表 1.3.2 焊接 按照原理图连接电路,要注意蜂鸣器、三极管、二极管和 LED 的管脚极性。硬件电路焊接 完成后,实物如图 1.6 所示。
  图 1.6 实物图
  系统实物如图 1.7 所示。
  图 1.7 整体实物图 1.4 程序设计 本实例通过 LPC2103 的定时器 1 产生 PWM 脉冲来控制交流蜂鸣器发声。 根据不同的音频, LPC2103 产生不同频率的 PWM 脉冲, 使交流蜂鸣器发出不同频率的声音。 并通过三个 LED 分别显示高、中和低音的状态。以下为部分程序,详细程序参见程序源码。 蜂鸣器初始化程序:设置蜂鸣器控制引脚为 GPIO 输出低电平。蜂鸣器不发声。见程序清单 1.1。
  程序清单 1.1 蜂鸣器初始化程序 蜂鸣器指定频率发声程序: 根据指定频率设定定时器 1 的 PWM 的输出周期, 控制蜂鸣器发 出指定频率的声音。见程序清单 1.2。
  程序清单 1.2 蜂鸣器指定频率发声程序 蜂鸣器停止发声程序:复位定时器 1,设置蜂鸣器控制引脚为 GPIO 输出低电平,蜂鸣器停 止发声。见程序清单 1.3。
  程序清单 1.3 蜂鸣器停止发声程序 LED 初始化程序:分别设置 LED1、LED2 和 LED3 的控制引脚为 GPIO 输出,并熄灭。见 程序清单 1.4。
  程序清单 1.4 LED 初始化程序 点亮指定 LED 程序:根据入口参数点亮指定的 LED,见程序清单 1.5。
  程序清单 1.5 点亮指定 LED 程序
  熄灭指定 LED 程序:根据入口参数熄灭指定的 LED。见程序清单 1.6。
  程序清单 1.6 熄灭指定 LED 程序
返回列表