HarmonyOS技术社区 · 2020年11月03日

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

返回\>\>鸿蒙HiSpark Wi-Fi IoT开发套件试用笔记 目录

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

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

具体蜂鸣器研究记录下:

  1. 在\applications\sample\wifi-iot\app下新建文件夹“buzzer_test”,在buzzer_test文件夹下新建BUILD.gn和buzzer_test.c 两个文件,具体目录结构如下:

.


└── applications

    └── sample

        └── wifi-iot

            └── app

                │── buzzer_test

                │  │── BUILD.gn

                │  └── buzzer_test.c 

                └── BUILD.gn
  1. \applications\sample\wifi-iot\app\buzzer_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.\applications\sample\wifi-iot\app\buzzer_test下的buzzer_test.c代码如下:重点看注释


#include <stdio.h>
#include <unistd.h>
#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.不要忘修改\applications\sample\wifi-iot\app下的BUILD.gn代码

import("//build/lite/config/component/lite_component.gni")

lite_component("app") {
    features = [
        "buzzer_test:buzzer_test",
    ]
}

返回\>\>鸿蒙HiSpark Wi-Fi IoT开发套件试用笔记 目录


作者:FFKJ_Net

想了解更多内容,请访问:
51CTO和华为官方战略合作共建的鸿蒙技术社区
https://harmonyos.51cto.com#jssq

推荐阅读
关注数
3010
内容数
446
华为鸿蒙相关技术,活动及资讯,欢迎关注及加入创作
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息