252|2

129

帖子

2

TA的资源

一粒金砂(高级)

[工业级智能控制MCU 匠芯创D133CBS] 6 - PWM 输出 [复制链接]

本帖最后由 御坂10032号 于 2024-8-24 20:04 编辑

简介

 

PWM(Pulse Width Modulation , 脉冲宽度调制) 是一种对模拟信号电平进行数字编码的方法,通过不同频率的脉冲使用方波的占空比用来对一个具体模拟信号的电平进行编码,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替所需要波形的设备。

 

pwm-f.png

上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比如低电平。当计数值达到最大值是,计数器从0开始重新计数,又回到最初的电平状态。高电平持续时间(脉冲宽度)和周期时间的比值就是占空比,范围为0~100%。上图高电平的持续时间刚好是周期时间的一半,所以占空比为50%。

一个比较常用的pwm控制情景就是用来调节灯或者屏幕的亮度,根据占空比的不同,就可以完成亮度的调节。PWM调节亮度并不是持续发光的,而是在不停地点亮、熄灭屏幕。当亮、灭交替够快时,肉眼就会认为一直在亮。在亮、灭的过程中,灭的状态持续时间越长,屏幕给肉眼的观感就是亮度越低。亮的时间越长,灭的时间就相应减少,屏幕就会变亮。

 

 

pwm-l.png

 

上文来自 RT-Thread文档中心PWM, 同时在匠芯创AIC文档中心RTOS SDK-> 接口-> PWM 使用指南 -> PWM 配置 下也有具体的PWM使用说明(如下图所示)

 

image.png  

 

正文

 

由于匠芯创D133CBS集成了RT-Thread,所有我们可以直接使用RT-Thread的驱动框架来驱动PWM。但是在我们使用PWM之前我们最好先在匠芯创D133CBS原理图上找到PWM的输出PIN

 

image.png  

正好这个PWM1的输出PIN接了一个无源蜂鸣器。(需要提供振荡才会蜂鸣)

 

image.png  

根据上述原理图得知,我们只需要给BUZZER的这个PIN提供一个PWM信号,那么就会控制 Q2的这个三极管通断,那么就会驱动蜂鸣器进行蜂鸣。

 

配置及其编码

 

1- 首先使用menuconfig , 在board options 下打开PWM1 空格选中

 

image.png  

 

2- 如果现在什么代码都不下,在保存配置文件之后烧录这个镜像到D132CBS中之后其中PWM命令会被导出到finsh中。 其实到这里我们就可以直接使用pwm 命令来控制蜂鸣器了.

 

image.png  

 

3- 尝试使用PWM 命令控制蜂鸣器  1- 初始化PWM设备(pwm probe pwm) 2- 设置pwm 频率周期等 (pwm set 1 250000 125000)3- 启动PWM输出 (pwm enable 1

 

image.png  

如果你按照上述步骤进行操作的话,那么蜂鸣器应该会被正确的启动,并且在执行pwm disable 1的时候会被正常关闭。

 

解释

 

pwm probe 【device】的命令主要是为了初始化PWM设备。  这里的 device 可以使用 list device 命令找到

 

image.png  

 

pwm set [通道] [周期] [pulse]  的命令请参考RT-thread 关于PWM的文档, 如下图所示

 

image.png  

 

代码实现

 

下面我们来看下,如何使用代码来实现PWM的输出。

 

1- 首先包含 rtdevice的头文件

#include <rtdevice.h>

2- 定义pwm设备的名称和pwm设备的结构体

#define PWM_DEV_NAME "pwm" /* PWM设备名称 */
struct rt_device_pwm *pwm_dev;

3- 定义pwm周期和pulse时间

rt_uint32_t period, pulse;

4- 设置PWM周期,和pulse时间以及初始化pwm设备

    period = 250000; /* 周期为0.5ms,单位为纳秒ns */
    pulse = 125000;  /* PWM脉冲宽度值,单位为纳秒ns */
    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
    if (pwm_dev != RT_NULL)
    {
        rt_kprintf("Fond PWM\r\n");
    }

5- 设置PWM通道频率pulse时间等

rt_pwm_set(pwm_dev, 1, period, pulse);

6- 启动PWM

rt_pwm_enable(pwm_dev, 1);

 

完整代码如下

/*
 * Copyright (c) 2022, ArtInChip Technology Co., Ltd
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Authors: weilin.peng@artinchip.com
 */

#include <rtthread.h>
#include <rtdevice.h>
#ifdef RT_USING_ULOG
#include <ulog.h>

#endif
#define PWM_DEV_NAME "pwm" /* PWM设备名称 */
struct rt_device_pwm *pwm_dev;

rt_uint32_t period, pulse;

int main(void)
{
    period = 250000; /* 周期为0.5ms,单位为纳秒ns */
    pulse = 125000;  /* PWM脉冲宽度值,单位为纳秒ns */
    pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
    if (pwm_dev != RT_NULL)
    {
        rt_kprintf("Fond PWM\r\n");
    }
    rt_pwm_set(pwm_dev, 1, period, pulse);
    rt_pwm_enable(pwm_dev, 1);
    return 0;
}

 

将代码烧录到开发板上之后,上电的时候蜂鸣器即开始蜂鸣。同时将开发板倒过来使用万用表打到频率档即可测量出PWM的占空比和周期(可能由于万用表没电了的缘故,我刚刚测量,非常准4khz 和正好50%的占空比, 现在误差变的很大)

 

 

频率

 

54e9121570dec344b33a815495d61a5.jpg  

 

占空比

 

9cadf955386e62bf0e4228e3f71e0f6.jpg  

 

总结

 

本文主要介绍了匠芯创D133CBS如何在RTT环境下的PWM配置以及应用过程。通过上文的配置以及编码,极大的降低了用户使用PWM的难度,用户可以轻松自由配置PWM输出任意频率以及占空比等。

 

历史测评链接

 

[工业级智能控制MCU 匠芯创D133CBS] 1 - 开箱及其环境搭建 https://bbs.eeworld.com.cn/thread-1290588-1-1.html

[工业级智能控制MCU 匠芯创D133CBS] 2 - 创建项目及其注意事项 https://bbs.eeworld.com.cn/thread-1290861-1-1.html

[工业级智能控制MCU 匠芯创D133CBS] 3 - GPIO-IO中断 https://bbs.eeworld.com.cn/thread-1290902-1-1.html

[工业级智能控制MCU 匠芯创D133CBS] 4-  BUG 反馈 (SDK lunch11 包更新错误) https://bbs.eeworld.com.cn/thread-1290904-1-1.html

[工业级智能控制MCU 匠芯创D133CBS] 5- 使用RTT-软件包结合IIC读取BH1750 https://bbs.eeworld.com.cn/thread-1291002-1-1.html

最新回复

用示波器测一下 PWM 输出波形就更完美   详情 回复 发表于 2024-8-25 21:48

回复
举报

6376

帖子

0

TA的资源

五彩晶圆(高级)

用示波器测一下 PWM 输出波形就更完美

点评

可惜了啊, 我没有示波器,一直都想测量测量电源的纹波  详情 回复 发表于 2024-8-26 10:05

回复

129

帖子

2

TA的资源

一粒金砂(高级)

Jacktang 发表于 2024-8-25 21:48 用示波器测一下 PWM 输出波形就更完美

可惜了啊, 我没有示波器,一直都想测量测量电源的纹波


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表