查看: 5764|回复: 3

[原创] [IRD-LPC1768-DEV] #4 PWM BUZZER #

[复制链接]
  • TA的每日心情
    开心
    2020-4-30 21:50
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    9

    主题

    142

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1208
    最后登录
    2023-2-28
    发表于 2019-3-18 21:30:08 | 显示全部楼层 |阅读模式
    本帖最后由 yanxinboy 于 2019-3-18 21:33 编辑

    最近进度比较慢,特别是在I2C的几个器件驱动上,拖了不少的时间,好在目前都弄好了。目前正在主攻CAN USB 和 Ethernet,以及RT-THREAD的学习。好久没发帖了,今天开始把前面缺的帖子逐步补上来,欢迎指正,以提高。谢谢!

    本帖简单介绍LPC1768 PWM模块的使用,并根据IRD开发板驱动板载BUZZER. 比较简单,算是凑个帖子吧。

    PWM手册上有的,这里就不再贴出来了,器件手册永远是最好的资料。有疑问的时候,细细的重复阅读并使用代码验证,基本上什么都能够解决的。

    LPC1768的PWM作为一个单独的模块,其实也是基于定时器模块的,我们既可以拿它来产生最多六路单边沿或者三路双边沿的PWM输出,也可以是混合输出。通过对应的匹配寄存器来实现,发生匹配时,也可以产生对应的中断。另外还有捕获通道,暂时没有仔细研究。

    IRD-LPC1768-DEV板在PIEZO BUZZER接到了PWM1 的通道6上,为无源蜂鸣器。 电路如下图。

    底板:
    1.PNG
    核心板,这次电路图对应起来了,都是P1.26.
    2.PNG

    根据BOM表查询厂家资料(调试开始没有查阅器件手册,导致PWM设置正常BUZZER不发声或声轻的问题,DATASHEET太重要了)。

    这是厂家推荐驱动方式:
    3.PNG
    这是厂家推荐声响测量方块图,一直想自己做过响度计玩玩。
    4.PNG
    这是器件特性,提到了典型频率为4000HZ, 在10CM能到达70DB。其实个人一直觉得板上的蜂鸣器 不够响,跟家里冰箱忘记关门提醒差不多。
    5.PNG
    好了,下面我们来通过PWM产生4000HZ的方波驱动蜂鸣器,占空比设为50%。程序初始化PWM,然后设置周期和匹配值,最后启动PWM。

    初始化函数:
    1. void Buzzer_Init(uint32_t cycleTime)
    2. {
    3. Chip_PWM_Init(LPC_PWM1); //初始化时钟及引脚
    4.         Chip_PWM_PrescaleSet(LPC_PWM1, 0);//设置PRESCALER 值,通过PWM IP设置,此时不预分频
    5.         LPC_PWM1->MCR=3; //设置匹配中断
    6.         Chip_PWM_SetMatch(LPC_PWM1, 0, cycleTime); //设置周期
    7.         Chip_PWM_LatchEnable(LPC_PWM1, 0, PWM_OUT_ENABLED );
    8.         Chip_PWM_Enable(LPC_PWM1);//PWM 使能及锁存
    9. }
    复制代码
    开发选择了LPCOPEN 2.10 库,但是官方提供的文件没有添加PWM底层驱动。花了几天时间参考其他系列的片子重写了相关驱动。

    下面是设置占空比, 启动BUZZER, 停止buzzer 的函数, 至此BUZZER驱动完成。
    1. void Buzzer_SetDutyCycle(uint32_t pwmChannel, uint32_t dutyCycle)
    2. {
    3.         Chip_PWM_SetMatch(LPC_PWM1, pwmChannel, dutyCycle);
    4.         Chip_PWM_LatchEnable(LPC_PWM1, pwmChannel, PWM_OUT_ENABLED );

    5. }
    6.         
    7. void Buzzer_Start(uint32_t pwmChannel)
    8. {
    9.         Chip_PWM_SetControlMode(LPC_PWM1, pwmChannel,PWM_SINGLE_EDGE_CONTROL_MODE, PWM_OUT_ENABLED );
    10.         
    11. }


    12. void Buzzer_Stop(uint32_t pwmChannel)
    13. {
    14.         Chip_PWM_SetControlMode(LPC_PWM1, pwmChannel,PWM_SINGLE_EDGE_CONTROL_MODE, PWM_OUT_DISABLED);
    15.         
    16. }
    复制代码
    关于PWM 周期,决定PWM速度的是MR0寄存器, PWM模块时钟为24000000, 要得到4KHz的频率,我们这里直接设置CYCLE TIME为 6000即可.  关于DUTY CYCLE, 一直认为占空比为50%的时候响度最大,但实际人耳听下来, 并非 DUTYCYCLE 设置为 CYCLE TIME的一半最响, 测试下来duty cycle 设置为1800时效果最佳。求指点。

    下面是测试代码。 至此PWM 再结合定时器就可以产生实际需要的报警形式了。
    1. void Buzzer_Beep_Continued(void)
    2. {
    3.         Buzzer_Init(6000);
    4.         Buzzer_Start(6);
    5.         Buzzer_SetDutyCycle(6,1800);
    6.         
    7. }
    复制代码

    因LPCOPEN 2.10未提供官方PWM库,附上PWM底层库供参考。
    pwm_17xx_40xx.zip (4.17 KB, 下载次数: 9)
    回复

    使用道具 举报

  • TA的每日心情

    2 小时前
  • 签到天数: 2421 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    56

    主题

    5335

    帖子

    73

    金牌会员

    Rank: 6Rank: 6

    积分
    26057
    最后登录
    2025-9-11
    发表于 2019-3-18 23:12:40 | 显示全部楼层
    支持一波,以太网驱动可能比较麻烦,我是找不到现成的KSZ8001L的驱动,看来需要看手册自己写了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    12 小时前
  • 签到天数: 1883 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112746
    最后登录
    2025-9-10
    发表于 2019-3-19 08:11:10 | 显示全部楼层
    支持一下~~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-8-8 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4693

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10103
    最后登录
    2025-9-10
    发表于 2019-3-19 10:10:24 | 显示全部楼层
    我也是才把IIC驱动弄好了!
    bug发生在了中断内的switch语句里面case分支下少写了一个break!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-11 12:41 , Processed in 0.092215 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表