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.rhkb.cn/news/328585.html

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

相关文章

汇聚荣:拼多多长期没有流量如何提高?

在电商的海洋中&#xff0c;拼多多以其独特的团购模式吸引了众多消费者的目光。然而&#xff0c;随着市场竞争的加剧和消费者需求的多样化&#xff0c;一些商家发现自家店铺的流量持续低迷&#xff0c;销售业绩难以突破。面对这样的挑战&#xff0c;如何有效提升拼多多店铺的客…

C++基础——继承(下)

一、继承与静态成员 基类定义了static 静态成员&#xff0c;则整个继承体系里面只有一个这样的成员。无论派生出多少个子 类&#xff0c;都只有一个 static 成员实例 。 class person { public:person(const char* name "lisi"):_name(name){} public:string _name;…

ruoyi-nbcio 基于flowable规则的多重并发网关的任意跳转

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

Linux服务器lvm磁盘管理fdisk和df磁盘大小不同修改

服务器端由于硬盘是通过VCenter原来100G磁盘复制的虚拟机&#xff0c;复制完成后&#xff0c;原来100G的磁盘通过选择 磁盘重新复制出150G的磁盘&#xff0c;开机后发现还是原来的100G的磁盘&#xff0c;通过fdisk -l 查看有个sdb是150G&#xff0c; 但是已经划转的lvm盘只有10…

BUU-[GXYCTF2019]Ping Ping Ping

考察点 命令执行 题目 解题 简单测试 ?ip应该是一个提示&#xff0c;那么就测试一下?ip127.0.0.1 http://0c02a46a-5ac2-45f5-99da-3d1b0b951307.node4.buuoj.cn:81/?ip127.0.0.1发现正常回显 列出文件 那么猜测一下可能会有命令执行漏洞&#xff0c;测试?ip127.0.…

用SwitchHosts模拟本地域名解析访问

一.用SwitchHosts模拟本地域名解析访问 1.下载地址 https://download.csdn.net/download/jinhuding/89313168 2.使用截图

Linux bc命令(bc指令)(基本计算器)(任意精度计算语言:支持浮点数运算、变量赋值和自定义函数等)

文章目录 bc命令文档英文中文 Linux bc 命令详解bc 命令的基本用法启动 bc 环境进行基本计算退出 bc bc 中的数学功能执行高级数学计算平方根和指数函数对数函数 处理精度问题 变量和数组变量赋值和使用数组的使用 创建和使用自定义函数 bc 命令的高级用法在脚本中使用 bc基本脚…

后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解

JDBC 简化JDBC的开发 JDBC仅仅是一套接口 是一套规范 Mybatis是持久层框架 用于简化JDBC的开发 使用Java语言操作关系型数据库的一套API 原始的JDBC程序 package com.bigdate.mybatis;import com.bigdate.mybatis.mapper.UserMapper; import com.bigdate.mybatis.pojo.Use…

自动化运维工具——Ansible

一、Ansible的概念&#xff1a; 1.Ansible的介绍&#xff1a; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以…

英飞凌SiC模块为小米电动车提供动力

至2027年之际&#xff0c;SiC功率模块与裸片产品将荣耀登场&#xff0c;助力小米电动汽车新品SU7璀璨问世。英飞凌&#xff0c;这家业界翘楚&#xff0c;将倾其所能&#xff0c;为小米SU7 Max提供两颗HybridPACK Drive G2 CoolSiC 1200 V模块&#xff0c;如同给电动汽车的心脏注…

解决MobaXterm无法连接虚拟机问题

MobaXterm 无法连接到虚拟机可能是由于多种原因引起的。以下是一些可能的解决方法&#xff1a; 检查网络配置&#xff1a; 确保虚拟机和 MobaXterm 所在的主机在同一网络中&#xff0c;并且能够相互通信。可以尝试使用 ping 命令来测试两者之间的连通性。确保虚拟机的网络设置正…

ubuntu20.04 ROS 环境下使用速腾80线激光雷达

1.相关系统环境 系统版本:ubuntu 20.04 ROS版本&#xff1a;ROS1 - noetic 激光雷达型号&#xff1a;RoboSense Ruby &#xff08;更新于2024.5.14&#xff09; 2.网口配置&#xff1a; 将PC/工控机的网口配置为&#xff1a; ipv4&#xff0c;方式设置为手动 ip地址、掩码以…

三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…

几个排序器的verilog及其资源占用、延时分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 因为课题需要&#xff0c;调研了几个快速排序方法&#xff0c;并手写或者改进了若干待测试对象&#xff0c;包括记分板型冒泡排序&#xff08;这个是别人的&#xff09…

MFC中关于CMutex类的学习

MFC中关于CMutex类的学习 最近在项目中要实现两个线程之间的同步&#xff0c;MFC中提供了4个类&#xff0c;分别是CMutex(互斥量)、CCriticalSection(临界区)、CEvent(事件对象)、CSemaphore(信号量)。有关这4个类的说明&#xff0c;大家可以参考微软官方文档&#xff1a; CM…

Java入门基础学习笔记24——While循环和do-while循环

1、While循环&#xff1a; 例1&#xff1a; package cn.ensource.loop;public class WhileDemo3 {public static void main(String[] args) {// 目标&#xff1a;掌握while循环的书写格式&#xff0c;以及理解其执行流程// 需求&#xff1a;打印多行Hello Worldint i 0;while…

【35分钟掌握金融风控策略28】贷中模型体系策略应用

目录 贷中模型体系策略应用 信用模型体系和模型在策略中的应用 反欺诈模型体系和模型在策略中的应用 运营模型体系和模型在策略中的应用 贷中模型体系策略应用 在贷前模型部分已经讲过&#xff0c;贷前开发的很多模型是可以在贷中直接使用的。贷中与贷前的不同点在于&…

汇聚荣科技:拼多多上架商品后需要做页面推广吗?

在电商平台上&#xff0c;商品的曝光率和销量往往成正比。那么&#xff0c;当您在拼多多上架了新品&#xff0c;是不是就意味着坐等订单呢?答案显然是否定的。商品一旦上架&#xff0c;接下来需要做的就是通过有效的页面推广来增加商品的可见度&#xff0c;吸引潜在买家的注意…

基础ArkTS组件:帧动画,内置动画组件,跑马灯组件(HarmonyOS学习第三课【3.6】)

帧动画 帧动画也叫序列帧动画&#xff0c;其原理就是在时间轴的每帧上逐帧绘制不同的内容&#xff0c;使其连续播放而成动画。ArkUI开发框架提供了 ImageAnimator 组件实现帧动画能力&#xff0c;本节笔者介绍一下 ImageAnimator 组件的简单使用。 官方文献 说明 该组件从A…

分布式缓存

1.在centos中安装redis: 首先进入虚拟机&#xff0c;转到root用户 sudo su root我这报了很多错&#xff0c;安装前先执行下面的命令&#xff1a; yum install cpp yum install binutils yum install glibc yum install glibc-kernheaders yum install glibc-common yum insta…