STM32互补PWM输出使能控制

来源:互联网 发布:瓦基丽武神升级数据 编辑:程序博客网 时间:2024/04/30 14:36

http://blog.csdn.net/MengchiCMC/article/details/54023380?locationNum=5&fps=1

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的两路互补PWM 
当我想要控制某些通道的输出(比如使能通道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的输出,可以让两个互补的通道输出更多的电压组合。


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 抄写经文写错了怎么办 在外地修车被宰怎么办 国外汇款公司名称写错了怎么办 增值税专票没有机器编码怎么办 发票右上角的编码打不全怎么办 税票名称开错了怎么办 开票名称开错了怎么办 退休党员不交党费怎么办 cad打不出来字怎么办 用cad打不出来字怎么办 打字总打错字母怎么办 mac做ppt卡住了怎么办 mac的ppt卡住了怎么办 淘宝店铺被屏蔽了怎么办 淘宝申请售后卖家拒绝怎么办 淘宝投诉卖家入口关闭怎么办 遇见最喜欢孩子的父母怎么办 房屋备案表丢了怎么办 淘宝发布商品没有品牌怎么办 电子发票名称写错了怎么办 合同写错了划掉怎么办 进京证日期错了怎么办 买车时谈的协议与合同不一致怎么办 新车上牌找不到流水号怎么办 开票数量比入库数量少怎么办 我贷款的app忘了怎么办 网贷名字忘了怎么办 附件太大邮件发不出去怎么办 孩子出生足印单子丢了怎么办 保险名字写错了怎么办 行驶证和身份证名字不一样怎么办 上户后发现合格证和车不一样怎么办 新车上户重量不一样怎么办 医保卡和身份证名字不一样怎么办 保险标志保险卡都没给怎么办 新买的电动自行车不符合标准怎么办 电费的户号12位怎么办? 买到过期的药品怎么办 淘宝代销宝贝信息不全怎么办 en和eng读不明显怎么办 快递收件人填错手机号没收到怎么办