GD32F103RCT6/GD32F303RCT6(9)高级定时器互补PWM波输出实验

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发

       后续项目主要在下面该专栏中发布:

手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客

       感兴趣的点个关注收藏一下吧!

       电机驱动开发可以跳转:

手把手教你嵌入式国产化-实战项目-无刷电机驱动(1)-CSDN博客

       BMS电源系统开发可以跳转:暂未放链接

 向上代码兼容GD32F303RCT6中使用

本项目配套开发板:

基于GD32F103RCT6国产GD32平台,以下教程编写基于该开发板

图片:

a83f44e3ba7542238ec2f3c3d9002bbe.jpeg

原理图以及例程请联系客服获取!

注意:

本教程致力于解决所有在调试中出现的所有问题,如有未包含在的问题,请联系QQ:2049363803,有奖更新文档!

定时器介绍

在上一节中,我们已经完成了对高级/通用定时器输出PWM波的实验

8fd924e596df4992b0e4fbed6aba263b.png

本次实验将会研究高级定时器TIMER0的互补PWM输出

这里需要强调一下,和串口一样,GD32的定时器定义是从0为编号开始的!

在逻辑框图中,关于互补波形输出的控制是在右下角的输出逻辑中实现的

寄存器

涉及到的寄存器主要是以下几个:

常规的时钟源配置和时钟预分频器、计数模式等在上一篇文章中有介绍就不作为主要讲解,今天主要是是关于互补寄存器。

控制寄存器 1TIMERx_CTL1

主要涉及到互补波形的空闲状态电平以及通道的触发源选择和模式控制,其次就是DMA以及影子寄存器的控制这里使用不到就不做讲解;

第八位和第九位的ISO0以及ISO0N作为主要控制位。

通道控制寄存器 2TIMERx_CHCTL2

涉及到互补的主要配置:有效极性、使能状态等,该寄存器是读写寄存器,意味着我们可以随时读取以获取通道使能状态或者写入数据使得通道启用或者禁用、包括在运行过程中改变输出互补波形的极性状态。

互补PWM实验

编程要点:

1.初始化结构体

2.使能GPIO时钟

3.设置GPIO工作模式

4.使能复用时钟和定时器时钟

5.初始化定时器参数

6.配置互补通道参数

7.使能通道输出

bsp_timer.c

