[技术问答] PWM驱动蜂鸣器

[复制链接]
1650|8
 楼主| micropoints 发表于 2019-1-1 18:07 | 显示全部楼层 |阅读模式
本帖最后由 micropoints 于 2019-1-1 18:09 编辑
  1. #define MAXPWMFREQ                                                         8000000
  2. #define MINHZ                                                                                100
  3. #define UNIT                                                                                 100
  4. #define MINUNIT                                                                        1

  5. #define PWM_CHANNEL_ENABLE                         PWM2_P05_OUTPUT_ENABLE
  6. #define PWM_CHANNEL_INVERSE                         PWM2_OUTPUT_INVERSE
  7. #define PWM_CHANNEL_H                                         PWM2H
  8. #define PWM_CHANNEL_L                                         PWM2L

  9. void beep_init(void) {
  10.         PWM_CHANNEL_ENABLE;
  11.         PWM_IMDEPENDENT_MODE;
  12.         PWM_CLOCK_DIV_2;
  13.         PWM_CHANNEL_INVERSE;
  14. }

  15. bool beep_work_freq(uint8_t freq,uint8_t duty) {
  16.         if((freq >= (MINUNIT + 1) && freq <= UNIT) && (duty >= MINUNIT && duty <= UNIT)) {
  17.                 uint16_t PwmFreq = ((MAXPWMFREQ / (freq * MINHZ)) - 1);
  18.                 uint16_t PwmDuty = (PwmFreq / UNIT) * duty;
  19.                 PWMPH = ((PwmFreq >> 8) & 0xFF);
  20.                 PWMPL = (PwmFreq & 0xFF);
  21.                 PWM_CHANNEL_H = ((PwmDuty >> 8) & 0xFF);        
  22.                 PWM_CHANNEL_L = (PwmDuty & 0xFF);        
  23.                 return true;
  24.         }
  25.         return false;
  26. }

  27. void beep_work_start(void) {
  28.         set_LOAD;
  29.         set_PWMRUN;        
  30. }

  31. void beep_work_stop(void) {
  32.         set_CLRPWM;
  33. }

  34. void beep_2K_50_work(void) {
  35.         if(PWMRUN) {
  36.                beep_work_stop();               
  37.         }
  38.         beep_work_freq(20,50);
  39.         beep_work_start();        
  40. }

  41. void beep_2K_70_work(void) {
  42.         if(PWMRUN) {
  43.                 beep_work_stop();               
  44.         }        
  45.         beep_work_freq(20,70);
  46.         beep_work_start();        
  47. }


刚刚使用新唐的003 ,写了个蜂鸣器的测试代码,跑了一下,蜂鸣器不响应,各位大大帮忙看看这个pwm的配置对不对?手头上没有示波器量不了输出频率。。
jasontu 发表于 2019-1-2 08:12 | 显示全部楼层
你的pwm gpio使能没有开吧。
如下
PWM0_P12_OUTPUT_ENABLE;
PWM2_P10_OUTPUT_DISABLE;
PWM4_P01_OUTPUT_ENABLE;
PWM5_P03_OUTPUT_ENABLE;

PWM_IMDEPENDENT_MODE;
dongnanxibei 发表于 2019-1-3 15:31 | 显示全部楼层
你示波器看看你的PWM出波了没?你还不如用定时器输出功能呢。反正都是方波
734774645 发表于 2019-1-3 20:55 | 显示全部楼层
波没出来吧
734774645 发表于 2019-1-3 20:56 | 显示全部楼层
BSP下载了吗,有PWM参考啊。
734774645 发表于 2019-1-3 20:56 | 显示全部楼层
https://www.nuvoton.com/hq/resource-download.jsp?tp_GUID=SW0720181228172729
昨天更新的
734774645 发表于 2019-1-3 20:57 | 显示全部楼层
搞错了,上面是ML51,貌似新唐出的新品,还没看到。

003的是。
https://www.nuvoton.com/hq/resource-download.jsp?tp_GUID=SW0720170213111242
木木guainv 发表于 2019-1-8 12:48 | 显示全部楼层
哇 感谢分享
yiyigirl2014 发表于 2019-1-9 12:29 | 显示全部楼层
弄好了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部