【GD32开发】一、GD32F103 TIMER0 PWM死区时间计算

news2024/12/23 14:46:02

一、PWM死区时间如何计算?

GD32F103的数据手册关于死区时间控制的公式如上图。

DTCFG的值为 设置死区结构体的寄存器值

tDTS_CK的值为 系统时钟的时钟周期。

如:GD32F103的系统时钟是108Mhz, 则tDTS_CK = 1/108Mhz = 9.26ns。( stm32的这个值跟定时器的时钟有关,但GD32跟系统时钟有关,要注意区别) 

对于该死区时间计算对应有四种情况: 

1:3’b0xx         DTCFG[7:0] * tDTS_CK

DeadTime = DTCFG[7:0] * tDTS_CK = ( 0 ~ 127 ) * 9.26ns 

即DeadTime = 0 ~ 1176.02ns 

---------------------------------------------------------------------------------------------------------------------------------

举例:需要设置死区时间为320ns,则需要设置的死区寄存器值为 320/9.26 = 35 = 0x23 

---------------------------------------------------------------------------------------------------------------------------------

2:3’b10x         (64+ DTCFG[5:0]) * tDTS_CK *2

DeadTime =  (64+ DTCFG[5:0]) * tDTS_CK *2 = (64 + DTCFG[5:0]) * 9.26ns *2 

DeadTime = (64 +  (0~63)) * 9.26ns *2 = ( 64 ~ 127 ) *9.26ns*2

DeadTime =  1185.92ns ~ 2353.31ns

---------------------------------------------------------------------------------------------------------------------------------

举例:需要设定死区时间为2000ns, 则需要设置的死区寄存器值为:

2000ns =  (64+ x )* 9.26ns*2

x = 2000/( 9.26ns*2) - 64 

x = 44 = 0010 1100;

补齐高两位DTCFG[7:6] = 10.

则x = 1010 1100 = 0xAC

---------------------------------------------------------------------------------------------------------------------------------

3:3’b110x         (32+ DTCFG[4:0]) * tDTS_CK *8

DeadTime =   (32+ DTCFG[4:0]) * tDTS_CK *8 = (32+ DTCFG[4:0]) * 9.26ns *8 

DeadTime = (32+  (0~31)) * 9.26ns *8 = ( 32~ 63 ) *9.26ns*8

DeadTime = 2370.56ns ~ 4667.04ns

---------------------------------------------------------------------------------------------------------------------------------

举例:方法参考 情况2。 计算得出死区寄存器值,换算成二进制, 再在高位补齐110.得到完整8位二进制数,再转化成十六进制,带入程序的死区寄存器值

---------------------------------------------------------------------------------------------------------------------------------

4:3’b111x         (32+ DTCFG[4:0]) * tDTS_CK *16

DeadTime =   (32+ DTCFG[4:0]) * tDTS_CK *16 = (32+ DTCFG[4:0]) * 9.26ns *16 

DeadTime = (32+  (0~31)) * 9.26ns *16 = ( 32~ 63 ) *9.26ns*16

DeadTime = 4741.12ns ~ 9334.08ns

---------------------------------------------------------------------------------------------------------------------------------

举例:方法参考 情况2。 计算得出死区寄存器值,换算成二进制, 再在高位补齐111.得到完整8位二进制数,再转化成十六进制,带入程序的死区寄存器值

---------------------------------------------------------------------------------------------------------------------------------

              

