stm32 PWM互补输出

stm32高级定时器例子—stm32 PWM互补输出

定时器初始化结构体

TIM_TimeBaseInitTypeDef

时基结构体,用于定时器基础参数设置,与TIM_TimeBaseInit函数配合使用,完成配置。

typedef struct
{ TIM_Prescaler       /*定时器预分频器设置,时钟源经该预分频器才是定时器计                         数时钟CK_CNT,它设定PSC寄存器的值。计数器时钟频率 (fCK_CNT) 等于fCK_PSC/(PSC[15:0]+1),可实现1至65536分频。*/ TIM_CounterMode        /*定时器计数方式,可设置为向上计数、向下计数、中心对齐*/	TIM_Period             /*定时器周期,设定自动重载寄存器ARR的值可设置范围为0至65535*/   TIM_ClockDivision      /*时钟分频,设置定时器时钟CK_INT频率与死区发生器以及数字滤波器采样时钟频率分频比。可以选择 1、2、4 分频。*/    TIM_RepetitionCounter  /*重复计数器,只有 8 位,只存在于高级定时器*/  
}TIM_TimeBaseInitTypeDef; 

TIM_OCInitTypeDef

输出比较结构体,用于输出比较模式。与TIM_OCxInit函数配合使用,完成指定定时器输出通道初始化配置。

typedef struct
{uint16_t TIM_OCMode;        /*比较输出模式选择,共有八种。常用的为 PWM1/PWM2。设定CCMRx寄存器OCxM[2:0]位的值*/uint16_t TIM_OutputState;   /*比较输出使能,决定最终的输出比较信号OCx是否通过外部引脚输出。设定TIMx_CCER寄存器CCxE/CCxNE位的值。*/uint16_t TIM_OutputNState;  /*比较互补输出使能,决定OCx的互补信号OCxN是否通过外部引脚输出。设定CCER寄存器CCxNE位的值*/uint16_t TIM_Pulse;         /*比较输出脉冲宽度,设定比较寄存器CCR的值,决定脉冲宽度。可设置范围为0至65535。*/uint16_t TIM_OCPolarity;  /*比较输出极性,可选OCx为高电平有效或低电平有效。决定定时器通道有效电平。设定CCER寄存器的CCxP位的值*/uint16_t TIM_OCNPolarity;  /*比较互补输出极性,可选OCxN为高电平有效或低电平有效。设定TIMx_CCER寄存器的CCxNP位的值。*/uint16_t TIM_OCIdleState;   /*空闲状态时,通道输出电平设置,可选输出1或输出0,即在空闲状态(BDTR_MOE位为0)时,经过死区时间后定时器通道输出高电平或低电平。设定CR2寄存器的OISx位的值*/uint16_t TIM_OCNIdleState;  /*空闲状态时互补通道输出电平设置,可选输出1或输出0,即在空闲状态(BDTR_MOE位为0)时,经过死区时间后定时器互补通道输出高电平或低电平,设定值必须与TIM_OCIdleState相反。设定CR2寄存器的OISxN位的值。*/
} TIM_OCInitTypeDef;

TIM_ICInitTypeDef

输入捕获结构体,用于输入捕获模式。

与TIM_ICInit函数配合使用,完成定时器输入通道初始化配置。

如果使用PWM输入模式,与TIM_PWMIConfig函数配合使用,完成定时器输入通道初始化配置。

typedef struct
{uint16_t TIM_Channel;     /*捕获通道ICx选择,可选TIM_Channel_1、2、3、4四个通道。设定CCMRx寄存器CCxS位的值*/uint16_t TIM_ICPolarity;  /*输入捕获边沿触发选择,可选上升沿触发、下降沿触发、边沿跳变触发。设定CCER寄存器CCxP位和CCxNP位的值。*/ uint16_t TIM_ICSelection;  /*输入通道选择,捕获通道ICx的信号可来自三个输入通道,分别为TIM_ICSelection_DirectTI、TIM_ICSelection_IndirectTITIM_ICSelection_TRC普通的输入捕获,4个通道都可以使用,PWM输入,只能使用通道1和通道2。设定CCRMx寄存器的CCxS[1:0]位的值*/uint16_t TIM_ICPrescaler;  /*输入捕获通道预分频器,可设置1、2、4、8分频,设定CCMRx寄存器的ICxPSC[1:0]位的值。如果需捕获输入信号的每个有效边沿,则设置1分频。*/uint16_t TIM_ICFilter;    /*输入捕获滤波器设置,可设置0x0至0x0F。设定CCMRx寄存器ICxF[3:0]位的值。一般不使用滤波器,设置为0*/
} TIM_ICInitTypeDef;

