搜索

[8/16位单片机] 【Curiosity Nano测评报告】+驱动无源蜂鸣器的尝试

[复制链接]
2844|0
 楼主 | 2020-6-27 12:09 | 显示全部楼层 |阅读模式
    厂家提供的PIC16F18446核心板范例中有一个检测敲门实例,是通过压电陶瓷片获得敲门信息然后驱动蜂鸣器发声,相应的照片如下:
send_00.jpg
    为了方便进行测试,我也参照该实例制作了一块实验模块,不同的是我将压电陶瓷片和无源蜂鸣器放在一起了:
basic_32.jpg

    下图是整个实验装置:
send_01.jpg

    通过分析范例的代码获知它的发声原理是将无源蜂鸣器接在两个引脚中,发声时先将其中一个引脚翻转,然后按设定的频率同时对两个引脚执行翻转操作,类似形成推拉作用驱动无源蜂鸣器发声。我尝试着将其移植到PIC18F47Q10核心板,代码如下:
  1. #include "snd.h"
  2. #include "mcc_generated_files/mcc.h"

  3. #define DELAY_AFTER_SND     (200)
  4. #define SND_DING_HALF_PER   (645)  //(645)
  5. #define SND_DONG_HALF_PER   (806)  //(806)
  6. #define SND_LEN_SHORT       (1800) //(300)
  7. #define SND_LEN_LONG        (1000)

  8. #define SND_ALARM_LEN1      (380)    //(38)
  9. #define SND_ALARM_LEN2      (580)    //(58)
  10. #define SND_ALARM_LEN3      (920)    //(92)
  11. #define SND_ALARM_CNT       (10)

  12. #define SND_ALARM_HALF_PER1 (400)    //(219)
  13. #define SND_ALARM_HALF_PER2 (200)    //(146)
  14. #define SND_ALARM_HALF_PER3 (90)

  15. #define SND_ALARM_DELAY     (400)    //(200)

  16. #define SND_BEEP_LEN        (10000)  //(250)
  17. #define SND_BEEP_HALF_PER   (100)
  18. #define SND_BEEP_DELAY      (100)

  19. static void SND_alarm(void);
  20. //static void SND_alarm1(void);

  21. void SND_dingDong(uint8_t knocks)
  22. {
  23.     SNDP_PIN_Toggle();
  24.     while(knocks>1)
  25.     {
  26.         for(uint16_t i=0; i<SND_LEN_SHORT; i++)
  27.         {
  28.             SNDP_PIN_Toggle();
  29.             SNDN_PIN_Toggle();
  30.             __delay_us(SND_DING_HALF_PER);
  31.         }
  32.         for(uint16_t i=0; i<SND_LEN_SHORT; i++)
  33.         {
  34.             SNDP_PIN_Toggle();
  35.             SNDN_PIN_Toggle();
  36.             __delay_us(SND_DONG_HALF_PER);
  37.         }
  38.         knocks--;
  39.     }
  40.    
  41.     for(uint16_t i=0; i<SND_LEN_SHORT; i++)
  42.     {
  43.         SNDP_PIN_Toggle();
  44.         SNDN_PIN_Toggle();
  45.         __delay_us(SND_DING_HALF_PER);
  46.     }
  47.     for(uint16_t i=0; i<SND_LEN_LONG; i++)
  48.     {
  49.         SNDP_PIN_Toggle();
  50.         SNDN_PIN_Toggle();
  51.         __delay_us(SND_DONG_HALF_PER);
  52.     }
  53.    
  54.     SNDP_PIN_SetLow();
  55.     SNDN_PIN_SetLow();
  56.    
  57.     __delay_ms(DELAY_AFTER_SND);
  58. }

  59. static void SND_alarm(void)
  60. {
  61.     SNDP_PIN_Toggle();
  62.     for(uint8_t j=0; j<SND_ALARM_CNT; j++)
  63.     {
  64.         for(uint16_t i=0; i<SND_ALARM_LEN1; i++)
  65.         {
  66.             SNDP_PIN_Toggle();
  67.             SNDN_PIN_Toggle();
  68.             __delay_us(SND_ALARM_HALF_PER1);
  69.         }

  70.         for(uint16_t i=0; i<SND_ALARM_LEN2; i++)
  71.         {
  72.             SNDP_PIN_Toggle();
  73.             SNDN_PIN_Toggle();
  74.             __delay_us(SND_ALARM_HALF_PER2);
  75.         }

  76.         for(uint16_t i=0; i<SND_ALARM_LEN3; i++)
  77.         {
  78.             SNDP_PIN_Toggle();
  79.             SNDN_PIN_Toggle();
  80.             __delay_us(SND_ALARM_HALF_PER3);
  81.         }
  82.     }
  83.    
  84.     SNDP_PIN_SetLow();
  85.     SNDN_PIN_SetLow();
  86. }

  87. /*
  88. static void SND_alarm1(void)
  89. {
  90.     uint16_t bt;
  91.     bt = 90;
  92.     SNDP_PIN_Toggle();
  93.     while(bt<1000)
  94.     {
  95.         for(uint8_t i=0; i<10; i++)
  96.         {
  97.             SNDP_PIN_Toggle();
  98.             SNDN_PIN_Toggle();
  99.             __delay_us(bt);
  100.         }
  101.         bt++;
  102.     }
  103.     while(bt>0){
  104.         for(uint8_t i=0; i<10; i++)
  105.         {
  106.             SNDP_PIN_Toggle();
  107.             SNDN_PIN_Toggle();
  108.             __delay_us(bt);
  109.             bt--;
  110.         }
  111.     }
  112.    
  113.     SNDP_PIN_SetLow();
  114.     SNDN_PIN_SetLow();
  115. }
  116. */

  117. void SND_alarmX4(void)
  118. {
  119.     for(uint8_t i=0; i<4; i++)
  120.     {
  121.         SND_alarm();
  122.         __delay_ms(SND_ALARM_DELAY);
  123.     }
  124.    
  125.     __delay_ms(DELAY_AFTER_SND);
  126. }

  127. void SND_beep(void)
  128. {
  129.     SNDP_PIN_Toggle();
  130.     for(uint16_t i=0; i<SND_BEEP_LEN; i++)
  131.     {
  132.         SNDP_PIN_Toggle();
  133.         SNDN_PIN_Toggle();
  134.         __delay_us(SND_BEEP_HALF_PER);
  135.     }
  136.     SNDP_PIN_SetLow();
  137.     SNDN_PIN_SetLow();
  138. }

  139. void SND_init(void)
  140. {
  141.     SND_beep();
  142.     __delay_ms(SND_BEEP_DELAY);
  143.     SND_beep();  
  144. }

复制代码


    经测试,虽然能够发出声音,但太单调了,实用价值不高,无法满足多数人的感受。原本准备作音乐门铃的声源,看来得舍弃这个方案,换用音乐芯片来作声源,音质要提高许多。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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