当前位置: 首页 > news >正文

【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);}}
}

相关文章:

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

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

JVM思维导图

帮助我们快速整理和总结JVM相关知识&#xff0c;有结构化认识和整体的思维模型 JVM相关详细知识和面试题...

Ollama+OpenWebUI+Phi3本地大模型入门

文章目录 Ollama+OpenWebUI+Phi3本地大模型入门一、基础环境二、Ollama三、OpenWebUI + Phi3Ollama+OpenWebUI+Phi3本地大模型入门 完全不懂大模型的请绕道,相信我李一舟的课程比较适合 Ollama提供大模型运行环境,OpenWebUI提供UI,Phi3就是那个大模型。 当然,Ollama支持超级…...

实战15:bert 命名实体识别、地址解析、人名电话地址抽取系统-完整代码数据

直接看项目视频演示: bert 命名实体识别、关系抽取、人物抽取、地址解析、人名电话地址提取系统-完整代码数据_哔哩哔哩_bilibili 项目演示: 代码: import re from transformers import BertTokenizer, BertForTokenClassification, pipeline import os import torch im…...

js 表格添加|删除一行交互

一、需求 二、实现 <div style"margin-bottom: 55px"><form action"" method"post" enctype"multipart/form-data" id"reportForm" name"sjf" style"margin-left: 25px;margin-bottom: 50px;&quo…...

如何选择合适的服务器硬件和配置?

业务需求 了解您的业务需求和负载。这将帮助您确定需要哪种类型的服务器&#xff08;如文件服务器、数据库服务器、Web服务器等&#xff09;以及所需的处理能力、内存、存储和网络性能。...

Prometheus + Grafana + Alertmanager 系统监控

PrometheusGrafana 系统监控 1. 简介1.1 Prometheus 普罗 米修斯1.2 Grafana 2. 快速试用2.1 Prometheus 普罗 米修斯2.2 Prometheus 配置文件2.3 Grafana 2. 使用 Docker-Compose脚本部署监控服务3. Grafana 配置3.1 配置数据源 Prometheus3.2 使用模板ID 配置监控模板3.3 使用…...

5.23R语言-参数假设检验

理论 方差分析&#xff08;ANOVA, Analysis of Variance&#xff09;是统计学中用来比较多个样本均值之间差异的一种方法。它通过将总变异分解为不同来源的变异来检测因子对响应变量的影响。方差分析广泛应用于实验设计、质量控制、医学研究等领域。 方差分析的基本模型 方差…...

rnn 和lstm源码学习笔记

目录 rnn学习笔记 lstm学习笔记 rnn学习笔记 import torchdef rnn(inputs, state, params):# inputs的形状: (时间步数量, 批次大小, 词表大小)W_xh, W_hh, b_h, W_hq, b_q paramsH stateoutputs []# 遍历每个时间步for X in inputs:# 计算隐藏状态 HH torch.tanh(torch.…...

解析Java中1000个常用类:CharSequence类,你学会了吗?

在 Java 编程中,字符串操作是最常见的任务之一。为了提供一种灵活且统一的方式来处理不同类型的字符序列,Java 引入了 CharSequence 接口。 通过实现 CharSequence 接口,各种字符序列类可以提供一致的 API,增强了代码的灵活性和可扩展性。 本文将深入探讨 CharSequence 接…...

微服务远程调用之拦截器实战

微服务远程调用之拦截器实战 前言&#xff1a; 在我们开发过程中&#xff0c;很可能是项目是从0到1开发&#xff0c;或者在原有基础上做二次开发&#xff0c;这次是根据已有代码做二次开发&#xff0c;需要在我们微服务一【这里方便举例&#xff0c;我们后面叫模版微服务】调用…...

德人合科技——天锐绿盾内网安全管理软件 | -文档透明加密模块

天锐绿盾文档加密功能能够为各种模式的电子文档提供高强度加密保护&#xff0c;丰富的权限控制以及灵活的应用管理&#xff0c;帮助企业构建更严密的立体保密体系。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee ————…...

超融合架构下,虚拟机高可用机制如何构建?

作者&#xff1a;SmartX 产品部 钟锦锌 虚拟机高可用&#xff08;High Availability&#xff0c;简称 HA&#xff09;是虚拟化/超融合平台最常用、关键的功能之一&#xff0c;可在服务器发生故障时通过重建业务虚拟机以降低故障对业务带来的影响。因此&#xff0c;为了充分保障…...

工厂模式详情

一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式&#xff0c; 其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口&#xff0c;但让实现这个接口的类来决定实例…...

【Word】调整列表符号与后续文本的间距

1. 默认的列表格式&#xff1a; 2. 修改间距&#xff1a; ************************************************** 分割线 ************************************************************ 3. 效果...

匠心独运,B 端系统 UI 演绎华章之美

匠心独运&#xff0c;B 端系统 UI 演绎华章之美...

Java电商平台-开放API接口签名验证(小程序/APP)