关于捕获通道ICx的信号可来自三个输入通道:

在这里插入图片描述

TIM_BDTRInitTypeDef

断路和死区结构体,用于断路和死区参数的设置,高级定时器专用。

用于配置断路时,通道输出状态、死区时间。

与TIM_BDTRConfig函数配置使用,完成参数配置。

这个结构体的成员只对应BDTR寄存器。

typedef struct
{uint16_t TIM_OSSRState;      /*运行模式下的关闭状态选择,设定BDTR寄存器OSSR位的值*/uint16_t TIM_OSSIState;      /*空闲模式下的关闭状态选择,设定BDTR寄存器OSSI位的值。*/ uint16_t TIM_LOCKLevel;     /*锁定级别配置, 设定BDTR寄存器LOCK[1:0]位的值*/  uint16_t TIM_DeadTime;      /*配置死区发生器,定义死区持续时间,可选设置范围为0x0至0xFF。设定BDTR寄存器DTG[7:0]位的值*/   uint16_t TIM_Break;         /*断路输入功能选择,可选使能或禁止。设定BDTR寄存器BKE位的值*/   uint16_t TIM_BreakPolarity;  /*断路输入通道BRK极性选择,可选高电平有效或低电平有效。设定BDTR寄存器BKP位的值。*/  uint16_t TIM_AutomaticOutput;  /*自动输出使能,可选使能或禁止,设定BDTR寄存器AOE位的值。*/
} TIM_BDTRInitTypeDef;

PWM 互补输出

在主输出通道输出波形,在互补通道输出与主通道互补的的波形,添加断路和死区功能。

使用高级定时器TIM1的通道1及其互补通道作为本实验的波形输出通道。对应PA8和PB13。

将示波器的两个输入通道分别与PA8和PB13引脚连接,共地,观察波形。

增加断路功能,用到TIM1_BKIN引脚。对应PB12引脚。

设置该引脚为高电平有效,BKIN引脚置高电平时,两路互补的PWM输出就被停止,像是刹车一样。

Main函数,调用ADVANCE_TIM_Init()函数。

该函数调用ADVANCE_TIM_GPIO_Config()和ADVANCE_TIM_Mode_Config()进行定时器GPIO引脚和工作模式的初始化。

相应的GPIO引脚上可以检测到互补输出的PWM信号,而且带死区时间。

程序运行的过程中,如果BKIN引脚被拉高,PWM输出会被禁止,像是断路或者刹车。

#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_AdvanceTim.h"  /*** @brief  主函数* @param  无  * @retval 无*/
int main(void)
{	/* 高级定时器初始化 */ADVANCE_TIM_Init();while(1){      }
}

修改PWM的周期和占空比,只需修改下面的ADVANCE_TIM_PERIOD、ADVANCE_TIM_PSC和ADVANCE_TIM_PULSE这三个宏即可。具体原因,看之前写的文章—高级定时器里面的PWM输出模式。

TIM_CLK等于72MHZ,ARR是自动重装载寄存器的值,对应ADVANCE_TIM_PERIOD;PSC是计数器时钟的分频因子,对应ADVANCE_TIM_PSC。

PWM信号的频率:F = TIM_CLK/{(ARR+1)*(PSC+1)}


计数器时钟CK_CNT

定时器时钟经过PSC预分频器后,即CK_CNT,用来驱动计数器计数。

PSC是16位的预分频器,可以对定时器时钟TIMxCLK进行1~65536之间的任何一个数进行分频。CK_CNT=TIMxCLK/(PSC+1)


ARR=8,CCR=4,CNT从0开始计数。

当CNT<CCR,OCxREF为有效的高电平,同时,比较中断寄存器CCxIF置位。

CCR<=CNT<=ARR,OCxREF为无效的低电平。


计数器在CK_CNT的驱动下,计一个数的时间1/(TIMxCLK/(PSC+1))=1/(CK_CNT)=(PSC+1)/TIMxCLK

计一个数的时间乘上一个波形的计数次数(ARR+1),就是整个波形的所需时间。

时间取倒数就是PWM信号的频率。

由此可知F = TIM_CLK/{(ARR+1)*(PSC+1)}的含义。


