本人纯小白一枚,如有错误,还请大佬指出

目录

1.定时器引脚图

2.总体框架

2.1时基模块

2.2比较寄存器

2.3死区发生器

2.4输出控制

3.结构体

4.编程

5.说明


1.定时器引脚图

2.总体框架

注:高级定时器除了通用定时器所具有的输入捕获和输出比较功能外,另外还添加了可编程死区互补输出、重复计 数器、带刹车 (断路) 功能,本文章只截取了其中的输出比较框图。

我将高级定时器的框架分为4个部分:时基模块、比较寄存器、死区发生器、输出控制。

2.1时基模块

高级定时器时钟源有4个,这里仅介绍内部时钟源

时基单元框架如图

将此分为4部分:1.预分频器PSC,可实现1-65536的分频。2.计数器 CNT:三种计数模式,递增计数模式、递减计数模式和递增/递减 (中 心对齐) 计数模式。3.自动重载寄存器 ARR及4.重复计数器 RCR

这里与基本定时器不一样的就是三种计数模式及重复计数器。

通俗来讲就是,循环从0(或最大值)往上(或往下数),当数到最大值(或0),可以发生中断或者事件,而当使用了重复计数器后,数特定的遍数会产生中断1或者事件。其中往上或者往下计数则取决于计数模式。

而本次输出PWM波,不需要采用中断,只需其计数功能即可。

2.2比较寄存器

当计数器 CNT 的值跟比较寄存器 CCR 的值相等的时候,输出参考信号 OCxREF 的信号的极性 就会改变,其中 OCxREF=1(高电平)称之为有效电平,OCxREF=0(低电平)称之为无效电平。

此处输出的信号为OCxREF.

在进入死区发生器之前,可以设置输出比较模式,对于输出PWM波而言,有两个模式可供选择,分别为PWM1,PWM2

2.3死区发生器

在经过死区发生器之后会产生两路带死区的互补 信号 OCx_DT 和 OCxN_DT。如果没有加入死区控制,那么进入输出控制电 路的信号就直接是 OCxREF。

单纯的PWM波,此处不做详细介绍。

2.4输出控制

由死区发生器输出的信号会被分成两路,一路是原始信号,一路是被反向的信号,具体的由寄存器 CCER 的位 CCxP 和 CCxNP 控制。经过极性选择的信号是否由 OCx 引脚输出到外部引脚 CHx/CHxN (即是否使能),则由寄存器 CCER 的位 CxE/CxNE 配置。

3.结构体

