【GD32】05 - PWM 脉冲宽度调制

PWM

PWM (Pulse Width Modulation) 是一种模拟信号电平的方法,它通过使用数字信号(通常是方波)来近似地表示模拟信号。在PWM中,信号的占空比(即高电平时间占整个周期的比例)被用来控制平均输出电压或电流。

PWM在许多应用中都非常重要,特别是那些需要精确控制模拟信号的应用,如电机控制、LED亮度调节、音频放大器等。以下是PWM的一些关键特点和优势:

  1. 高效能:PWM允许在开关电源中精确控制能量传输,从而提高效率。
  2. 简单实现:PWM可以通过数字电路或微控制器轻松实现。
  3. 减少功耗:在需要调节功率的应用中,PWM可以确保只有必要的能量被传输,从而减少了不必要的功耗。
  4. 降低噪声:与模拟控制相比,PWM可以减少由模拟电路引起的噪声。
  5. 精确控制:通过改变PWM信号的占空比,可以非常精确地控制输出电压或电流。

在电机控制中,PWM通常用于控制电机的速度和方向。通过改变PWM信号的占空比,可以精确地控制电机的平均电压,从而控制电机的速度和扭矩。

在LED亮度调节中,PWM也被广泛使用。通过改变PWM信号的占空比,可以控制LED的平均电流,从而控制LED的亮度。这种方法比使用模拟电阻来调节亮度更加高效和精确。

总之,PWM是一种非常有用的技术,它允许我们使用数字信号来精确控制模拟信号的电平。

以上介绍来自文心一言。

简而言之,PWM就是我们把定时器的计数器的值拿来和一个数做比较,计数器的值比较大的时候我们就输出高(低)电平,反之输出低(高)电平。

因此PWM离不开定时器,所以一写完上一篇定时器我就写了这PWM。

GD32E230中的PWM

因为我们上一篇是用的通用L4类型的定时器15,因此我们主要来看看这个类型的定时器的PWM。

我们这个类型的定时器是有PWM的,不过只有一个通道。

根据数据手册可以看到定时器15的唯一一个通道是GPIOB的8号引脚。  

知道这个之后就够了,接下来可以看看相关的固件库函数了。 

固件库函数

在固件库使用指南中,没有单独的PWM章节,是和定时器在一起的,我这边就挑我们用的到的说说。

我们可以拿上一篇定时器的代码接着用,配置定时器什么的都可以留着,把中断部分删掉就行,剩下就是配置一个PWM通道输出的就行。

timer_channel_output_config

配置定时器的通道输出,传入的参数有定时器,还有待配置通道,我们通用L4的没得选,只能用通道0,高级定时器的话是有四个通道可以用的。

最后一个参数是结构体变量的指针。

我们来看看这个结构体是怎么样的。

一共六个成员,首先第一个通道输出状态,那必然是要使能的,TIMER_CCX_ENABLE

第二个互补通道输出状态,一样给个使能,TIMER_CCXN_ENABLE

第三第四,通道输出极性和互补通道输出极性,我们都给个高电平,TIMER_OC_POLARITY_HIGHTIMER_OCN_POLARITY_HIGH。表示当输出比较生效的时候我们通道输出高电平。

第五第六个,空闲状态下通道输出,我们和上面非空闲状态来个不一样的低电平,TIMER_OC_IDLE_STATE_LOWTIMER_OCN_IDLE_STATE_LOW。表示当输出比较不生效的时候我们通道输出低电平。

具体这个输出比较的方法,我们后面会再配置。

在我们配置结构体成员之前我们需要先调用一个函数。

timer_channel_output_struct_para_init

就是这个函数,在配置之前先用这个函数进行初始化。

timer_channel_output_mode_config

设置输出比较模式。

我们主要看看模式0和模式1,一般都选模式0。

简单来说模式0是当我们计数器的值小于我们设置的值时,通道输出我们之前设置好的极性(我们上面选了高电平),反之输出空闲状态下的电平(我们上面选了低电平)。

模式1和模式0相反。

timer_primary_output_config

上面的配置完之后(记得还有之前的定时器也要先配置好),我们调用这个函数就可以使能通道输出了。

timer_channel_output_pulse_value_config

设置通道输出的比较值,要注意的是它需要和计数器的值做比较,因此它不要大于计数器的最大值(就是我们配置定时器时的周期值),否则永远都无法触发。

