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

FFKJ_Net
发布于 2020-11-2 15:08
浏览
3收藏

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

 

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

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

通过对蜂鸣器的研究发现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

2. \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开发套件试用笔记 目录

 

分类
标签
已于2020-11-3 11:00:43修改
3
收藏 3
回复
举报
2条回复
按时间正序
/
按时间倒序
码工许师傅
码工许师傅

unsigned short的表示范围是0到65535啊

已于2020-11-4 09:10:58修改
回复
2020-11-4 08:24:41
FFKJ_Net
FFKJ_Net 回复了 码工许师傅
unsigned short的表示范围是0到65535啊

无符号short,但是实际测试真的可以是负值,您在看一下,蜂鸣器的频率实在太高了,用它做音乐不太合适,还有办法降低频率吧,建议官方修正

回复
2020-11-5 08:15:43
回复
    相关推荐