鸿蒙HiSpark Wi-Fi IoT开发套件试用06(蜂鸣器研究)
返回>>鸿蒙HiSpark Wi-Fi IoT开发套件试用笔记 目录
今天开始不再单独试用主板了,用上底板还是很帅的
通过对蜂鸣器的研究发现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开发套件试用笔记 目录
unsigned short的表示范围是0到65535啊
无符号short,但是实际测试真的可以是负值,您在看一下,蜂鸣器的频率实在太高了,用它做音乐不太合适,还有办法降低频率吧,建议官方修正