呼吸灯示例代码

因为我们设置的定时器周期值就是计数器达到的最大值,并且是需要和输出比较值做比较的,因此我们最好是选择10的倍数,这样好计算占空比。

#include "gd32e23x.h"
#include "systick.h"int main(void){systick_config();rcu_periph_clock_enable(RCU_TIMER15);                   //开启定时器时钟  rcu_periph_clock_enable(RCU_GPIOB);   gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_8);  gpio_output_options_set(GPIOB,GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_8);    gpio_af_set(GPIOB,GPIO_AF_2,GPIO_PIN_8);timer_parameter_struct timer_initpara;                  timer_initpara.prescaler = 72 - 1;                      //预分频timer_initpara.alignedmode = TIMER_COUNTER_EDGE;        //边缘对齐timer_initpara.counterdirection = TIMER_COUNTER_UP;     //向上计数timer_initpara.period = 1000 - 1;                       //周期    最好是10的倍数,这样好计算占空比timer_init(TIMER15,&timer_initpara);                    //初始化定时器timer_prescaler_config(TIMER15, 1, TIMER_PSC_RELOAD_NOW);//设置预分频器为立即加载模式timer_enable(TIMER15);                                  //使能定时器timer_oc_parameter_struct timer_ocinitpara;timer_channel_output_struct_para_init(&timer_ocinitpara);  //先初始化一下配置结构体timer_ocinitpara.outputstate  = TIMER_CCX_ENABLE;           //使能timer_ocinitpara.outputnstate = TIMER_CCXN_ENABLE;timer_ocinitpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;     //高电平timer_ocinitpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;timer_ocinitpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;    //低电平timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;timer_channel_output_config(TIMER15,TIMER_CH_0, &timer_ocinitpara); //配置通道输出timer_channel_output_mode_config(TIMER15, TIMER_CH_0, TIMER_OC_MODE_PWM0);// 配置定时器通道输出比较模式timer_primary_output_config(TIMER15, ENABLE);       //使能输出比较while(1){for(uint16_t i=0;i<1000;++i){timer_channel_output_pulse_value_config(TIMER15,TIMER_CH_0,i);delay_ms(1);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法

文章目录 问题描述问题原因解决办法方法一&#xff1a;在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息方法二&#xff1a;重载OnOK函数方法三&#xff1a;将所有按钮类型设为普通按钮&#xff0c;并设置其中一个按钮为默认按钮 问题描述 一般情况下编写的MFC对话框程…

HTML语义化标签

<header> 主要用于网页整体顶部&#xff0c;<article>头部&#xff0c;<section>头部 <nav> 导航&#xff0c;一般有主要导航&#xff0c;路径导航&#xff0c;章节导航&#xff0c;内容目录导航 <main> 网页主要区域&#xff0c;一般一个网页…

【运维项目经历|025】企业高效邮件系统部署与运维项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 经验教训与自我提升 展望未来 项目名称 企业高效邮件系统部署与运维项目 项目背景 随着企业…

AI之下 360让PC商业生态大象起舞

时隔7年&#xff0c;淘宝PC版在前不久迎来重磅升级&#xff0c;在产品体验、商品供给、内容供给等方面做了全面优化&#xff0c;以全面提升PC端的用户体验&#xff1b;当大家都以为移动互联网时代下APP将成为主流时&#xff0c;PC端却又成为了香饽饽。其实PC端被重视&#xff0…

3389,为了保障3389端口的安全,我们可以采取的措施

3389端口&#xff0c;作为远程桌面协议&#xff08;RDP&#xff09;的默认端口&#xff0c;广泛应用于Windows操作系统中&#xff0c;以实现远程管理和控制功能。然而&#xff0c;正因为其广泛使用&#xff0c;3389端口也成为许多潜在安全威胁的入口。因此&#xff0c;确保3389…

go 针对 time类型字段,前端查询,后端返回数据格式为UTC时间

