GD - GD32350R_EVAL - PWM实验和验证1

news2024/11/13 14:57:28

文章目录

    • GD - GD32350R_EVAL - PWM实验和验证1
    • 概述
    • 笔记
    • 实验设计
    • 实验环境
    • GD32350R_EVAL 的硬件连接
    • 修改程序配置 - 只产生PWM波,不要CMP清除波形
    • TIMER0时钟设置
    • TIMER0的PWM设置参数设置
    • main()中PWM波形的开启代码
    • 示波器测量结果
    • 如果要产生4KHZ的PWM需要设置怎样的参数?
      • 尝试1 - 算一下时钟设置参数
      • 尝试1 - 产生代码,编译,验证
      • 错误分析原因
        • 可能1
        • 可能2
      • 尝试2 - 算一下PWM设置参数
      • 尝试2 - 产生代码,编译,验证
    • 总结
    • 疑问
    • @todo
    • 是否 “Clock division” 真的没用?
    • END

GD - GD32350R_EVAL - PWM实验和验证1

概述

看到 EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples 有PWM的例子工程,想迁移到工程里面用。
想通过实验,来确定设置确定频率和占空比的方波,开始PWM, 调整占空比,停止PWM 这些知识点 应该怎么编程。

笔记

实验设计

在例子工程指定的PWM输出管脚和GND之间,连接示波器探头。
设置好PWM后,用按钮来关联PWM开始/占空比的调整/PWM结束,用示波器实时的测量PWM的频率和占空比。

实验环境

GD32350R_EVAL
DS1202ZE
EmbeddedBuilder
例子工程 EmbeddedBuilder_v1.4.1.23782\examples\GD32F3x0\examples\CMP\CMP_pwm_signal_control

GD32350R_EVAL 的硬件连接

CMP_pwm_signal_control 例子工程中使用PA8作为PWM输出。
查了一下原理图,PA8只引出到了输出端子上,不和其他元件连接,正好可以连接示波器探头。
现在选一下GND和PA8的连接端子,就可以开始连接示波器探头。

GD32F3x0_Demo_Suites_V2.3.0\GD32350R_EVAL_Demo_Suites\Docs\Schematic 有原理图和板子丝印。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GND的端子用探头GND鳄鱼夹子夹住,离其他端子太近了,容易短路。
暂时用纸隔开。
问了厂家,是否探头GND端可以换成钩子配件。厂家说没有。
去x宝上找了一圈,厂家没骗人,其他家也没有卖的。
如果怕短路,又不想用纸隔开。只能先用杜邦线连上端子,再用探头GND端夹住。
最终,我用1 x 2.54 * 3P的插孔排,套在插针排上,这样用探头的GND夹子夹住就容易多了。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修改程序配置 - 只产生PWM波,不要CMP清除波形

官方例程自动停止PWM, 用的是光敏电阻,自己的实验用不到,去掉。
在这里插入图片描述

TIMER0时钟设置

在这里插入图片描述
时钟树配置后,给TIMER0的入口时钟CK_TIMER0 = 108MHZ

TIMER0的PWM设置参数设置

在这里插入图片描述

在这里插入图片描述
Prescaler Value(预分频值) = 107, 因为CK_TIMER0 = 108MHZ, 这里的值是108 MHZ / (107 + 1) = 1MHZ
也就是TIMER0分频后的实际时钟 CK_TIMER0_After_Prescaler = 1MHZ
Clock division = 1, 代表 CK_TIMER0_After_Prescaler 再分频 = CK_TIMER0_After_Prescaler_After_div = CK_TIMER0_After_Prescaler / Clock division = 1MHZ / 1 = 1MHZ

CK_TIMER0_After_Prescaler_After_div 就是最终被执行的TIMER0频率 = 1MHZ

Cunter auto reload value = 9999 代表时钟周期 = (9999 + 1) * (1 / 1MHZ)秒 = 10000 * 1 / 1000000 = 0.01秒 = 10ms
PWM的频率 = 1 / Cunter auto reload value = 1 / 0.01秒 = 100HZ

