在线时间194 小时
UID361789
注册时间2008-4-28
NXP金币0
TA的每日心情 | 开心 2020-4-30 21:50 |
---|
签到天数: 17 天 连续签到: 1 天 [LV.4]偶尔看看III
金牌会员
 
- 积分
- 1208
- 最后登录
- 2023-2-28
|
本帖最后由 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上,为无源蜂鸣器。 电路如下图。
底板:
核心板,这次电路图对应起来了,都是P1.26.
根据BOM表查询厂家资料(调试开始没有查阅器件手册,导致PWM设置正常BUZZER不发声或声轻的问题,DATASHEET太重要了)。
这是厂家推荐驱动方式:
这是厂家推荐声响测量方块图,一直想自己做过响度计玩玩。
这是器件特性,提到了典型频率为4000HZ, 在10CM能到达70DB。其实个人一直觉得板上的蜂鸣器 不够响,跟家里冰箱忘记关门提醒差不多。
好了,下面我们来通过PWM产生4000HZ的方波驱动蜂鸣器,占空比设为50%。程序初始化PWM,然后设置周期和匹配值,最后启动PWM。
初始化函数:
- void Buzzer_Init(uint32_t cycleTime)
- {
- Chip_PWM_Init(LPC_PWM1); //初始化时钟及引脚
- Chip_PWM_PrescaleSet(LPC_PWM1, 0);//设置PRESCALER 值,通过PWM IP设置,此时不预分频
- LPC_PWM1->MCR=3; //设置匹配中断
- Chip_PWM_SetMatch(LPC_PWM1, 0, cycleTime); //设置周期
- Chip_PWM_LatchEnable(LPC_PWM1, 0, PWM_OUT_ENABLED );
- Chip_PWM_Enable(LPC_PWM1);//PWM 使能及锁存
- }
复制代码 开发选择了LPCOPEN 2.10 库,但是官方提供的文件没有添加PWM底层驱动。花了几天时间参考其他系列的片子重写了相关驱动。
下面是设置占空比, 启动BUZZER, 停止buzzer 的函数, 至此BUZZER驱动完成。
- void Buzzer_SetDutyCycle(uint32_t pwmChannel, uint32_t dutyCycle)
- {
- Chip_PWM_SetMatch(LPC_PWM1, pwmChannel, dutyCycle);
- Chip_PWM_LatchEnable(LPC_PWM1, pwmChannel, PWM_OUT_ENABLED );
- }
-
- void Buzzer_Start(uint32_t pwmChannel)
- {
- Chip_PWM_SetControlMode(LPC_PWM1, pwmChannel,PWM_SINGLE_EDGE_CONTROL_MODE, PWM_OUT_ENABLED );
-
- }
- void Buzzer_Stop(uint32_t pwmChannel)
- {
- Chip_PWM_SetControlMode(LPC_PWM1, pwmChannel,PWM_SINGLE_EDGE_CONTROL_MODE, PWM_OUT_DISABLED);
-
- }
复制代码 关于PWM 周期,决定PWM速度的是MR0寄存器, PWM模块时钟为24000000, 要得到4KHz的频率,我们这里直接设置CYCLE TIME为 6000即可. 关于DUTY CYCLE, 一直认为占空比为50%的时候响度最大,但实际人耳听下来, 并非 DUTYCYCLE 设置为 CYCLE TIME的一半最响, 测试下来duty cycle 设置为1800时效果最佳。求指点。
下面是测试代码。 至此PWM 再结合定时器就可以产生实际需要的报警形式了。
- void Buzzer_Beep_Continued(void)
- {
- Buzzer_Init(6000);
- Buzzer_Start(6);
- Buzzer_SetDutyCycle(6,1800);
-
- }
复制代码
因LPCOPEN 2.10未提供官方PWM库,附上PWM底层库供参考。
pwm_17xx_40xx.zip
(4.17 KB, 下载次数: 9)
|
|