本篇文章算是对我之前FOC文章的一些补充,之前我学FOC用的无刷驱动板是立创开源的,用的电机驱动是EG2133,这个电机驱动的特点是,只需要输入3个PWM就可以控制无刷电机。而该芯片内就由对该PWM波自动互补以及死区自动生成的功能。

不能说这块芯片不能用吧,我也通过这块驱动板实现了三环精准控制电机了。现在如果把电机驱动芯片改成需要6路PWM控制,不就意味着要单片机自己实现发送互补的PWM波以及自己生成死区吗?这样看似更复杂的操作,究竟有没有去做的必要呢?其实,如果对电机效率要求高,就一定要能够自主控制每一个半桥的上下管的通断,并且死区时间需要自己控制。

举个例子,以下是单片机生成的两路互补PWM的波形:

就把黄色的那一路当成半桥中输出给下管的那一路,蓝色的当成输出给上管的那一路。首先我PWM配置的是10kHZ,死区时间设置的是1us。这个怎么配置等一下在下面细说,注意看示波器波形,中间的确是有1us左右的死区时间,原本黄线就是低电平状态,而与它互补的蓝线是高电平状态的,到了PWM周期将要结束的时候,也就是两路电平即将切换的时候,就会进入死区时间。而蓝黄两线都是低电平,意味着上下两管都不导通,而在这段死区时间内,其实覆盖了上管从打开到关闭的延迟时间的。那么我为什么要先介绍死区时间,就是因为我发现死区的这段时间,该半桥(也就是上下两管)是不工作的。如果死区时间过长,这会导致半桥工作效率降低,进而导致电机效率降低;而如果死区时间过短,甚至比上管从打开到关闭的延迟时间还要短,那么就会导致上管还没完全关闭,下管就已经打开了,这样就会使MOS直接烧毁。而如果是用那种只需要输入3路PWM就可以控制BLDC的电驱,由于它的死区是自动生成的,死区时间就一定是固定的,而为了保证这颗芯片的质量,这颗芯片的死区时间一定设置的是保守的,也就是说死区时间会偏长从而保证不出错,这其实在一定程度上影响了电机效率。

综上,如果既想要电机效率最大化,又要保证这个MOS是安全的,这个死区时间就一定要通过反复测试,从而得出最优死区时间。

接下来,我讲讲怎么配置STM32 CUBEMX,以及死区时间如何计算,来达到上下管都可以自主控制的效果。

1.配置PWM互补通道:

首先肯定要把chanel 1配置成PWM Genaration CH1 CH1N,然后强调一下,我这个示例是没用到电流环的,所以我PWM暂时不配置为中央对齐模式,因为电流是要在PWM中心采样比较稳定的。重点不在这,把PSC配置为0,ARR配置为16799,使最终PWM频率为10khz。然后这个CKD注意了,这个是选择几分频,而这个的配置是与死区时间有关的,它是在定时器始终频率的基础上继续分频,所以配置这个会影响最后死区时间的计算,我选择的是不分频。

然后就是刹车和死区配置这里,如果你不想要刹车的话,把BRK STATE直接保持默认的DISABLE就行,其他不用管。刹车主要的作用就是停止单片机继续输出该定时器的PWM的波行,进而使电机实现急停。而如果要用的话,不仅这里要勾选ENABLE,上面的activate-break-input也要勾选。通过右边的图可以看到,系统默认把PA6引脚设置为TIM1_BKIN了。BRK Polarity默认是高,也就是当我们给PA6输入高电平时会启动刹车功能,使电机实现急停。

接着是配置死区时间,第一个Automatic Output State是自动输出模式,这个与MOE也就是PWM的使能输出有关。如果把这个选项配置为ENABLE,就表示单片机会自动给MOE置1,也就是单片机会源源不断地发出互补PWM波,直到碰到刹车。而OSSR与OSSI,

我设置的是ENABLE。其实问题不大,因为我的定时器是一直在工作的,还有就是lock level,其实配置的是写保护的程度,选DISABLE也行。

接下里讲讲死区时间究竟要怎么计算:

首先,我们要先确定tDTS,从时钟配置那里确定,比如说我APB2 timer clocks是168MHZ,那么tDTS也就是这个的倒数,也就是1/168(如果死区是以us为单位,那么就是1/168而不是1/168M),接着确认你需要的死区时间,以us为单位。比如我想要死区1us,那么就令DT=1。从上图可以知道,里面有四个公式,你四个公式都试一试,指定有一个公式是可以的。这里我先提前解释一下,DTG[7:5]的意思是,取DTG这个数二进制的高三位,这个数总共有8位。那么表示DTG最大就不超过255。比如我们选择第二个公式,也就是四行中的第二行,已知Tdtg=2*tDTS=2*1/168=1/84,即DT*84=(64+DTG[5:0])。DT=1,因为我要让死区为1us。所以最后得出DTG[5:0]=20,而20对应2进制是0001 0100,DTG[5:0]不是要前六位吗([5:0]就是要前6位的意思,我们取0001 0100中的01 0100。然后由于我们选的是第二个选项,所以要用第二个选项的条件,也就是DTG[7:5]=10x,把这个10拼到刚刚的01 0100就组成了1001 0100,再把1001 0100换算成十进制就是148(可以用电脑上自带的程序员计算器自己试试)。最后我们把这个148配置到CUBEMX上就大功告成了。

经示波器验证,(第一张图片)PWM周期为100us,死区时间也大致为1us,

而第二张图片中,划定了一下死区过剩的时间,大概为864ns,就表示,我至少还可以在减少掉850ns的时间,也就是最后死区时间为0.15us,这样也可以使电机效率更高效。

经过我上面死区公式的一套运算,最后使死区时间确实为150ns左右了,如第三张图所示:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