引言:为防止上下桥臂同时导通和其他过流现象,需要DAC生成一个模拟量波形与ADC读取到的模拟信号对比,对比结果作为触发源,触发刹车功能。本文主要介绍DAC、内部比较器、高级定时器刹车功能,给PMSM电机做安全保护。

1.HAL库函数

序号 HAL库函数 作用
1 HAL_DAC_Start(&hdac3,DAC_CHANNEL_1); 启动DAC
2 HAL_DAC_SetValue(&hdac3,DAC_CHANNEL_1,DAC_ALIGN_12B_R,3000); 设置DAC值
3 HAL_COMP_Start (&hcomp1); 启动内部比较
4 HAL_TIM_Base_Start( &htim1); 启动高级定时器1
5 HAL_TIM_PWM_Start( &htim1, TIM_CHANNEL_4); 启动TIM1_iN4
6 HAL_DAC_GetValue() 获得DAC值
7 HAL_TIMEx_CondigBreakDeadTime(); 死区时间
8 HAL_DAC_stop(); 停止DAC发波

2.DAC+COMP+Break and Dead Time原理

2.1 DAC模拟生成

         DAC模块由这八个部分组成,但咱们只需要调用一个函数就能输出预定电压,这里简单介绍一下DAC。

         DAC 模块是 12 位电压输出数模转换器。DAC 可以按 8 位或 12 位模式进行配置,并且可与 DMA 控制器配合使用。在 12 位模式下,数据可以采用左对齐或右对齐。DAC 有两个输出 通道,每个通道各有一个转换器。在 DAC 双通道模式下,每个通道可以单独进行转换;当 两个通道组合在一起同步执行更新操作时,也可以同时进行转换。可通过一个输入参考电压 引脚 VREF+ (与 ADC 共享)来提高分辨率。

       

2.2 Comp内部比较器

        顾名思义,就有将两个信号作为对比信号,两者的差为负值就会给个上升沿

2.3 Dead TIM死区

(1)为什么需要死区

        因为现实中,开启mos管需要时间,两个mos可能同时都打开,造成输出互补通道短路,简单来说就是:TIM1_CH1和TIM1_CH1N在同一时刻输出高电平,使mos管或IGBT同时打开。

        为防止上面情况的出现,设置一个死区时间,让三相驱动桥的上桥臂都关好了,再打开下桥臂。

(2)死区时间计算

        1)计算死区时钟周期 f_{DTS}

f_{DTS} = \frac{f_{TIM1}}{2^{CKD[1:0]}}

T _{DTS} = \frac{1}{f _{DTS}}

        注:f_{DTS}:死区时钟周期

                f_{TIM1}:定时器时钟周期

                CKD[1:0]:死区时钟的分配系数

        2)根据 DTG[7:5] 的值选择公式

DTG[7:5] 死区时间公式
0xx DTG[7:0]\times T _{DTS}
10x (64 + DTG[5:0])\times 2T _{DTS}
110 (32 + DTG[4:0])\times 8T _{DTS}
111 (32 + DTG[4:0])\times 16T _{DTS}

        3)例子

        按着图中的顺序计算

        

定时器最初的时钟源为160MHZ
输入进定时器模块内

 经PSC:160MHZ
经CKD,80MHZ
Tdts = 1/80MHZ = 0.0125ns

 十进制DEC120换算为二进制BIN位为:0111 1000 

也就是按这个式子计算,DTG[7:0]\times T _{DTS} = 120 * 0.0125  =1.5ns
那PWM波周期呢? 经PSC:160MHZ,经中央对齐:80MHZ,经ARR:10KHZ,经RCR:10KHZ则PWM周期为100ns,具体原因看上一节高级定时器吧。

(3)自带死区输出的驱动芯片

        卧槽,松哥,我看不懂一点死区时间计算怎么办?

        兄弟,根本不用计算,咱们掏点钱就把事给办了!

        目前许多三相电机的驱动芯片都自带死区时间,保护咱们的三相全桥,所以做硬件时,不妨添加一个驱动芯片充当保护,还不用管死区的事情了。这里给大家推荐两个

第一张图是我字节板子用的,第二张图是欧拉电子家用

2.4 Break 刹车

        死区因为有驱动芯片的原因,可以不配置,但是刹车功能建议还是配置上为好。即在DAC与ADC读取到的比较后,发现过流,就会触发刹车。

3.STM32CubeMx配置

首先是ADC读取,然后作为COMP1的+值

然后是开启DAC3 OUT1,但不输出到IO口

开启COMP1,另负值为DAC3,上升沿触发

然后是刹车,使能后,让触发源为COMP1,高电平有效,为防止误触,给个滤波 2 

最后死区设置,有驱动芯片的话可以不设置

4.代码说明

开启后就不用管了

HAL_DAC_Start(&hdac3,DAC_CHANNEL_1);
HAL_DAC_SetValue(&hdac3,DAC_CHANNEL_1,DAC_ALIGN_12B_R,3000);
HAL_COMP_Start (&hcomp1);
HAL_TIM_Base_Start( &htim1);
HAL_TIM_PWM_Start( &htim1, TIM_CHANNEL_4);

内容复杂,难免出错,感谢指正,感谢关注

目前还差绝对值编码、增量编码器和CAN通信
外设系列出完,代码放文章末尾和gitup上

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