STMCU小助手
发布时间:2023-1-6 16:29
STM32的高级定时器TIM1可以产生互补的PWM,并且可以通过相关寄存器的设置使能或关闭PWM的输出。在编写BLDC的驱动程序时,本人利用TIM1的channel1,2,3三个通道生成了三路互补的PWM波形,定时器驱动程序如下:
该函数配置了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的输出,可以让两个互补的通道输出更多的电压组合。 ———————————————— 版权声明:GroupHuang |
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
一个软件引起的 LSE 驱动不良的问题
STM32 GUI LTDC 最大像素时钟评估方法
微信公众号
手机版