Compare value = 4999,意味着在一个PWM波周期内激活电平的占用时间 为 (4999 + 1)/ (Cunter auto reload value + 1) = 5000 / 10000 = 50%

对于一个PWM波,频率,占空比都有了,就确定了一个PWM波。

main()中PWM波形的开启代码

产生代码。
在主程序中,注释掉CMP开始的实现。
在这里插入图片描述

示波器测量结果

在这里插入图片描述
测量结果如下:

  • 垂直幅度 = 3.3V
  • 水平周期 = 10ms
  • 水平频率 = 100HZ
  • 占空比 = 50.20%

和上面代码设置的PWM周期相比,基本一致。

如果要产生4KHZ的PWM需要设置怎样的参数?

在这里插入图片描述
假设现在要驱动4KHZ的无源蜂鸣器,参考官方给的例子。尝试设置一下参数,再用示波器量一下,看看对不对?
就在官方的这个工程上将参数改一下,能产生4KHZ PWM波就行,然后在自己的工程上再重新配置。

尝试1 - 算一下时钟设置参数

为了验证"clock divsion", 将其改为2
手工先算一下,如下

Prescaler value = 107 = 108MHZ / (107 + 1) = 1MHZ
(时钟分频 clock division = 2, 试一下)div = 2 => TIMER0实际执行时钟 = 1MHZ / 2 = 500KHZ = 0.5MHZ
TIMER0实际执行时钟的周期 = 1 / (0.5MHZ * 1000000) = (1 / 500,000)s = 0.000002s = 2us 一个TIMER0时钟周期 = 2us
4KHZ的周期 = (1 / 4000)s = 0.00025s = 250 us
那么4KHZ的PWM波的时钟(TIMER0实际执行时钟的周期)个数 = 250us / 2us = 125=> 自动重装值  = (125 - 1= 124
驱动无源蜂鸣器的PWM波占空比要求是50%, 那么PWM波的比较值 = 125个 * 50% = 62.5= 63个。=> CMP比较值 = (63 - 1) = 62

按照手算的,来填写TIMER0的图形化配置参数
在这里插入图片描述

尝试1 - 产生代码,编译,验证

在这里插入图片描述
实际测量的频率和设想的大了一倍,实际周期比预想的小了一倍,占空比还可以。
看看参数哪里算错了。

错误分析原因

可能1

感觉是“Clock division”理解的不对。
从实际测量值来看,“Clock division”是对自动重装值的"细分", 有点像电机驱动芯片的细分功能一样。
虽然从TIMER0时钟看,只要数125个时钟,就能产生500KHZ的PWM波。
但是为了使自动重装值能数的数更多,可以"细分"
如果计算出的重装值为(125 - 1), “细分” = 2的话,那么自动重装值就应该在计算值的基础上x“细分值” = (125 * 2 - 1) = 250 - 1 = 249
同理,CMP值 = CMP值 x “细分值” = (63 * 2 - 1) = 126 - 1 = 125
在这里插入图片描述

可能2

可能是GD家的工具有bug, “Clock division”的值根本就没用到…
因为通过观察,不理会“Clock division”, 算出的PWM值就扩大一倍的,就是是对的。

尝试2 - 算一下PWM设置参数

在尝试一的基础上 + 错误分析原因, 手工算一下PWM参数
手工先算一下,如下

Prescaler value = 107 = 108MHZ / (107 + 1) = 1MHZ
不理会“Clock division” !!!
TIMER0实际执行时钟的周期 = (1 / 1MHZ)s = (1 / 1000,000)s = 0.000001s = 1us 一个TIMER0时钟周期 = 1us
4KHZ的周期 = (1 / 4000)s = 0.00025s = 250 us
那么4KHZ的PWM波的时钟(TIMER0实际执行时钟的周期)个数 = 250us / 1us = 250个计数 => 自动重装值  = (250 - 1= 249
驱动无源蜂鸣器的PWM波占空比要求是50%, 那么PWM波的比较值 = 250个 * 50% = 125个计数 => CMP比较值 = (125 - 1) = 124

按照手算的,来填写TIMER0的图形化配置参数
在这里插入图片描述

尝试2 - 产生代码,编译,验证

在这里插入图片描述
这回对了。
频率,占空比都ok。

总结

和时序相关的操作,如果不用示波器实际看看,心里真没底,不知道弄得对不对。
其实就是官方根据特定开发板给出的例程,如果不拿对应的官方开发板跑起来 + 用示波器实际确认一下波形,也不能肯定官方例程就是对的(只能选择信任官方的例程)。

疑问

在Pinout配置TIMER0时,时钟源是禁止的。那禁止了时钟源,CK_TIMER0的时钟源是谁?
感觉GD家的软件现在还有不少疑似bug, 不过当前版本不影响用。
使用HAL库配置寄存器时,可以比使用固件库配置的更细致。
在这里插入图片描述

@todo

使用PWM时,可以不停止PWM波,直接可以改占空比。
官方这个例子是用软件来启动PWM, 用CMP从内部连接到TIMER0的PWM通道停止寄存器。
实际用PWM时,需要自己从逻辑上启停PWM/调整PWM占空比, 应该是在另外一个定时器中操作PWM。
将EmbeddedBuilder官方HAL库例子中,所有关于PWM的例子都看完,就知道PWM操作细节的玩法了。

是否 “Clock division” 真的没用?

将实验工程拷贝了一份,将 “Clock division” 改为4,重新编译,单步状态跑起来,用示波器看,还是4KHZ/50%占空比。
比较代码,确实有区别,可以看到“Clock division”为4,原始工程 “Clock division”为2,但是效果一样。。。
这如果是没有图形化配置,谁能知道寄存器配置还能有这区别?
在这里插入图片描述
从实验结果上看,“Clock division”是没用的,1/2/4效果都一样。不影响TIMERX时钟最终的执行频率。
只有CK_TIMEX和Prescaler Value(预分频值) 会影响TIMERX时钟最终的执行频率。

END

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

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

相关文章

在centos系统中kill掉指定进程

如上图,我想kill掉 python3 func_tg_1_vps.py这个进程(而不kill掉python3 func_tg_2_vps.py)。 解决方法: 第一步:首先使用ps -ef | grep python3命令,查出所有包含python3的命令 拿其中一条讲解 root …

开放式耳机漏音有多大?开放式耳机是否值得购买?

开放式耳机确实存在漏音的问题,这是因为其设计原理决定的。开放式耳机不像封闭式耳机那样完全封闭耳道,因此声音会向外散播,导致漏音。不过,随着技术的发展,许多耳机制造商已经开始着手解决这个问题,通过改…

Git之2.0版本重要特性及用法实例(五十六)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者. 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列…

VScode 使用记录

插件 1、代码提示插件:Codeium 安装说明:Codeium:强大且免费的AI智能编程助手 - Su的技术博客 (verysu.com) 用google账号登陆,跳转按照官网给的三个步骤来 step1:复制token; step2:在文件页…

中秋佳节,南卡Runner Pro5骨传导耳机让团圆更圆满!

中秋节,这个承载着温馨与团圆的节日,是向亲朋好友表达深情厚意的绝佳时刻。在这样一个特别的日子里,挑选一份既实用又充满科技感的礼物,无疑能够给人们带来惊喜与感动。南卡Runner Pro5骨传导耳机,凭借其创新的设计和卓…

绿色消费新动力:‘众店‘模式引领数字经济下的零售创新

在数字浪潮的推动下,传统零售业正经历着前所未有的转型。绿色消费积分系统,在这一变革中崭露头角,成为新兴消费平台的佼佼者。 一、"众店"平台的快速崛起 仅用两年时间,"众店"平台就实现了巨大的飞跃&#x…

代码随想录算法训练营day58:图论08:拓扑排序精讲;dijkstra(朴素版)精讲

拓扑排序精讲 卡码网:117. 软件构建(opens new window) 题目描述: 某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依…

4_PMSM基于s函数的仿真建模_1

为了检验电机仿真模型的正确性,,以基于s函数方法搭建的数学模型为例,搭建如图的三相所示的简单三相PMSM矢量控制系统,此模型忽略了PWM逆变器的影响。另外,感兴趣的同志可以对基于Simulink方法搭建的仿真模型进行验证。…

二叉树详解(2)

文章目录 4. 二叉树链式结构的实现5. 二叉树基础oj练习 4. 二叉树链式结构的实现 首先,我们先要了解一下二叉树的遍历顺序有哪些: 通过了解二叉树的遍历顺序,我们不难看出要实现二叉树的遍历需要用到递归,而使用递归我们就要思…

基于STM32开发的智能电力监控与管理系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化电流电压数据采集与处理能耗计算与负载管理OLED显示与状态提示Wi-Fi通信与远程监控应用场景 工业设施的电力监控与优化智能家居中的电力管理与节能常见问题及解决方案 常见问题解决…

【C++ 面试 - STL】每日 3 题(二)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

Code Practice Journal | Day58_Graph08 Topological Sorting

1. 概念 在一个有向无环图(DAG)中,根据节点的依赖关系,对所有的节点进行线性排序的算法 拓扑排序的结果不一定是唯一的 2. 实现 2.1 BFS(卡恩算法) 1、步骤 2、代码实现 以KamaCoder 117.软体构建 题目:117. 软件…

Stable Diffusion绘画 | 插件-宽高比调整助手:让计算器毕业

在调整图片宽高时,如果每次都需要用计算器根据比例算好,再手工输入,非常影响效率。 推荐使用以下的插件,来实现高效准确地调整图片宽高比例。 Aspect Ratio Helper 安装地址:https://github.com/thomasasfk/sd-webui…

80、k8s概念及组件介绍

一、k8s kubernetes:k8s----希腊语,舵手,飞行员 1.1、k8s作用: ​ 用于自动部署,扩展,管理容器化部署的应用程序。开源(半开源。) ​ k8s的底层语言是由go语言。 ​ k8s理解成负责自动化运…

Jetson Orin Nano GPIO 舵机

jetson orin nano 40针引脚扩展接头: 图源 Jetson Orin Nano Developer Kit User Guide - | NVIDIA Developer 引脚配置 使用jetson-io tool配置引脚: sudo /opt/nvidia/jetson-io/jetson-io.py 选择“Configure Jetson 40pin Header”: "Confi…

啥是纳米微纤维?咋制作?有啥用?

大家好,今天我们来聊聊纳米/微纤维——《Tailoring micro/nano-fibers for biomedical applications》发表于《Bioactive Materials》。这些纤维近年来备受关注,因为它们具有独特的功能和性质,在生物医学等领域有广泛应用。它们可以通过多种技…

滴滴出行:分布式数据库的架构演进之路|OceanBase案例

本文作者:吴其朋,滴滴分布式存储运维负责人 滴滴出行,作为一个集网约车、出租车、顺风车、代驾等多种出行方式于一体的综合性出行服务平台,其用户遍布全球,总数已突破6.5亿。面对如此多样化的出行需求及庞大的用户群体…

Python优化算法18——教与学优化算法(TLBO)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

800G和1.6T以太网:创新与挑战

随着大数据、5G网络、云计算和物联网(IoT)技术的广泛应用,市场对带宽和数据传输速率的更高需求日益增长,800G和1.6T网络速率的升级备受期待。本文将从800G以太网和1.6T网络在升级方面的所做出的创新举措及其所面临的主要挑战两个方…

小柴冲刺软考中级嵌入式系统设计师系列一、计算机系统基础知识(4)计算机硬件组成及主要部件

目录 计算机系统的基本硬件组成包括 一、中央处理单元 1、CPU的功能 2、CPU的组成 运算器:是数据加工和处理的部件,是执行部件 控制器:运算器只能完成运算,而控制器用于控制整个CPU的工作,它决定了计算机的运行过…