ARR :自动重装载寄存器的值
CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
PWM 信号的周期 T = (ARR+1) * (1/CLK_cnt) = (ARR+1)*(PSC+1) / 72M
占空比P=CCR/(ARR+1)
#ifndef __BSP_ADVANCETIME_H
#define __BSP_ADVANCETIME_H#include "stm32f10x.h"/************高级定时器TIM参数定义,只限TIM1和TIM8************/
// 当使用不同的定时器的时候,对应的GPIO是不一样的,这点要注意
// 这里我们使用高级控制定时器TIM1#define            ADVANCE_TIM                   TIM1
#define            ADVANCE_TIM_APBxClock_FUN     RCC_APB2PeriphClockCmd
#define            ADVANCE_TIM_CLK               RCC_APB2Periph_TIM1
// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}
#define            ADVANCE_TIM_PERIOD            (8-1)
#define            ADVANCE_TIM_PSC               (9-1)
#define            ADVANCE_TIM_PULSE             4#define            ADVANCE_TIM_IRQ               TIM1_UP_IRQn
#define            ADVANCE_TIM_IRQHandler        TIM1_UP_IRQHandler// TIM1 输出比较通道
#define            ADVANCE_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOA
#define            ADVANCE_TIM_CH1_PORT          GPIOA
#define            ADVANCE_TIM_CH1_PIN           GPIO_Pin_8// TIM1 输出比较通道的互补通道
#define            ADVANCE_TIM_CH1N_GPIO_CLK      RCC_APB2Periph_GPIOB
#define            ADVANCE_TIM_CH1N_PORT          GPIOB
#define            ADVANCE_TIM_CH1N_PIN           GPIO_Pin_13// TIM1 输出比较通道的刹车通道
#define            ADVANCE_TIM_BKIN_GPIO_CLK      RCC_APB2Periph_GPIOB
#define            ADVANCE_TIM_BKIN_PORT          GPIOB
#define            ADVANCE_TIM_BKIN_PIN           GPIO_Pin_12/**************************函数声明********************************/void ADVANCE_TIM_Init(void);#endif	/* __BSP_ADVANCETIME_H */
#include "bsp_AdvanceTim.h" static void ADVANCE_TIM_GPIO_Config(void) 
{GPIO_InitTypeDef GPIO_InitStructure;// 输出比较通道 GPIO 初始化RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(ADVANCE_TIM_CH1_PORT, &GPIO_InitStructure);// 输出比较通道互补通道 GPIO 初始化RCC_APB2PeriphClockCmd(ADVANCE_TIM_CH1N_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_CH1N_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(ADVANCE_TIM_CH1N_PORT, &GPIO_InitStructure);// 输出比较通道刹车通道 GPIO 初始化RCC_APB2PeriphClockCmd(ADVANCE_TIM_BKIN_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin =  ADVANCE_TIM_BKIN_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(ADVANCE_TIM_BKIN_PORT, &GPIO_InitStructure);// BKIN引脚默认先输出低电平GPIO_ResetBits(ADVANCE_TIM_BKIN_PORT,ADVANCE_TIM_BKIN_PIN);	
}///*
// * 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
// * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
// * 另外三个成员是通用定时器和高级定时器才有.
// *-----------------------------------------------------------------------------
// *typedef struct
// *{ TIM_Prescaler            都有
// *	TIM_CounterMode			     TIMx,x[6,7]没有,其他都有
// *  TIM_Period               都有
// *  TIM_ClockDivision        TIMx,x[6,7]没有,其他都有
// *  TIM_RepetitionCounter    TIMx,x[1,8,15,16,17]才有
// *}TIM_TimeBaseInitTypeDef; 
// *-----------------------------------------------------------------------------
// *//* ----------------   PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = (ARR+1) * (1/CLK_cnt) = (ARR+1)*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)static void ADVANCE_TIM_Mode_Config(void)
{// 开启定时器时钟,即内部时钟CK_INT=72MADVANCE_TIM_APBxClock_FUN(ADVANCE_TIM_CLK,ENABLE);/*--------------------时基结构体初始化-------------------------*/TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period=ADVANCE_TIM_PERIOD;	// 驱动CNT计数器的时钟 = Fck_int/(psc+1)TIM_TimeBaseStructure.TIM_Prescaler= ADVANCE_TIM_PSC;	// 时钟分频因子 ,配置死区时间时需要用到TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;		// 计数器计数模式,设置为向上计数TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;		// 重复计数器的值,没用到不用管TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	// 初始化定时器TIM_TimeBaseInit(ADVANCE_TIM, &TIM_TimeBaseStructure);/*--------------------输出比较结构体初始化-------------------*/		TIM_OCInitTypeDef  TIM_OCInitStructure;// 配置为PWM模式1TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 输出使能TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// 互补输出使能TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; // 设置占空比大小TIM_OCInitStructure.TIM_Pulse = ADVANCE_TIM_PULSE;// 输出通道电平极性配置TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 互补输出通道电平极性配置TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;// 输出通道空闲电平极性配置TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;// 互补输出通道空闲电平极性配置TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;TIM_OC1Init(ADVANCE_TIM, &TIM_OCInitStructure);TIM_OC1PreloadConfig(ADVANCE_TIM, TIM_OCPreload_Enable);/*-------------------刹车和死区结构体初始化-------------------*/// 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述TIM_BDTRInitTypeDef TIM_BDTRInitStructure;TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;// 输出比较信号死区时间配置,具体如何计算可参考 BDTR:UTG[7:0]的描述// 这里配置的死区时间为152nsTIM_BDTRInitStructure.TIM_DeadTime = 11;TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;// 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);// 使能计数器TIM_Cmd(ADVANCE_TIM, ENABLE);	// 主输出使能,当使用的是通用定时器时,这句不需要TIM_CtrlPWMOutputs(ADVANCE_TIM, ENABLE);
}void ADVANCE_TIM_Init(void)
{ADVANCE_TIM_GPIO_Config();ADVANCE_TIM_Mode_Config();		
}

