今天主要和大家聊一聊,如何使用鸿蒙系统中的脉冲宽度调制,利用微处理器的数字输出来对模拟电路进行控制的一种方法​。

第一​:pwm的基本简介

首先来了解一下,pwm的频率是什么​?

​定义:是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期),也就是说一秒钟PWM有多少个周期​。单位​:HZ​。

pwm的周期​:T=1/f      可以认为50Hz=20ms 一个周期​。

pwm的占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例。

单位: % (0%-100%)

表示方式:20%

周期: 一个脉冲信号的时间        1s内测周期次数等于频率

脉宽时间: 高电平时间

上图中 脉宽时间占总周期时间的比例,就是占空比

比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%

这就是占空比为80%的脉冲信号

而我们知道PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大

以20Hz 占空比为80% 举例 就是1秒钟之内输出了20次脉冲信号 每次的高电平时间为40ms

我们换更详细点的图

上图中,周期为T

T1为高电平时间

T2 为低电平时间

假设周期T为 1s 那么频率就是 1Hz 那么高电平时间0.5s ,低电平时间0.5s 总的占空比就是 0.5 /1 =50%

PWM原理

以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平。

假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号

我们知道,电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压

比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V

pwm的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降

也就是,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压。

pwm就是通过这种原理实现D/A转换的。

PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。

第二​:PWM对电机的控制方法

PWM对舵机的控制

舵机的控制就是通过一个固定的频率,给其不同的占空比的,来控制舵机不同的转角

舵机的频率一般为频率为50HZ,也就是一个20ms左右的时基脉冲,而脉冲的高电平部分一般为0.5ms-2.5ms范围。来控制舵机不同的转角

500-2500us的PWM高电平部分对应控制180度舵机的0-180度

以180度角度伺服为例,那么对应的控制关系是这样的:

0.5ms--------------0度;

1.0ms------------45度;

1.5ms------------90度;

2.0ms-----------135度;

2.5ms-----------180度;

​第三:鸿蒙中PWM的实现方式

    利用板子上的GPIO口模拟输出PWM来控制蜂鸣器发出声音。具体代码实现如下​所示。

#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_watchdog.h"#include "wifiiot_pwm.h"#include "hi_pwm.h"static volatile int g_buttonPressed = 0;static const uint16_t g_tuneFreqs[] = {    0, // 40M Hz 对应的分频系数:    38223, // 1046.5    34052, // 1174.7    30338, // 1318.5    28635, // 1396.9    25511, // 1568    22728, // 1760    20249, // 1975.5    51021 // 5_ 783.99 // 第一个八度的 5};// 曲谱音符static const uint8_t g_scoreNotes[] = {    // 《两只老虎》简谱:http://www.jianpu.cn/pu/33/33945.htm    1, 2, 3, 1,        1, 2, 3, 1,        3, 4, 5,  3, 4, 5,    5, 6, 5, 4, 3, 1,  5, 6, 5, 4, 3, 1,  1, 8, 1,  1, 8, 1, // 最后两个 5 应该是低八度的,链接图片中的曲谱不对,声音到最后听起来不太对劲};// 曲谱时值static const uint8_t g_scoreDurations[] = {    4, 4, 4, 4,        4, 4, 4, 4,        4, 4, 8,  4, 4, 8,    3, 1, 3, 1, 4, 4,  3, 1, 3, 1, 4, 4,  4, 4, 8,  4, 4, 8,};static void *BeeperMusicTask(const char *arg){    (void)arg;    printf("BeeperMusicTask start!\r\n");    hi_pwm_set_clock(PWM_CLK_XTAL); // 设置时钟源为晶体时钟(40MHz,默认时钟源160MHz)    for (size_t i = 0; i < sizeof(g_scoreNotes)/sizeof(g_scoreNotes[0]); i++) {        uint32_t tune = g_scoreNotes[i]; // 音符        uint16_t freqDivisor = g_tuneFreqs[tune];        uint32_t tuneInterval = g_scoreDurations[i] * (125*1000); // 音符时间        printf("%d %d %d %d\r\n", tune, (40*1000*1000) / freqDivisor, freqDivisor, tuneInterval);        PwmStart(WIFI_IOT_PWM_PORT_PWM0, freqDivisor/2, freqDivisor);        usleep(tuneInterval);        PwmStop(WIFI_IOT_PWM_PORT_PWM0);    }    return NULL;}static void StartBeepMusicTask(void){    osThreadAttr_t attr;    GpioInit();    // 蜂鸣器引脚 设置为 PWM功能    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_9, WIFI_IOT_IO_FUNC_GPIO_9_PWM0_OUT);    PwmInit(WIFI_IOT_PWM_PORT_PWM0);    WatchDogDisable();    attr.name = "BeeperMusicTask";    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)BeeperMusicTask, NULL, &attr) == NULL) {        printf("[LedExample] Falied to create BeeperMusicTask!\n");    }}SYS_RUN(StartBeepMusicTask);

行百里者半九十,接下来的配置和编译过程,如下。

​第四:效果实现

VID_20220705_210103

总结:鸿蒙系统的使用需要动手实践,在实践的过程中,发现问题并解决问题。