二、TIMR0 PWM程序配置

		/* timer para init */
		timer_parameter_struct timer_initpara;
		/* timer channel output para init */
		timer_oc_parameter_struct timer_ocinitpara;
		/* timer break para init */ 
		timer_break_parameter_struct timer_breakpara;

		rcu_periph_clock_enable(RCU_TIMER0);
		timer_deinit(TIMER0);

		/* initialize TIMER init parameter struct */
		timer_struct_para_init(&timer_initpara);
		/* TIMER0 configuration */
		timer_initpara.prescaler         = 3-1;   						/* 108MHz/(2+1) = 36MHz for Timer0 			*/
		timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;   		/* aligned mode using EDGE 					*/
		timer_initpara.counterdirection  = TIMER_COUNTER_UP;     		/* Counter direction using UP 				*/
		timer_initpara.period            = 2250-1;                 		/* Period= 1/36MHz * (2249+1) =62.5us 16KHz */
		timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;			/* time divide, 1-> not divide 				*/
		timer_initpara.repetitioncounter = 0;                    		/* repetition counter 						*/
		timer_init(TIMER0, &timer_initpara);

		/* initialize TIMER channel output parameter struct */
		timer_channel_output_struct_para_init(&timer_ocinitpara);
		/* CH0/CH0N, CH1/CH1N and CH2/CH2N configuration in timing mode */
		timer_ocinitpara.outputstate     = TIMER_CCX_DISABLE;        	/* Enable output Chanalx state 				*/
		timer_ocinitpara.outputnstate    = TIMER_CCXN_DISABLE;       	/* Enable output ChanalxN state 			*/
		timer_ocinitpara.ocpolarity      = TIMER_OC_POLARITY_HIGH;   	/* Chanalx Polarity 						*/
		timer_ocinitpara.ocnpolarity     = TIMER_OCN_POLARITY_HIGH;  	/* ChanalxN Polarity 						*/
		timer_ocinitpara.ocidlestate     = TIMER_OC_IDLE_STATE_LOW;  	/* Chanalx idle state 						*/
		timer_ocinitpara.ocnidlestate    = TIMER_OCN_IDLE_STATE_LOW;  	/* ChanalxN idle state 						*/

		timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara);
		timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocinitpara);

		/* configure TIMER channel 0, duty cycle 0% */
		timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 0U);
		timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0);
		timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_ENABLE);

		/* configure TIMER channel 1, duty cycle 0% */
		timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_1, 0U);
		timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0);
		timer_channel_output_shadow_config(TIMER0, TIMER_CH_1, TIMER_OC_SHADOW_ENABLE);

		/* initialize TIMER break parameter struct */
		timer_break_struct_para_init(&timer_breakpara);
		/* automatic output enable, break, dead time and lock configuration*/
		timer_breakpara.runoffstate      = TIMER_ROS_STATE_ENABLE;
		timer_breakpara.ideloffstate     = TIMER_IOS_STATE_ENABLE;
		timer_breakpara.deadtime         = PWM_BREAK_DEAD_TIME;				/* Dead time */
		timer_breakpara.breakpolarity    = TIMER_BREAK_POLARITY_LOW;
		timer_breakpara.outputautostate  = TIMER_OUTAUTO_ENABLE;
		timer_breakpara.protectmode      = TIMER_CCHP_PROT_OFF;
		timer_breakpara.breakstate       = TIMER_BREAK_DISABLE;
		timer_break_config(TIMER0, &timer_breakpara);

		/* TIMER0 primary output function enable */
		timer_primary_output_config(TIMER0, ENABLE);
		/* auto-reload preload enable */
		timer_auto_reload_shadow_enable(TIMER0);

		timer_enable(TIMER0);

其中PWM_BREAK_DEAD_TIME 就是要设置的死区寄存器值,可以宏定义

#define PWM_BREAK_DEAD_TIME             0XACU


总结

以上就是今天要讲的内容,本文介绍了GD32F103 PWM死区时间的计算

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

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

相关文章

如何从 Android 内部存储中恢复已删除的照片?

我们使用手机录制的照片和视频通常存储在手机的内存中。我们存储它们以记住我们生活的美丽。然而,在管理这些照片的过程中,一些用户却发现自己不小心删除了这些照片,这很尴尬。 如果您的 Android 设备遇到过此类问题,那么您来对地…

SpringBoot日记本系统小白部署指南

