完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
PWM是脉冲宽度调制,在电力电子中,最常用的就是整流和逆变。这就需要用到整流桥和逆变桥。
对三相电来说,就需要三个桥臂。以两电平为例,每个桥臂上有两个电力电子器件,比如IGBT。大致如下图所示; 这两个IGBT不能同时导通,否则就会出现短路的情况,从而对系统造成损害。 那为什么会出现同时导通的情况呢? 因为开关元器件的 和 严格意义并不是相同的。 所以在驱动开关元器件门极的时候需要增加一段延时,确保另一个开关管完全关断之后再去打开这个开关元器件,通常存在两种情况; 上半桥关断后,延迟一段时间再打开下半桥; 下半桥关断后,延迟一段时间再打开上半桥; 这样就不会同时导通,从而避免功率元件烧毁;死区时间控制在通常的单片机所配备的PWM中都有这样的功能,下面会进一步介绍。 互补PWM的死区时间 相对于PWM来说,死区时间是在PWM输出的这个时间,上下管都不会有输出,当然会使波形输出中断,死区时间一般只占百分之几的周期。但是当PWM波本身占空比小时,空出的部分要比死区还大,所以死区会影响输出的纹波,但应该不是起到决定性作用的。 另外如果死区设置过小,但是仍然出现上下管同时导通,因为导通时间非常非常短,电流没有变得很大,不足以烧毁系统,那此时会导致开关元器件发热严重,所以选择合适的死区时间尤为重要,过大过小都不行。 数据手册的参数 这里看了一下NXP的IRF540的数据手册,栅极开关时间如下所示; IRF540 然后找到相关的 , , , 的相关典型参数; 典型参数 :门极的开通延迟时间 :门极的关断延迟时间 :门极上升时间 :门极下降时间 下面是一个IGBT的数据手册; IGBT 下图是IGBT的开关属性,同样可以找到 , , , 等参数,下面计算的时候会用到; 开关属性 如何计算合理的死区时间? 这里用 表示死区时间,因为门极上升和下降时间通常比延迟时间小很多,所以这里可以不用考虑它们。则死区时间满足; :最大的关断延迟时间; :最小的开通延迟时间; :最大的驱动信号传递延迟时间; :最小的驱动信号传递延迟时间; 其中 和 正如上文所提到的可以元器件的数据手册中找到; 和 一般由驱动器厂家给出; 如果是MCU的IO驱动的话,需要考虑IO的上升时间和下降时间,另外一般会加光耦进行隔离,这里还需要考虑到光耦的开关延时。 STM32中配置死区时间 STM32的TIM高级定时器支持互补PWM波形发生,同时它支持插入死区时间和刹车的配置。 直接看参考手册里的寄存器TIMx_BDTR,这是配置刹车和死区时间的寄存器; TIMx_BDTR 可以看到死区时间DT由**UTG[7:0]**决定,这里还有一个问题是 是什么?在TIMx_CR1的寄存器可以得知, 由TIMx_CR1寄存器的CKD决定; 如果这里配置成00,那么 和内部定时器的频率相同,为8M; CKD 结合代码做一下计算;系统频率为72M,下面是时基单元的配置; #define PWM_FREQ ((u16) 16000) // in Hz (N.b.: pattern type is center aligned) #define PWM_PRSC ((u8)0) #define PWM_PERIOD ((u16) (CKTIM / (u32)(2 * PWM_FREQ *(PWM_PRSC+1)))) TIM_TimeBaseStructInit(&TIM1_TimeBaseStructure); /* Time Base configuration */ TIM1_TimeBaseStructure.TIM_Prescaler = 0x0; TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; TIM1_TimeBaseStructure.TIM_Period = PWM_PERIOD; TIM1_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2; PWM的频率是16K,注意这里的PWM是中央对齐模式,因此配置的时钟频率为32K; 下面时刹车和死区时间,BDTR寄存器的配置,因此这里的CK_INT为32M #define CKTIM ((u32)72000000uL) /* Silicon running at 72MHz Resolution: 1Hz */ #define DEADTIME_NS ((u16) 500) //in nsec; range is [0.。.3500] #define DEADTIME (u16)((unsigned long long)CKTIM/2 *(unsigned long long)DEADTIME_NS/1000 000 000uL) TIM1_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; TIM1_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; TIM1_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; TIM1_BDTRInitStructure.TIM_DeadTime = DEADTIME; TIM1_BDTRInitStructure.TIM_Break = TIM_Break_Disable; TIM1_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; TIM1_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; 例:若TDTS = 31ns(32MHZ),可能的死区时间为:0到3970ns,若步长时间为31ns;4000us到8us,若步长时间为62ns;8us到16us,若步长时间为250ns;16us到32us,若步长时间为500ns; 如果需要配置死区时间 1000ns,系统频率72,000,000Hz,那么需要配置寄存器的值为; 直接写成宏定义的形式; #define DEADTIME (u16)((unsigned long long)CKTIM/2 *(unsigned long long)DEADTIME_NS/1000 000 000uL) 用示波器验证了一下;具体如下图所示; (mbbeetchina) |
|
|
|
只有小组成员才能发言,加入小组>>
1677个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
35740 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
3950 浏览 0 评论
5460 浏览 1 评论
6317 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
3825 浏览 0 评论
301浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
264浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
297浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
353浏览 2评论
368浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-3-28 22:34 , Processed in 0.748058 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号