说明&#xff1a;在实际的生鲜业务中&#xff0c;不可避免的需要对外提供api接口给外部进行调用. 这里就有一个接口安全的问题需要沟通了。下面是干货: 接口安全问题 请求身份是否合法&#xff1f; 请求参数是否被篡改&#xff1f; 请求是否唯一&#xff1f; AccessKey&am…...

Tale全局函数对象base

目录 1、 Tale全局函数对象base 1.1、 * tale alert删除 1.2、 * 成功弹框 1.3、 * 弹出成功,并在500毫秒后刷新页面 1.4、 * 警告弹框 1.5、 * 询问确认弹框,这里会传入then函数进来...

【启程Golang之旅】掌握Go语言数组基础概念与实际应用

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…...

COMSOL中液晶材料光学特性模拟

前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中&#xff0c;可以发现定义-变量中可以使用默认坐标作为变量&#xff0c;即xyz。因此&#xff0c;折射率也可…...

告别模拟信号烦恼:手把手教你用51单片机驱动DAC0832输出正弦波(附Proteus仿真)

51单片机实战&#xff1a;用DAC0832打造完美正弦波发生器 在电子设计领域&#xff0c;能够精确生成模拟信号是一项基础却至关重要的技能。想象一下&#xff0c;当你亲手搭建的电路在示波器上显示出光滑的正弦波形时&#xff0c;那种成就感是无与伦比的。本文将带你从零开始&…...

Java开发者必看:Lingbot深度模型服务端集成与高并发处理

Java开发者必看&#xff1a;Lingbot深度模型服务端集成与高并发处理 最近和几个做Java后端的朋友聊天&#xff0c;发现大家对接AI模型服务时&#xff0c;都遇到了类似的头疼事。模型本身效果不错&#xff0c;但一集成到自己的Spring Boot项目里&#xff0c;特别是流量稍微大点…...

保姆级教程:用300条数据微调SenseVoice语音模型(附数据格式详解)

300条数据高效微调SenseVoice语音模型的实战指南 去年在为一个医疗咨询项目定制语音识别系统时&#xff0c;我发现通用模型对专业医学术语的识别准确率不足60%。当时团队仅有400条标注数据&#xff0c;却通过SenseVoice的微调功能在3小时内将准确率提升至89%。本文将分享这种小…...

知识蒸馏(Knowledge Distillation, KD)详细介绍

知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;详细介绍 目录 概述基本概念知识蒸馏的核心思想蒸馏过程知识类型损失函数架构设计应用场景优化策略挑战与局限最新进展总结 概述 知识蒸馏&#xff08;Knowledge Distillation, KD&#xff09;是一种模型压缩和…...

通义千问3-4B-Instruct-2507调优技巧:提高指令遵循准确率

通义千问3-4B-Instruct-2507调优技巧&#xff1a;提高指令遵循准确率 通义千问3-4B-Instruct-2507&#xff0c;这个听起来有点长的名字&#xff0c;其实是一个特别适合我们普通开发者和爱好者玩转的AI小模型。它只有40亿参数&#xff0c;但阿里在2025年8月把它开源出来的时候&…...

VMware12虚拟机安装Mac系统全攻略:从环境配置到网络共享一站式指南

1. VMware12虚拟机安装Mac系统前的准备 在Windows环境下运行Mac系统听起来像是天方夜谭&#xff0c;但借助VMware12虚拟机&#xff0c;这件事变得出奇简单。我去年为了测试iOS应用就走过这条路&#xff0c;整个过程踩过不少坑&#xff0c;也积累了不少经验。首先需要明确的是&a…...

leetcode 1534. 统计好三元组 Count Good Triplets

Problem: 1534. 统计好三元组 Count Good Triplets 用变量存储数组中的值&#xff0c;防止多次访问IO Code class Solution { public:int countGoodTriplets(vector<int>& arr, int a, int b, int c) {int n arr.size(), a1, b1, c1, ans 0;for(int i 0; i <…...

智能媒体捕获:猫抓cat-catch的资源拦截与解析技术方案

智能媒体捕获&#xff1a;猫抓cat-catch的资源拦截与解析技术方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓cat-catch作为一款开源浏览器扩展&#xff0c;通过深度网络请求分析与流媒体协议…...

OpenClaw定时任务实践:Qwen3.5-4B-Claude实现凌晨数据备份自动化

OpenClaw定时任务实践&#xff1a;Qwen3.5-4B-Claude实现凌晨数据备份自动化 1. 为什么需要夜间自动化备份 作为一个独立开发者&#xff0c;我经常遇到这样的困境&#xff1a;白天在多个项目间切换开发&#xff0c;晚上关机前才想起忘记备份关键数据。手动执行备份不仅占用休…...

GPT-SoVITS应用场景解析:为视频配音、做有声书,简单又实用

GPT-SoVITS应用场景解析&#xff1a;为视频配音、做有声书&#xff0c;简单又实用 1. 引言&#xff1a;声音克隆技术带来的变革 想象一下&#xff0c;你正在制作一个短视频&#xff0c;需要为不同角色配音。传统方式要么自己录制&#xff08;效果可能不专业&#xff09;&…...