STM32互补PWM输出使能控制
STM32的高级定时器TIM1可以产生互补的PWM,并且可以通过相关寄存器的设置使能或关闭PWM的输出。在编写BLDC的驱动程序时,本人利用TIM1的channel1,2,3三个通道生成了三路互补的PWM波形,定时器驱动程序如下:
void TIM1_Init(u16 arr, u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOB,&GPIO_InitStructure);TIM_DeInit(TIM1);
TIM_TimeBaseInitStructure.TIM_Period = arr;
TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTRInitStructure.TIM_DeadTime = 0;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);TIM_Cmd(TIM1, ENABLE);TIM_CCPreloadControl(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
该函数配置了PWM的GPIO,定时器以及死区控制等。产生的波形如图1所示
当我想要控制某些通道的输出(比如使能通道1的输出CH1,但是关闭其互补输出CH1N),利用下面两个函数发现TIM1依旧输出两路互补的PWM。这个函数最终操作的寄存器是捕获/比较使能寄存器TIMx->CCER。
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
经过调试发现在定时器初始化函数中一个函数的调用:TIM_CCPreloadControl(TIM1,ENABLE);
注释掉这句之后,或者将ENABLE改为DISABLE,才能实现关闭通道1的互补输出,如图2所示:
此时通道1CH1输出PWM波形,其互补通道CH1N输出低电平。
分析发现,TIM_CCPreloadControl()函数最终操作的是控制寄存器 2(TIMx_CR2)的第0位CCPC。查阅STM32的数据手册,描述如下:
CCPC:捕获/比较预装载控制位 (Capture/compare preloaded control)
0: CCxE, CCxNE和OCxM位不是预装载的;
1: CCxE, CCxNE和OCxM位是预装载的;设置该位后,它们只在设置了COM位后被更新。
注:该位只对具有互补输出的通道起作用。
也就是说如果使能了预装载,只有在COM事件发生后值才能写入影子寄存器(影子寄存器才是真正起作用的寄存器),产生作用。同时该位只对互补输出起作用,因此对于普通定时器来说,无论该位是否被设置,都有可以通过TIM_CCxCmd()函数使能或者关闭PWM的输出。
想要让定时器的PWM输出低电平(高电平),也可以将相对的 寄存器TIMx->CCR1置零(大于arr),但是此时互补通道只能为高电平(低电平)。而通过关闭PWM的输出,可以让两个互补的通道输出更多的电压组合。
STM32互补PWM输出使能控制相关推荐
- STM32 TIM PWM中阶操作:互补PWM输出
STM32 TIM PWM中阶操作详解:互补PWM输出 STM32 TIM可以输出管脚PWM信号适合多种场景使用,功能包括单线/非互补PWM输出,双线/互补PWM输出,以及死区时间和刹车控制等. 实际 ...
- stm32关于带死区时间的互补PWM输出
1.互补PWM输出简介 在使用stm32输出PWM波形时,笔者所用的stm32f103zet6中的高级定时器TIM1和TIM8可以输出互补的PWM波形,使用互补的PWM波常见与一些半桥电路和全桥电路控 ...
- pwm一个时间单位_详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲!...
一.stm32的pwm输出引脚是使用的IO口的复用功能. 二.T2~T5这4个通用定时器均可输出4路PWM--CH1~CH4. 三.我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并 ...
- 【STM32】PWM 输出实验代码详解
文章目录 main.c pwm.c pwm.h STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出. 高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 ...
- STM32定时器—PWM 输出
26.1 关于 PWM 26.1.1 PWM 介绍 PWM(Pulse Width Modulation,脉冲宽度调制).是一种利用微处理器的数字输出来对模拟电路进行控制的技术,广泛应用在测量.通信. ...
- 基于STM32使用PWM调速控制直流电机
PWM调速控制直流电机 网上找的历程,实现可以,但是无法随我自己的意愿改变速度,还是有问题. 代码如下: #include "delay.h" #include "sys ...
- 【STM32】PWM输出原理
目录 PWM模式的工作框架: PWM模式的工作原理: PWM库函数配置: 1.初始化定时器输出通道:TIM_OC2Init 2.设置比较值函数:TIM_SetComparex 3.使能预装载寄存器:v ...
- linux控制pwm输出个数,树莓派精确控制pwm输出,控制步进电机
首先需要wiringPi,我自己的系统有,如果你没有,自行下载,很简单,可以看看 /usr/include/wiringPi.h,有的话就是OK, 其次介绍几个pwm相关的主要设置函数 1:pwmS ...
- STM32关闭PWM输出时,让IO输出固定高或低电平的方法。
看到有很多人在网上询问停止PWM时如何获取固定输出,记录在此供参考. 方法1: 设置占空比为0xffff 或0 后即可得到想要的0或1输出. 方法2 : 配置回通用IO口,再设置为0或1. 以上两种方 ...
最新文章
- 试题 入门训练 Fibonacci数列(Java)
- 编写运行最简单的java程序——使用记事本编写java程序
- VC++ 判断文件或文件夹是否存在的快捷方法 _access
- php session 过期,php session失效的原因
- 《编程题》组装三角形
- Linux中netstat工具详解
- 一篇讲Java指令重排和内存可见性的好文
- BugkuCTF-MISC题啊哒,白哥的鸽子
- oracle怎么把in值列出来,oracle – SELECT的解析和绑定变量.. WHERE列IN(..)查询
- 无线SD-WAN提供商Cradlepoint完成C轮融资8900万美元
- dotween路径移动_使用DOTween Pro插件设置物体移动的位置、移动的方式、以及动画结束时执行方法...
- 基于Attention Model的Aspect level文本情感分类---用Python+Keras实现
- 【割点】【割边】tarjan
- 解决VsCode下载慢问题
- 计算机网络自动分配ip地址,计算机ip地址设置 自动获取IP和静态IP
- Origin复制图形格式
- 2020年你还不会做绿幕特效?这4步基础技巧要点了解一下!
- u盘在计算机打不开,别的电脑能打开u盘自己的怎么打不开解决方法
- Oracle前期准备
- html中border的作用,border在html中是什么意思
热门文章
- What kind of new area will CFun and creation form?
- 【论文速递】-2022-金融研究-系统性金融风险文献综述:现状、发展与展望
- 【解析】Token to Token Vision Transformer
- 【毕业设计】基于STM32及OpenMV的云台追踪装置
- Jenkins自动化打包生成二维码下载链接
- java 营业执照图片内容识别
- flutter图片识别_Flutter 图片解码与缓存管理研究
- 出差中,推荐几个百度,腾讯,抖音大佬的公众号
- 微贷网java高级开发工程师
- 【转载】生产订单完工确认(CO11N) BAPI : BAPI_PRODORDCONF_CREATE_TT