测试代码 package mainimport ("context""log""net/http""time""github.com/gin-gonic/gin""go.mongodb.org/mongo-driver/bson""go.mongodb.org/mongo-driver/bson/primitive""go.mongodb.org/m…

鸿蒙ArkTS声明式开发:跨平台支持列表【显隐控制】 通用属性

显隐控制 控制组件是否可见。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本…

docker部署owncloud进行管理

目录 一.拉取镜像 1.使用mysql和owncloud最新版镜像&#xff0c;构建个人网盘 2.查看是否已经正确监听端口 二.使用浏览器进行测试 1.使用IP:8080进行访问&#xff0c;用admin运行容器时设置的密码登录 2.查看到已经有的文件 3.文件上传对应的位置 4.在web页面进行简单…

liunx文件系统与日志分析

文章目录 一、基本概念二、日志分析三、实验 一、基本概念 文件是存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区每个扇区大小事512字节 inode&#xff1a;元信息&#xff08;文件的属性 权限 创建者 创建日期&#xff09; block&#xff1a;块 连续八个扇区组成一块…

[RK3588-Android12] 关于BQ25703充电IC+CW2017电量计调试

问题描述 BQ25703充电ICCW2017电量计调试 解决方案&#xff1a; 附上dts配置文件 &i2c6 {clock-frequency <400000>;status "okay";// CONFIG_BATTERY_CW2017cw2017: cw201763 {status "okay";compatible "cellwise,cw2017";re…

Java操作Excel文档进行读取和写入

目录 读出Excel文档 写入Excel文档 读出Excel文档 使用EasyExcel读取Excel文件: 需要在maven项目中导入EasyExcel依赖 <!-- EasyExcel依赖包 --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><v…

长难句打卡5.31

In a workplace that’s fundamentally indifferent to your life and its meaning, office speak can help you figure out how you relate to your work—and how your work defines who you are. 在一个对你的生活和生活意义漠不关心的工作场所中&#xff0c;办公室语言可以…

揭秘蓝牙AOA定位系统:精准定位,开启智能导航新时代

随着科技的飞速发展&#xff0c;人们对于定位技术的需求也日益增长。在众多定位技术中&#xff0c;蓝牙AOA定位系统以其高精度、低通信开销的特点&#xff0c;逐渐受到广泛关注。接下来给大家简单介绍一下关于蓝牙AOA定位系统的原理、优势及应用场景&#xff0c;带大家领略其带…

情感读本期刊万方收录综合期刊投稿

《情感读本》杂志是由国家新闻出版总署批准&#xff0c;湖北省新闻出版广电局主管&#xff0c;湖北省期刊协会主办的正规综合类期刊。《情感读本》是一本以推动和发展情感教育、素质教育、人文教育为己任&#xff0c;奉行“立足教育&#xff0c;服务社会”的办刊宗旨&#xff0…

Jmeter性能测试-【关联,提取器】

新知识点 关联&#xff1a; 正则表达式提取器 边界提取器 XPath提取器 JSON提取器 梳理框架 1. Jmeter基础 定义&#xff1a;Jmeter是一个开源的性能测试工具&#xff0c;主要用于Web应用和各种服务的性能测试。 主要功能&#xff1a;可以模拟多用户并发访问&#xff0c;测…

Vue3兼容低版本浏览器(ie11,chrome63)

1、插件安装 为了使你的项目兼容 Chrome 63&#xff0c;你需要确保包含适当的 polyfills 和插件配置。你已经在使用 legacy 插件&#xff0c;但在代码中可能缺少一些配置或插件顺序有问题。以下是几个可能的改进&#xff1a; 安装 vitejs/plugin-legacy 插件&#xff1a; 确保…

(2024,Video2Game,NeRF,Mesh,物理模块,游戏引擎)通过单个视频实现实时、交互、逼真且兼容浏览器的环境

Video2Game: Real-time, Interactive, Realistic and Browser-Compatible Environment from a Single Video 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. Video…

Mysql基础教程(12):JOIN

MySQL JOIN 在 MySQL 中&#xff0c;JOIN 语句用于将数据库中的两个表或者多个表组合起来。 比如在一个学校系统中&#xff0c;有一个学生信息表和一个学生成绩表。这两个表通过学生 ID 字段关联起来。当我们要查询学生的成绩的时候&#xff0c;就需要连接两个表以查询学生信…

绿色积分合法化 时代牺牲品!云联惠

各位朋友&#xff0c;我是吴军&#xff0c;在科技产业界从事多年市场分析工作。今天&#xff0c;我想与你们共同探讨一个曾引起广泛关注的企业案例——云联惠。 云联惠&#xff0c;这个曾被誉为商业创新典范的平台&#xff0c;一度风光无限。在其鼎盛时期&#xff0c;它不仅吸引…