s5pv210开发与学习:1.8之裸机蜂鸣器实验

1.电路原理图


Buzzer----------------------》PWMTOUT2----------------------》GPD0_2

上述电路通过一个NPN的三级管控制蜂鸣器的停止与鸣叫。

GPD0_2输出高电平,蜂鸣器鸣叫。

GPD0_2输出低电平,蜂鸣器停止鸣叫;

蜂鸣器的工作原理
(1)蜂鸣器里面有2个金属片,离的很紧但没挨着;没电的时候两个片在弹簧本身张力作用下分开彼此平行;有电的
时候两边分别充电,在异性电荷的吸力作用下两个片挨着;
(2)我们只要以快速的频率给蜂鸣器的正负极:供电、断电。进行这样的循环,蜂鸣器的两个弹簧片就会挨着分开
挨着分开···形成敲击,发出声音。
(3)因为人的耳朵能听见的声音频率有限制(20Hz-20000Hz),我们做实验时一般给个2KHz的频率,大部分人都
能听到(听不到的就就近医院处理)。
(4)频率高低会影响声音的音频,一般是音频越低声音听起来越低沉、音频越高听起来越尖锐。
(5)根据以上的分析,可以看出,只要用PWM波形的电压信号来驱动蜂鸣器,把PWM波形的周期T设置为要发出的声
音信号的1/频率即可;PWM的占空比只要确保能驱动蜂鸣器即可(驱动能力问题,一般引脚驱动能力都不够,所以
蜂鸣器会额外用三极管来放大流来供电)。

2.Datesheet资料查阅(GPD0_2寄存器的资料详见链接)

3.实验代码

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的S5PV210的利用定时器和蜂鸣器唱歌的程序,供参考: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #define GPD0CON (*(volatile unsigned long *)0xE02000A0) #define GPD0DAT (*(volatile unsigned long *)0xE02000A4) #define TCFG0 (*(volatile unsigned long *)0xE2500000) #define TCFG1 (*(volatile unsigned long *)0xE2500004) #define TCON (*(volatile unsigned long *)0xE2500008) #define TCNTB0 (*(volatile unsigned long *)0xE250000C) #define TCMPB0 (*(volatile unsigned long *)0xE2500010) void delay_ms(int ms) { usleep(ms * 1000); } void set_pwm(int freq, int duty) { int div = 255; int tcfg0 = 0x0; int tcfg1 = 0x0; TCON &= ~(1 << 2); TCON |= (1 << 1); TCON &= ~(1 << 1); tcfg0 = (1 << 16) | (div << 8) | 0xff; tcfg1 = (1 << 12); TCFG0 &= ~(0xff << 8); TCFG0 |= tcfg0; TCFG1 &= ~(0xf << 4); TCFG1 |= tcfg1; TCNTB0 = (1000000 / freq) - 1; TCMPB0 = (1000000 / freq * duty / 255) - 1; TCON |= (1 << 3); TCON &= ~(1 << 3); } void play_music(int *music, int len) { int i; for (i = 0; i < len; i++) { set_pwm(music[i], 128); delay_ms(200); set_pwm(0, 0); delay_ms(10); } } int main(int argc, char **argv) { int fd; volatile unsigned long *gpio; int music[] = { 523, 587, 659, 698, 784, 880, 988, 1047 }; int len = sizeof(music) / sizeof(int); int i; fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd < 0) { perror("open"); exit(1); } gpio = mmap(NULL, 0x100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)0xE0200000); if (gpio == MAP_FAILED) { perror("mmap"); exit(1); } GPD0CON &= ~(0xf << 0); GPD0CON |= (0x2 << 0); while (1) { play_music(music, len); } munmap((void *)gpio, 0x100); close(fd); return 0; } ``` 该程序使用了S5PV210的定时器和GPIO控制蜂鸣器,实现了一个简单的音乐播放器。程序中使用了set_pwm()函数来设置定时器和蜂鸣器的工作参数,使用delay_ms()函数来实现延时操作,使用play_music()函数来播放音乐。在main()函数中,不断调用play_music()函数来循环播放音乐。需要注意的是,该程序仅供参考,具体实现方式需要根据具体的硬件和应用场景进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值