目前这里没有示波器,于是就用仿真模拟。应该是出现一路互补的带死区时间的PWM波形。

当BKIN引脚接高电平时,PWM输出被禁止,好像是刹车一样。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

stm32 输入捕获 测量脉宽

选用通用定时器TIM5的CH1。 PA0接一个按键&#xff0c;默认接GND&#xff0c;当按键按下时&#xff0c;IO口被拉高&#xff0c;此时&#xff0c;可利用定时器的输入捕获功能&#xff0c;测量按键按下的这段高电平的时间。 宏定义方便程序升级、移植&#xff0c;举个例子&#…

stm32 PWM输入捕获

普通的输入捕获&#xff0c;可使用定时器的四个通道&#xff0c;一路捕获占用一个捕获寄存器. PWM输入&#xff0c;只能使用两个通道&#xff0c;通道1和通道2。 一路PWM输入占用两个捕获寄存器&#xff0c;一个捕获周期&#xff0c;一个捕获占空比。 这里&#xff0c;用通用…

直流有刷减速电机结构及其工作原理

寒假无聊拆了个直流有刷减速电机。下面介绍一下它的结构和工作原理 直流电机 直流电机和直流减速电机&#xff1a; 构造上相差的是一个减速齿轮组。 普通的直流电机当空载时&#xff0c;电机的转速由电压决定&#xff0c;直流减速电机的转速由齿轮组和电压决定。 齿轮组作…

数据库基础概念

postgreSQL设置只允许本地机器连接 在D:\program files\PostgreSQL\14\data里面设置postgresql.conf&#xff1a; listen_addresses ‘localhost’ 然后在服务窗口重新启动postgresql。 PostgreSQL执行SQL语句 PostgreSQL的psql工具可通过命令行执行SQL语句。 psql -U po…

电机和驱动的种类

电机种类 直流电机 分为普通的直流电机、直流减速电机、有刷、无刷。 直流有刷减速电机参数&#xff1a; 空载转速&#xff0c;正常工作电压&#xff0c;电机不带任何负载的转速。 空载电流&#xff0c;正常工作电压&#xff0c;电机不带任何负载的工作电流。单位mA。 负载…

Linux shell基础知识

Shell简介 Shell是一个应用程序&#xff0c;接收用户输入的命令&#xff0c;根据命令做出相应动作。 Shell负责将应用层或者用户输入的命令&#xff0c;传递给系统内核。由操作系统内核&#xff0c;来完成相应的工作。然后将结果反馈给应用层或者用户。 shell命令格式&#…

Linux APT VIM 的一些指令

APT APT下载工具&#xff0c;可以实现软件自动下载、配置、安装二进制或源码功能。 APT采用客户端/服务器模式。 sudo apt-get update 更新软件 sudo apt-get check 检查依赖关系 sudo apt-get install package-name 安装软件 apt-get负责下载软件&#xff0c;install负责安…

CATIA 界面介绍

窗口介绍 窗口主要有&#xff1a;菜单栏、工具栏、特征树、罗盘、信息栏、图形区。 菜单栏&#xff0c;开始里面有CATIA的各个功能模块。 图形区&#xff0c;进行3D、2D设计的图形创建、编辑区域。 信息栏&#xff0c;显示用户即将进行操作的文字提示。 工具栏&#xff0c;…

Linux C文件编译

