HiHope开发者社区
直播中

HiHope

4年用户 809经验值
擅长:嵌入式技术
私信 关注
[经验]

【HarmonyOS HiSpark Wi-Fi IoT套件】鸿蒙HiSpark Wi-Fi IoT开发套件试用06(蜂鸣器研究)

原文链接:https://harmonyos.51cto.com/posts/1530

今天开始不再单独试用主板了,用上底板还是很帅的

通过对蜂鸣器的研究发现Hi3861的蜂鸣器默认发声频率最低在2441.44,这个频率实在是太高了,即使通过hi_pwm_set_clock(PWM_CLK_XTAL)设置成晶体时钟频率,那么蜂鸣器发声的最低频率可以到610.36,这个频率还是太高了,感觉Hi386高频太过富于了,低频严重不足,这个不知还有其办法实现更低的频率吧?当然蜂鸣器频率作太高的要求也没有实际意义。

具体蜂鸣器研究记录下:
1. 在applicationssamplewifi-iotapp下新建文件夹“buzzer_test”,在buzzer_test文件夹下新建BUILD.gn和buzzer_test.c 两个文件,具体目录结构如下:
.
└── applications
    └── sample
        └── wifi-iot
            └── app
                │── buzzer_test
                │  │── BUILD.gn
                │  └── buzzer_test.c
                └── BUILD.gn
2. applicationssamplewifi-iotappbuzzer_test下的BUILD.gn代码如下:
  1. static_library("buzzer_test") {
  2.     sources = [
  3.         "buzzer_test.c"
  4.     ]

  5.     include_dirs = [
  6.         "//utils/native/lite/include",
  7.         "//kernel/liteos_m/components/cmsis/2.0",
  8.         "//base/iot_hardware/interfaces/kits/wifiiot_lite"
  9.     ]
  10. }


3.applicationssamplewifi-iotappbuzzer_test下的buzzer_test.c代码如下:重点看注释
  1. #include
  2. #include
  3. #include "ohos_init.h"
  4. #include "cmsis_os2.h"
  5. #include "wifiiot_gpio.h"
  6. #include "wifiiot_gpio_ex.h"
  7. #include "wifiiot_pwm.h"

  8. #include "hi_pwm.h"

  9. static void* Buzzer_Task(const char* arg)
  10. {

  11.     (void)arg;
  12.     GpioInit();

  13.     //复用引脚为 GPIO
  14.     IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);
  15.     //设置为输出
  16.     GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
  17.     PwmInit(WIFI_IOT_PWM_PORT_PWM0);

  18.     hi_pwm_set_clock(PWM_CLK_XTAL);// 设置时钟源为晶体时钟(晶体时钟40MHz,默认时钟源160MHz)


  19.     /* 说明:
  20.      *第一个数字是功率,数字越大声音越大;第二是个分频系数,实测取值范围在:-32768-65535之间,其中-32768与32768的频率一样,-1与65535的频率一样,大家可以自由选择是用负值还是正值。
  21.      *Hi3861默认时钟源160M
  22.      *根据许思维老师提供的公式:时钟源/分频系数=频率,蜂鸣器发声的最低频率为2441.44这个频率太高了
  23.      *
  24.      *可以通过hi_pwm_set_clock(PWM_CLK_XTAL); // 设置成晶体时钟频率,为40MHz
  25.      *根据公式:时钟源/分频系数=频率,蜂鸣器发声的最低频率可以到610.36,这个频率还是太高了,感觉高频富于,低频不足,这个不知还有办法实现更高的频率吧?
  26.      *当然蜂鸣器频率作太高的要求也没有实际意义。
  27.      */
  28.     while(1)
  29.     {
  30.         PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 65535); //发声频率610.36,这是3861最低的频率了
  31.         usleep(2000000);
  32.         PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 8000); //发声频率5000
  33.         usleep(2000000);
  34.         PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 7000); //发声频率5714
  35.         usleep(2000000);
  36.         PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 6000); //发声频率6666
  37.         usleep(2000000);
  38.         PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 5000); //发声频率8000 这个频率一般人就听不到了
  39.         usleep(2000000);

  40.         PwmStop(WIFI_IOT_PWM_PORT_PWM0);
  41.         usleep(1000000) ;
  42.     }
  43.     return NULL;
  44. }

  45. static void buzzer_test(void)
  46. {
  47.     osThreadAttr_t attr = {0};

  48.     attr.name = "Buzzer_Task";
  49.     attr.attr_bits = 0U;
  50.     attr.cb_mem = NULL;
  51.     attr.cb_size = 0U;
  52.     attr.stack_mem = NULL;
  53.     attr.stack_size = 1024;
  54.     attr.priority = osPriorityNormal;

  55.     if (osThreadNew((osThreadFunc_t)Buzzer_Task, NULL, &attr) == NULL)
  56.     {
  57.         printf("[buzzer_test] Falied to create Buzzer_Task!n");
  58.     }
  59. }

  60. SYS_RUN(buzzer_test);


4.不要忘修改applicationssamplewifi-iotapp下的BUILD.gn代码
  1. import("//build/lite/config/component/lite_component.gni")

  2. lite_component("app") {
  3.     features = [
  4.         "buzzer_test:buzzer_test",
  5.     ]
  6. }




更多回帖

发帖
×
20
完善资料,
赚取积分