利用鸿蒙系统硬件实现音乐播放功能之优秀相关推荐

  1. 哪些品牌开始连接鸿蒙系统,华为鸿蒙系统硬件生态品牌升级为 HarmonyOS Connect

    在今天举行的华为鸿蒙伙伴峰会上,华为宣布鸿蒙系统硬件生态品牌升级为 HarmonyOS Connect. 华为消费者业务 AI 与智慧全场景业务部副总裁杨海松表示,去年 4 月正式开始携手合作伙伴,发 ...

  2. 利用Service实现简单的音乐播放功能

    1.本例利用Service实现简单的音乐播放功能,下面是效果图.(点击开始播放开启服务,音乐播放,点击"停止播放"关闭服务,音乐停止播放.) 2.核心代码: MusicServic ...

  3. 酷狗与鸿蒙系统,酷狗音乐鸿蒙版app

    酷狗音乐鸿蒙版app是专门为我们华为鸿蒙系统的手机用户带来全新版本的音乐播放器,酷狗音乐相信大多数的用户都不陌生,小编当年也是酷狗的忠实粉丝,hello,酷狗!这个欢迎语一开启,美好的音乐世界就向大家 ...

  4. 鸿蒙系统硬件公版,RTX 3080 Ti公版显卡实拍图曝光;魅族接入鸿蒙系统,华为格局大...

    原标题:RTX 3080 Ti公版显卡实拍图曝光:魅族接入鸿蒙系统,华为格局大 [科技犬] 外媒 VideoCardz 拿到了RTX 3080 Ti公版显卡的实拍图,显卡采用全包设计,均覆盖有金属外壳 ...

  5. 远特鸿蒙系统,远特通信获“2018年度优秀虚拟运营商”奖:“小而美”也是领军力量...

    2019 年 1 月 20日,在运营商世界网主办的 2019 年中国TMT行业"领秀榜"盛典上,远特通信斩获"2018年度优秀虚拟运营商"大奖.该奖项充分肯定了 ...

  6. 华为鸿蒙系统超级终端,华为发布鸿蒙OS Connect 打造鸿蒙硬件“超级终端”概念...

    5 月 18 日消息 在今天举行的华为鸿蒙伙伴峰会上,华为宣布鸿蒙系统硬件生态品牌升级为 HarmonyOS Connect. 华为消费者业务 AI 与智慧全场景业务部副总裁杨海松表示,去年 4 月正 ...

  7. 为什么华为在发布会不提鸿蒙,华为又要开发布会?这次没有手机,鸿蒙系统要当主角!...

    从我们的经验来看,华为每年有三个发布会最重要,一个是春季新品发布会,这个发布会通常会发布P系列旗舰手机,同时还有像平板.智能手表等产品:一个是秋季新品发布会,这个发布会主要是发布Mate系列旗舰手机, ...

  8. 智慧屏鸿蒙系统的优势,荣耀智慧屏成热点 搭载的鸿蒙系统有何优势?

    近日,搭载鸿蒙 OS 的产品荣耀智慧屏成了热点,据悉,荣耀智慧屏系列是全球首款搭载搭载华为鸿蒙操作系统的终端,鸿蒙 OS 将以荣耀智慧屏为中心构建家庭超级大终端.作为一个全新的操作系统,鸿蒙有哪些优势 ...

  9. 华为正式发布鸿蒙艾,安卓12正式发布,华为掉出首发名单,鸿蒙系统硬扛谷歌苹果...

    在昨天晚上,谷歌时隔两年又举行了全球开发的大会,并且发布了全新的安卓12系统,同时还公布了首批安卓12系统的测试版本厂商.看完了之后我们发现华为已经调出了首发名单,显得格外不同,基本已经板上钉钉地想要 ...

最新文章

  1. Nagios Web 页面声音报警
  2. js处理url中的请求参数(编码/解码)
  3. 快速学习者的高效学习策略
  4. android 补签控件,问道手游安卓12月8日维护公告 新增补签功能
  5. 操作系统之进程管理:5、处理机调度
  6. python中关于元组的基础运用
  7. java提升性能_提升java性能的基本方法
  8. 可验证随机函数(Verifiable Random Function, VRF)
  9. SQL Server2008R2中文版安装教程
  10. 软件测试自学网站有哪些?不妨一探究竟
  11. c语言发票的编码,增值税普通发票(折叠票)的发票代码有几位?
  12. 今年米粉节再推爆款 3999入手安卓影像旗舰11Ultra
  13. 我的世界服务器怎么制作头颅,我的世界怎么刷生物头颅_生物头颅制作方法_游戏城...
  14. 软件测试面试中都会问到哪些关于Python的问题?
  15. 什么是Hadoop的HA机制?
  16. 用链脉名片做图片营销,4大图片营销方式解析
  17. 计算机组成原理(3)-哈工大
  18. 代码加密 android,Android 开发怎样做代码加密或混淆
  19. HDU4751 -(广义孪生素数猜想)
  20. 从零开始学Python编程之魔法方法

热门文章

  1. 笔记dng图片在premiere和ae中不一致
  2. 想系统的学习运维有什么需要注意的?
  3. 20款漂亮免费经典国外英文复古字体
  4. win10 10586 正式版安装sql2000(笔记)
  5. Spring Cloud Stream教程(二)主要概念
  6. Unity3D 摄像机滑动跟随
  7. python dict排序_python 字典(dict)按键和值排序
  8. Ajax 应用的思考
  9. 【Pytorch】加载torchvision中预训练好的模型并修改默认下载路径(使用models.__dict__[model_name]()读取)
  10. JavaScript 数组:数组中重复的数字【思路与知识点总结与扩展】