#include "bsp_timer.h"
#include "bsp_led.h"
#include "oled.h"//GPIO管脚配置
void gpio_config(void)
{	  rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_AF);/*Configure PA8 PA9 PA10(TIMER0 CH0 CH1 CH2) as alternate function*/gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);/*Configure PB13 PB14 PB15(TIMER0 CH0N CH1N CH2N) as alternate function*/gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14);gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);}/**@brief PWM初始化@param 无@return 无
*///定时器配置,TIM1,通道1,通道2,通道3
void timer_config(uint16_t arr,uint16_t psc)
{gpio_config();rcu_periph_clock_enable(RCU_TIMER0);timer_oc_parameter_struct timer_ocintpara;timer_oc_parameter_struct timer_ocintpara1;timer_oc_parameter_struct timer_ocintpara2;timer_parameter_struct timer_initpara;timer_deinit(TIMER0);/* TIMER0 configuration */timer_initpara.prescaler         = psc;timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;timer_initpara.counterdirection  = TIMER_COUNTER_UP;timer_initpara.period            = arr;timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;timer_initpara.repetitioncounter = 0;timer_init(TIMER0,&timer_initpara);/* CH1,CH2 and CH3 configuration in PWM mode */timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;timer_ocintpara1.outputstate  = TIMER_CCX_ENABLE;timer_ocintpara1.outputnstate = TIMER_CCXN_ENABLE;timer_ocintpara1.ocpolarity   = TIMER_OC_POLARITY_HIGH;timer_ocintpara1.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;timer_ocintpara1.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;timer_ocintpara1.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;timer_ocintpara2.outputstate  = TIMER_CCX_ENABLE;timer_ocintpara2.outputnstate = TIMER_CCXN_ENABLE;timer_ocintpara2.ocpolarity   = TIMER_OC_POLARITY_HIGH;timer_ocintpara2.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;timer_ocintpara2.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;timer_ocintpara2.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;timer_channel_output_config(TIMER0,TIMER_CH_0,&timer_ocintpara);timer_channel_output_config(TIMER0,TIMER_CH_1,&timer_ocintpara1);timer_channel_output_config(TIMER0,TIMER_CH_2,&timer_ocintpara2);timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,500);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_DISABLE);timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,500);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_DISABLE);timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_2,500);timer_channel_output_mode_config(TIMER0,TIMER_CH_2,TIMER_OC_MODE_PWM0);timer_channel_output_shadow_config(TIMER0,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE);timer_primary_output_config(TIMER0,ENABLE);/* auto-reload preload enable */timer_auto_reload_shadow_enable(TIMER0);timer_enable(TIMER0);
}//设置TIMER0通道0的占空比
//compare:比较值
void TIM_SetTIM0Compare1(uint32_t compare)
{timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, compare);
}//设置TIMER0通道0的占空比
//compare:比较值
void TIM_SetTIM0Compare2(uint32_t compare)
{timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_1, compare);
}//设置TIMER0通道0的占空比
//compare:比较值
void TIM_SetTIM0Compare3(uint32_t compare)
{timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_2, compare);
}// TIMER0更新中断服务程序
void TIMER0_UP_IRQHandler(void) {if (SET == timer_interrupt_flag_get(TIMER0, TIMER_INT_FLAG_UP)) {timer_interrupt_flag_clear(TIMER0, TIMER_INT_FLAG_UP);
//			  LED1_ON; // 点亮LED
//			  LED2_ON; // 点亮LED// 在这里添加触发中间对齐中断的处理代码}
}

我们在这里设置初始化默认占空比大小

主函数中完成初始化设置

实验结果

其中黄色通道1是PA8输出的波形,通道2是PB13输出的波形,完成实验。

拓展部分

在使用GD32驱动EG2133的过程中,需要互补的波形有效电平极性能根据我的使用情况发生改变,使得互补的PWM波与主通道相同或者反相

前文我们讲到,改变互补PWM极性是更改TIMER_CHCTL2寄存器中的CH0NP位的数据

那么我们只需要根据寄存器地址寻址,对3号位置寄存器的数据进行更改就行。

上代码:
#define TIMER0_BASE_ADDRESS 0x40012C00 // TIMER0的基地址
#define TIMER_CHCTL2_OFFSET 0x20       // TIMER_CHCTL2寄存器相对于基地址的偏移
#define TIMER0_CHCTL2       (*((volatile uint32_t*)(0x40012C00 + 0x20)))#define TIMER_CHCTL2_CH0EN_MASK (1U << 0) // CH0EN位在第0位
#define TIMER_CHCTL2_CH1EN_MASK (1U << 4) // CH1EN位在第4位
#define TIMER_CHCTL2_CH2EN_MASK (1U << 8) // CH2EN位在第8位#define TIMER_CHCTL2_CH0NP_MASK (1U << 3) // CH0EN位在第0位
#define TIMER_CHCTL2_CH1NP_MASK (1U << 7) // CH1EN位在第4位
#define TIMER_CHCTL2_CH2NP_MASK (1U << 11) // CH2EN位在第8位#define TIMER_CHCTL2_CH0NP_PC_0   TIMER0_CHCTL2 &= (~(1U<<3))
#define TIMER_CHCTL2_CH0NP_PC_1   TIMER0_CHCTL2 |= 1U<<3            //或只需要改变要操作的位数#define TIMER_CHCTL2_CH1NP_PC_0   TIMER0_CHCTL2 &= (~(1U<<7))
#define TIMER_CHCTL2_CH1NP_PC_1   TIMER0_CHCTL2 |= 1U<<7       #define TIMER_CHCTL2_CH2NP_PC_0   TIMER0_CHCTL2 &= (~(1U<<11))
#define TIMER_CHCTL2_CH2NP_PC_1   TIMER0_CHCTL2 |= 1U<<11 

想找到一个寄存器的位置,首先需要知道定时器0的总地址,然后其中每个地址对于该地址的偏移就能完成偏移寻址。

主函数代码

在mian中调用:TIMER_CHCTL2_CH0NP_PC_1;    使得由反相变成同向

示波器结果:

再次调用反相函数使得其更改为反相

完成本次实验!!

创作不易,点个赞收藏一下吧,求求了。比个爱心

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

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

相关文章

在线教育系统在线网校报价,培训机构是怎样招聘老师的?流程是什么?

招生是培训机构的一大难题&#xff0c;但招不来老师&#xff0c;招不到好老师却也是培训机构面临的一个更为严峻的问题&#xff0c;没有老师&#xff0c;教学工作就展不开&#xff0c;没有老师&#xff0c;学生就留不住。培训学校的人员招聘不要等缺失时才去招聘&#xff0c;要…

【设计模式】之观察者模式

系列文章目录 【设计模式】之装饰器模式【设计模式】之工厂模式&#xff08;三种&#xff09;【设计模式】之工厂模式&#xff08;三种&#xff09; 前言 今天给大家介绍另一种设计模式--观察者模式&#xff0c;有了解webscoket实现原理的小伙伴应该对这个设计模式不陌生。不清…

微服务核心01-Maven【项目管理工具】基础

一、Maven 简介 1.1 传统项目管理&#xff1a; 1.2 Maven 的作用 项目构建&#xff1a;提供标准的、跨平台的自动化项目构建方式。依赖管理&#xff1a;管理项目依赖的资源&#xff08;jar 包&#xff09;&#xff0c;避免资源间的版本冲突问题统一开发结构&#xff1a;提供标…

web前端笔记8

8. Less的使用 Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。Less 是一门CSS预处理语言,它扩充了CSS语言,增加了诸如变量、混合(mixin)、函数等功能,让CSS更易维护、方便制作主题、扩充。Less可以运行在Node.js或浏览器端。LESS由Alexis Sellier于…

Web LLM 攻击实验:利用 LLM API 实现 SQL 注入

前言 Web LLM 攻击 各组织都在急于集成大型语言模型 (LLM)&#xff0c;以改善其在线客户体验。这使他们面临 Web LLM 攻击&#xff0c;这些攻击利用模型对攻击者无法直接访问的数据、API 或用户信息的访问权限。例如&#xff0c;攻击可能&#xff1a; 检索 LLM 有权访问的数…

【valse 2024】会议内容汇总(持续更新)

系列文章目录 提示&#xff1a;更新中&#xff0c;一周左右更新完毕。需要具体课件的可私信 文章目录 系列文章目录开幕式主旨报告-1:大模型时代的机遇和挑战主旨报告-2:以深度学习框架为牵引促进自主 AI生态发展主旨报告-3:从洞穴的影子到智能的光辉--连接和交互方式的改变塑造…

el-table-column表格匹配字典数据

根据字典值匹配 列的值 优点就是可维护性强 改完字典就会生效 如果写死需求变更难以维护 <el-table v-loading"loading" :data"processList" selection-change"handleSelectionChange"><el-table-column type"selection" wid…

别出心裁的自动化网页数据采集:Chrome插件和mitmproxy

别出心裁的自动化网页数据采集&#xff1a;Chrome插件和mitmproxy 前言 在信息时代&#xff0c;数据已成为决策的关键。传统的数据采集方法往往依赖于手动操作或简单的自动化脚本&#xff0c;这限制了数据的时效性和精确性。为了克服这些限制&#xff0c;本文介绍了一种结合C…

文件批量移动:按路径名称指引,高效文件管理与批量归类实战

在数字化时代&#xff0c;文件批量移动成为了一项至关重要的技能&#xff0c;它能够帮助我们高效地管理和归类大量的文件。通过按路径名称指引进行文件批量移动&#xff0c;我们可以使文件组织更加有序&#xff0c;提高文件检索的速度&#xff0c;从而提升工作效率。 一、明确路…

Linux: 高CPU使用率的一种情况:内存不够用

文章目录 问题swapd的作用原因是问题 有一台jenkins服务器,在安装完成之后,一开始ssh访问还可以,后续再访问,就出现严重的变慢现象。 从下面的的top命令,可以看到,CPU的使用率几乎全被system使用,而idle的就是0。 从列表里看,kswapd0占用的最多,达到了47.5%。而且可以…

多线程学习Day09

10.Tomcat线程池 LimitLatch 用来限流&#xff0c;可以控制最大连接个数&#xff0c;类似 J.U.C 中的 Semaphore 后面再讲 Acceptor 只负责【接收新的 socket 连接】 Poller 只负责监听 socket channel 是否有【可读的 I/O 事件】 一旦可读&#xff0c;封装一个任务对象&#x…

【建议收藏】CSP-J/S信奥赛,小白报名教程!

✅ 信奥介绍 信息学奥赛是五大学科&#xff08;数学、物理、化学、生物、信息学&#xff09;奥林匹克竞赛中唯一一个可以贯穿小学、初中、高中的特长生项目。由中国计算机学会主办&#xff0c;主要考察信息学&#xff0c;即编程的相关知识和能力。 ✅ 报名流程 &#x1f449;登…

智能绘画系统源码系统 后台自由设置会员套餐 带网站的安装包以及安装部署教程

在当今数字化与智能化快速发展的时代&#xff0c;艺术与技术正以前所未有的速度相互融合。为了满足广大绘画爱好者和专业艺术家的需求&#xff0c;我们精心打造了一款智能绘画系统源码系统。该系统不仅具备高度的智能化特性&#xff0c;还提供了丰富的后台管理功能&#xff0c;…

JS中递归是什么原理

JavaScript中的递归&#xff08;Recursion&#xff09;是一种编程技巧&#xff0c;它允许函数直接或间接地调用自身。递归函数在解决一些问题时特别有用&#xff0c;特别是那些可以分解为更小、相似子问题的问题。递归的基本原理包括两个关键部分&#xff1a; 1&#xff0c;基…

CTF-密码学基础

概述 密码学(Cryptolopy)&#xff1a;是研究信息系统安全保密的科学 密码学研究的两个方向&#xff1a; 密码编码学(Cryptography)&#xff1a;主要研究对信息进行编码&#xff0c;实现对信息的隐蔽密码分析学(Cryptanalytics)&#xff1a;主要研究加密信息的破译或消息的伪造…

多客陪玩系统源码APP小程序H5陪玩开发伴游源码游戏陪玩平台源码陪玩平台开发约单源码线下陪玩接单平台app小程序H5源码游戏陪玩app小程序H5开发

出售成品陪玩app小程序H5源码&#xff0c;免费搭建部署和售后服务&#xff0c;并提供源码二开、定制开发等相关服务。 一、陪玩app源码的功能介绍 1、语音聊天: 陪玩app小程序H5源码用户随时创建语音聊天室&#xff0c;实现多用户上麦功能&#xff0c;提高互动聊天体验。 2、游…

【Qt 开发基础体系】字符串类应用和常用的数据类型

文章目录 1. Qt 字符串类应用1.1 操作字符串1.2 QString::append()函数1.3 QString::sprintf()函数1.4 QString::arg()函数 2. 查询字符串2.1 函数 QString::startsWith()2.2 函数 QString::contains()2.3 函数 QString::toInt()2.4 函数 QString::compare()2.5 将 QString 转换…

攻克《模版进阶》 全方位了解

目录 前言&#xff1a; 非类型模板参数 按需实例化 模板的特化 概念&#xff1a; 函数模板特化&#xff1a; 类模板特化&#xff1a; 1、全特化 2、偏特化 3、类模板特化应用示例 模板分离编译 什么是分离编译 模板的分离编译 解决方法 总结 前言&#xff1a; 我…

PostgreSQL和openGauss优化器对一个关联查询的SQL优化改写

PostgreSQL和openGauss数据库优化器在merge join关联查询的SQL优化改写 PostgreSQL 查询计划openGauss 查询计划拓展对比 看腻了文章就来听听视频讲解吧&#xff1a;https://www.bilibili.com/video/BV1oH4y137P7/ 数据库类型数据库版本PostgreSQL16.2openGauss6.0 创建测试表…

Python语言基础与由来介绍【自我维护版】

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 本篇博客是在已有的博客的基础上进行的维护。 主要…