原文链接:
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代码如下:
- static_library("buzzer_test") {
- sources = [
- "buzzer_test.c"
- ]
- include_dirs = [
- "//utils/native/lite/include",
- "//kernel/liteos_m/components/cmsis/2.0",
- "//base/iot_hardware/interfaces/kits/wifiiot_lite"
- ]
- }
3.applicationssamplewifi-iotappbuzzer_test下的buzzer_test.c代码如下:重点看注释
- #include
- #include
- #include "ohos_init.h"
- #include "cmsis_os2.h"
- #include "wifiiot_gpio.h"
- #include "wifiiot_gpio_ex.h"
- #include "wifiiot_pwm.h"
- #include "hi_pwm.h"
- static void* Buzzer_Task(const char* arg)
- {
- (void)arg;
- GpioInit();
- //复用引脚为 GPIO
- IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);
- //设置为输出
- GpioSetDir(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_GPIO_DIR_OUT);
- PwmInit(WIFI_IOT_PWM_PORT_PWM0);
- hi_pwm_set_clock(PWM_CLK_XTAL);// 设置时钟源为晶体时钟(晶体时钟40MHz,默认时钟源160MHz)
- /* 说明:
- *第一个数字是功率,数字越大声音越大;第二是个分频系数,实测取值范围在:-32768-65535之间,其中-32768与32768的频率一样,-1与65535的频率一样,大家可以自由选择是用负值还是正值。
- *Hi3861默认时钟源160M
- *根据许思维老师提供的公式:时钟源/分频系数=频率,蜂鸣器发声的最低频率为2441.44这个频率太高了
- *
- *可以通过hi_pwm_set_clock(PWM_CLK_XTAL); // 设置成晶体时钟频率,为40MHz
- *根据公式:时钟源/分频系数=频率,蜂鸣器发声的最低频率可以到610.36,这个频率还是太高了,感觉高频富于,低频不足,这个不知还有办法实现更高的频率吧?
- *当然蜂鸣器频率作太高的要求也没有实际意义。
- */
- while(1)
- {
- PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 65535); //发声频率610.36,这是3861最低的频率了
- usleep(2000000);
- PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 8000); //发声频率5000
- usleep(2000000);
- PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 7000); //发声频率5714
- usleep(2000000);
- PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 6000); //发声频率6666
- usleep(2000000);
- PwmStart(WIFI_IOT_PWM_PORT_PWM0, 5 * 1000, 5000); //发声频率8000 这个频率一般人就听不到了
- usleep(2000000);
- PwmStop(WIFI_IOT_PWM_PORT_PWM0);
- usleep(1000000) ;
- }
- return NULL;
- }
- static void buzzer_test(void)
- {
- osThreadAttr_t attr = {0};
- attr.name = "Buzzer_Task";
- attr.attr_bits = 0U;
- attr.cb_mem = NULL;
- attr.cb_size = 0U;
- attr.stack_mem = NULL;
- attr.stack_size = 1024;
- attr.priority = osPriorityNormal;
- if (osThreadNew((osThreadFunc_t)Buzzer_Task, NULL, &attr) == NULL)
- {
- printf("[buzzer_test] Falied to create Buzzer_Task!n");
- }
- }
- SYS_RUN(buzzer_test);
4.不要忘修改applicationssamplewifi-iotapp下的BUILD.gn代码
- import("//build/lite/config/component/lite_component.gni")
- lite_component("app") {
- features = [
- "buzzer_test:buzzer_test",
- ]
- }