设置编辑器 1.TAB键设置为4空格。 首先用vim打开/etc/vim/vimrc文件&#xff0c;这里面发现root用户才能修改vimrc文件&#xff0c;所以用sudo命令暂时切换到root用户。 在vimrc文件最后面&#xff0c;输入set ts 4完成设置。 然后保存&#xff0c;关闭文件。 2.VIM编辑器显…

catia 草图设计

草图设计界面 进入草图编辑器环境&#xff1a; 菜单栏&#xff0c;文件-新建&#xff0c;然后类型选择Part。 工具栏&#xff0c;点击下面草图按钮。 然后选择草图平面。 然后就进入草图界面。 草图界面主要由菜单栏、工具栏、特征树、信息栏、罗盘、图形区组成。 菜单栏&…

CATIA连接盘实体设计

文件-新建-part。 点击草图按钮&#xff0c;选择xy平面&#xff0c;绘制如下草图。 然后用橡皮擦修改一下。 然后&#xff0c;点击凸台按钮。选择刚刚定义的草图&#xff0c;拉伸20mm。 选择拉伸实体上端面&#xff0c;点击草图按钮&#xff0c;进入草图编辑器。 在草图编辑器…

PostgreSQL 表的创建、删除、更新

psql工具 psql工具&#xff0c;可通过命令行执行SQL语句。 D:\program files\PostgreSQL\14\bin>psql -U postgres 用户 postgres 的口令&#xff1a; psql (14.2) 输入 "help" 来获取帮助信息.postgres#创建数据库 创建表之前&#xff0c;先创建存储表的数据库…

PostgreSQL 简单的查询

查询列 SELECT语句&#xff0c;用于从表中选取数据。 格式&#xff1a; SELECT <列名>,... FROM <表名>;从Product表中&#xff0c;查询三列。 SELECT product_id, product_name, purchase_price FROM Product;查询所有列&#xff0c;格式&#xff1a; SELECT …

PostgreSQL 聚合、分组、排序

聚合函数 用于汇总的函数。 COUNT COUNT&#xff0c;计算表中的行数(记录数)。 计算全部数据的行数&#xff1a; SELECT COUNT(*)FROM Product;NULL之外的数据行数&#xff1a; SELECT COUNT(purchase_price)FROM Product;结果如下图。 对于一个含NULL的表&#xff1a; …

PostgreSQL 插入、删除、更新、事务

INSERT 使用INSERT语句可以向表中插入数据。 创建一个表&#xff1a; CREATE TABLE ProductIns (product_id CHAR(4) NOT NULL,product_name VARCHAR(100) NOT NULL,product_type VARCHAR(32) NOT NULL,sale_price INTEGER DEFAULT 0,purchase_p…

PostgreSQL 视图、子查询

视图 表里面保存的是实际数据&#xff0c;视图里面保存的是SELECT语句(视图本身不存储数据)。 从视图中读取数据&#xff0c;此时视图在内部执行SELECT语句&#xff0c;创建一张临时表。 使用视图的好处&#xff1a;其一&#xff0c;视图不保存数据&#xff0c;节省存储设备…

GD32F307 DAC 输出波形

文章目录DACDAC_CTL 控制寄存器定时器TIMERx_CTL1 控制寄存器改变波形频率DMADMA和外设配合DMA_CHxCNT计数寄存器波形曲线总结源码DAC 如下面框图所示&#xff0c;使能外部触发后&#xff08;通过设置 DAC_CTL 寄存器的 DTENx 位&#xff09;&#xff0c; 当已经选择的触发事件…

GD32 ADC采集电压

文章目录ADCTIMDMA其他一些初始化main总结使用芯片为GD32F307 ADC 连续转换模式&#xff0c;可以运行在规则组通道上&#xff0c;一旦相应软件触发或者外部触发产生&#xff0c;ADC就会采样和转换规定的通道。 采样时间&#xff0c;每个通道可以用不同的时间采样。ADC使用若…

DAC、ADC、FFT使用总结

目录计算公式波形生成DAC波形频率ADC采样时间离散傅里叶变换DFTFFT计算公式 DAC、ADC、FFT之间有些参数环环相扣&#xff0c;所以先整合一下公式。 1.系统时钟周期72MHZ。 2.定时器的单个时钟周期。 3.定时器的触发周期。 4.正弦波一个周期的时间&#xff0c;其中N为正弦波一…

c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法

提示&#xff1a;点击上方↑↑"数控达人"即可每天免费订阅【邹军&#xff0c;十多年数控工作经验&#xff0c;现自创一套有理论&#xff0c;有干货&#xff0c;还有方法论做支撑的实战编程教程(PDF)&#xff0c;从而让你编写程序就像做填空题一样简单。在没有人指引你…