typedef struct
{uint16_t TIM_Prescaler;        //时钟预分频,对应PSCuint16_t TIM_CounterMode;      //时钟计数模式,对应3中计数方法uint16_t TIM_Period;           //定时器周期,对应ARR寄存器uint16_t TIM_ClockDivision;    //时钟分频,设置定时器时钟 CK_INT 频率与死区发生器以及数字滤 //波器,采样时钟频率分频比。可以选择 1、2、4 分频。uint8_t TIM_RepetitionCounter; //重复计数器,对应RAR} TIM_TimeBaseInitTypeDef;       
typedef struct
{uint16_t TIM_OCMode;          //输出模式,PWM1及PWM2,对应寄存器CCMR1->OCxMuint16_t TIM_OutputState;     //比较输出使能,对应CCER->CCxEuint16_t TIM_OutputNState;    //比较互补输出使能,对应CCER->CCxNEuint16_t TIM_Pulse;           //脉冲宽度,即比较寄存器的值,对应CCR1uint16_t TIM_OCPolarity;      //输出极性,对应CCER->CCxPuint16_t TIM_OCNPolarity;     //互补输出极性,对应CCER->CCxPuint16_t TIM_OCIdleState;     //空闲状态比较输出状态,对应CR2->OIS1uint16_t TIM_OCNIdleState;    //空闲状态下比较互补输出状态,对应CR2->OIS1N} TIM_OCInitTypeDef;

配置pwm的结构体主要用到两个,一个是时基初始化的结构体,一个是输出比较的结构体,时基初始化的结构体

其中输出比较的结构体对应图中的寄存器如下图

但是我们除了要配备这两个结构体之外,还有一个寄存器要使能

对应BDER->MOE寄存器,官方介绍如下图

就是使能输出引脚

4.编程

总结一下,编程的目标:

1.对通道的GPIO引脚进行配置

2.对两个结构体进行配置

3.使能时钟源,使能输出通道

以下程序配置的为1Khz,占空比为40%的PWM波

void advance_tim1_gpio_config(void)
{//1.结构体GPIO_InitTypeDef GPIO_InitStructure;//2.开时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//3.配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//4.初始化GPIO_Init(GPIOA, &GPIO_InitStructure);//5.使能(无)
}void advance_tim1_mode_config()
{//1.结构体,时基结构体及输出比较结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;//2.开时钟,TIM1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//3.配置及初始化/*--------------------时基结构体初始化-------------------------*/// PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}TIM_TimeBaseStructure.TIM_Period = 9;                        //ARR寄存器的值TIM_TimeBaseStructure.TIM_Prescaler = 7199;                      //PSC分频的值TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数TIM_TimeBaseStructure.TIM_RepetitionCounter=0;                //重复计数器为0TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);/*--------------------输出比较结构体初始化-------------------*/TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             //输出模式:PWM1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 4;                           //设置占空比TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //有效电平TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;  //空闲时比较输出状态TIM_OC1Init(TIM1, &TIM_OCInitStructure);//4.使能,此处使能为将内部时钟作为TIM1时钟源的使能TIM_Cmd(TIM1, ENABLE);                                          //使能计数器TIM_CtrlPWMOutputs(TIM1, ENABLE);                            //使能输出通道
}

说明:ARR寄存器与PSC寄存器都是从0开始计数,所以值要减一。

PWM波频率=TIM_CLK/{(ARR+1)*(PSC+1)}

其中TIM_CLK一般是APB2的频率,因为TIM1挂载在APB2中,APB2一般为72Mhz

占空比=TIM_OCInitStructure.TIM_Pulse/(ARR+1)

个人配置PWM波,一般如以下步骤

1.确认PWM波的频率

2.确认PWM波的精度(对应ARR寄存器)

3.确认占空比,TIM_OCInitStructure.TIM_Pulse

另外,有一个函数专门修改占空比(即修改TIM_OCInitStructure.TIM_Pulse的值),我之前不知道,还自己写了一个(大家避坑)

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

5.说明

除了本文章说明的寄存器,还有一些预装载函数,如TIM_OC1PreloadConfi();

等,此函数对应CCMR->OC1PE,但是我暂时并不需要此功能,所以不做详细介绍。

官方说明如下:此外,对于时基单元,个别寄存器下有阴影,对应影子寄存器,也不作详细介绍。

后续会出一篇PWM波控制电调的文章。

参考文献有《STM32F10x-中文参考手册》《STM32库开发实战指南——基于野火指南者开发板》

STM32 高级定时器 输出PWM波相关推荐

  1. STM32f103C8定时器输出PWM波信号

    利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...

  2. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  3. STM32通用定时器输出PWM

    1 .TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM). 使用定时器预分 ...

  4. 通用定时器输出PWM波实现呼吸灯

    STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...

  5. stm32 高级定时器产生PWM

    用stm32的高级定时器TIM1和TIM8产生PWM,需要注意: 1.都有TIM1,但只有flash容量大于256K的大容量单片机才有TIM8 2.高级定时器相对于通用定时器,多了TIM_CtrlPW ...

  6. HAL库学习之高级定时器输出PWM

    1.PWM原理(Pulse Width Modulation) TIM1&TIM8高级定时器可以输出7路PWM ARR:自动重装载值:CCRX:比较寄存器的设定值 原理:通过定时器不断技计数, ...

  7. STM32单片机:定时器TIM输出PWM波

    学习32单片机过程中使用的工具:MDK Keil5 + 正点原子精英版(STM32F103ZET6)+ STM32CubeMX + HAL开发 一.PWM的产生原理 关于PWM的产生原理网上有很多教程 ...

  8. STM32复习笔记(十八) —— 高级定时器(输出比较)

    STM32复习笔记(十八) -- 高级定时器(输出比较) 1.配置步骤 1)选择计数器时钟 (内部,外部,预分频器) 2)将相应的数据写入TIMx_ARR and TIMx_CCRx寄存器中 3)可设 ...

  9. STM32F7同一定时器多路输出PWM波通道之间相互影响问题

    --------------------------2020/8/12更新-------------------------------- 这次用Cube直接生成PWM控制代码,然后再RT-Threa ...

  10. STM32学习笔记:通用定时器输出PWM

    脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度.电机转速等. STM32 的定时 ...

最新文章

  1. IC/FPGA笔试/面试题分析(九)关于FIFO最小深度计算的问题
  2. 11、InnoDB存储引擎
  3. 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)
  4. 计算机风格学,由风格学习算法自动生成大规模手写字体
  5. 数据库AngularJs
  6. C++常用函数有哪些?
  7. 【emWin】例程二十二:窗口对象——Framewin
  8. ngrok转发mysql连接_使用小米球 -Ngrok 实现内网转发
  9. JavaWeb笔记 黑马程序员课程
  10. 小技巧 - LeetCode 如何查看他人耗时更优的代码答案?
  11. Python 分词 第三方模块
  12. Clip_by_norm 函数理解
  13. WMS仓库管理系统与ERP仓储系统的区别与联系
  14. 密码学笔记——培根密码
  15. 计算机内存改成多少合适,32g内存需要设置虚拟内存吗?32g内存虚拟内存设置多少合适...
  16. 通用Excel数据导入功能模板
  17. ESD和TVS管的区别
  18. 关于jQuery中的submit事件
  19. Reverse-it
  20. 中日翻译在线翻译如何利用日语翻译软件完成

热门文章

  1. thinkpadt410接口介绍_Thinkpad-T410 T410S笔记本左右接口以及硬件设备详细介绍!
  2. cubase手机版android,Cubase中文应用
  3. LoadRunner教程(18)-LoadRunner 图表合并
  4. 界面控件DevExpress WinForms v21.2 - 全新升级的图表控件
  5. python半自动化获取QQ空间说说
  6. CUDA核函数share memory
  7. ACD是计算机的应用之一,ACDSee
  8. 用acdsee制作html,ACDsee教程:ACDSee的HTML相册生成
  9. 计算机科学与技术高中选课,2019-2021年新高考专业选课要求 大学个专业选科要求解读...
  10. LinkPdf转换器-批量PDF转Word|PDF合并|压缩|拆分