哈喽,大家好,我是兔哥。 之前写的SpringBoot日记本系统备受好评,考虑到还是有很多小伙伴不会部署,所以这一篇文章就单独来讲一下部署步骤吧。 需要资源 idea(破不破解都行) MySQL(最好5.7以…

redis高级篇一

redis 是多线程还是单线程 redis单线程的操作 主要是指redis的网路IO和键值对的读写是由一个线程来完成的,Redis在处理客户端的请求时,包括获取(socket 读),解析,执行,内容返回(so…

linux(动静态库)

目录: 1.文件时间的概念 2.动态库和静态库 3.如何制作动静态库 -------------------------------------------------------------------------------------------------------------------------------- 1.文件时间的概念 我们现在就开始学习这三个时间分别表示了什…

AI百科:一个开启人工智能时代的综合性平台

无论是人工智能的快速发展还是AI技术在各个领域的广泛应用,都让我们对智能未来充满了期待和好奇。随着科技的进步,发现了一个好网站,一个集合了丰富AI工具和产品介绍的综合性网站—— AI百科。 在人工智能(AI)领域的快…

【实用工具 - vscode】实现Linux服务器的远程操控

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【计算机工具】 ✒️✒️本篇内容:vscode的下载安装,常见插件及详细安装方法,插件停用及卸载,vscode快捷键 …

如何将文件制作成二维码

日常生活和工作中,为了让大家更方便的查阅文件,可将文件生成二维码,打印在通知书、会议要求,或是直接用“二维码”分享。通过草料二维码可以将多种类型的文件快速生成文件二维码,微信扫码查看即可查看和下载文件。 ● …

项目风险管理的四个阶段,你了解多少?

项目风险管理是项目管理的一部分,目的是保证项目总目标的实现。 风险管理包括风险识别、风险估计、风险解决和风险监控。风险管理贯穿在项目中的每个环节,在项目的生命周期中监控风险是非常重要的手段。 风险管理包含四个阶段: 1、风险识别…

从需求分析到功能扩展:打破瓶颈,构建智能采购管理软件

在当今快速发展的商业环境下,采购管理已成为企业发展的关键环节之一。如何在采购管理中快速响应市场需求、协调供应链、提高效率和降低成本,是摆在企业面前的一个巨大挑战。因此,打破瓶颈,构建智能采购管理软件成为了迫切的需求。…

内蒙古自治区住房和城乡建设分析及解决方案

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘 要:为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划(2021—2035年)的通知》(国办发 ﹝2020﹞39号)、《国家发展改革委等部门关于进一步提升…

一文读懂如何将 Rancher 下游集群升级到 Kubernetes v1.25

介 绍 最初在 Kubernetes v1.21 中被弃用的 PodSecurityPolicy API,已经在 Kubernetes v1.25 中被完全删除。由于 API 被移除,你无法在 Kubernetes v1.25 集群中创建、编辑或查询 PodSecurityPolicy 资源。此外,由于其准入控制器已被移除&am…

JAVA-类隔离机制

一、类加载: 1、类加载:Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码加载到内存,发给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的…

Windows 上安装和启动 Nacos 2.2.2 最新版本

文章目录 前言版本声明本地启动1. 下载 Nacos2. 开启鉴权配置3. 持久化数据库4. 启动 Nacos5. 启动测试 联系我 前言 本文旨在为您详细介绍如何安装和启动 Nacos 2.2.2 的最新版本,以及为 youlai-mall 开源商城版本的升级做好准备工作。 版本声明 名称版本操作系…

企业工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈,内卷严重&#xff0c…

【IP技术】IP地址详细解释

大家知道如何查看本机的 IP 吗?这个问题,即便是没有专业学过计算机的人,只要折腾过电脑,重装过系统,大多都会知道答案:在 Windows 下是 ipconfig,在 linux 下是 ifconfig。 在 Windows 下输入 i…

Activity的onCreate方法是怎样被调用的?

Activity的onCreate方法是怎样被调用的? 按前面源码分析的介绍,在Activity的onCreate方法中,添加如下的log: android.util.Log.i("wztest", "Activity onCreate", new Exception());重新编译后,…

移动云COCA架构,重新定义下一代云

当前,算力已经成为 全球科技竞争的焦点 为此,移动云重磅发布 「移动云COCA(Compute on chip Architecture)软硬一体片上计算架构」 以下简称移动云COCA架构 以此打造国家级自主可控的 高性能算力底座 带动国产化智算产业成熟…

10款实用高效的网页版PS插件推荐!

PS是设计界适用范围广、应用次数多的基础性设计工具,PS的功能之强大,常常令新手望而却步。其实,为了对PS的功能进行补充和优化,这些年来陆续开发出了许许多多的功能性PS插件,在网页版 PS ——即时设计上有很多PS插件使…

如何利用AI学习区块链知识,ChatGPT x Kapa.ai ⇒ 开发者的福音

由OpenAI推出的人工智能聊天机器人ChatGPT在各大平台掀起了一阵狂热之风。发布仅四个月的时间,获得超一亿用户,成长速度远高于现今网络应用巨头脸书和Amazon。随着最新版本GPT-4的正式上线,其AI性能和完善程度再度提升,深受用户和…

PMP考试都是什么题?

PMP新版大纲加入了ACP敏捷管理的内容,说是敏捷混合题型占到了 50%,但是这次318的考试,敏捷题占了大半,都说敏捷和情景快要占到80%-90%。 所以有友友说开了四个小时盲盒,题目读不懂,或者觉得4个选项都不对或…