发作品签到
专业版

基于DRV8313和STM32G030的有霍尔无刷电机驱动板

工程标签

103
0
0
0

简介

使用DRV8313的无刷电机驱动板。由STM32G030检测霍尔信号并在DRV8313的3EN+3IN引脚施加PWM信号,控制无刷电机,包含自测速调速和正反转功能。项目使用了嘉立创彩色丝印

简介:使用DRV8313的无刷电机驱动板。由STM32G030检测霍尔信号并在DRV8313的3EN+3IN引脚施加PWM信号,控制无刷电机,包含自测速调速和正反转功能。项目使用了嘉立创彩色丝印
复刻成本:15

开源协议

GPL 3.0

创建时间:2025-04-04 09:48:45更新时间:2025-05-12 11:36:49

描述

2025年5月11日更新

补传了缺失的附件🤡

 

本项目建立之初是希望成为DRV8313的设计参考B方案

众所周知,无刷电机驱动控制主流方案分两种,本项目所属的一种是带三相霍尔传感器的无刷电机闭环控制,另一种方案还有带电流检测的无刷电机开环控制,什么都不带的没听说过,可能没法用吧。

立创商城DRV8313商品页面  原有的设计参考就属于电流反馈开环控制,其他的开源项目中翻了翻基本都是电流反馈。
专门介绍霍尔反馈闭环控制的项目,是一个也没有。补一个

其实开环和闭环很好区分,我们驱动电机的目的是为了让转子从一个角度转到另一个角度并往复下去,霍尔传感器是直接反映转子的运转情况,所以是闭环。检测电流检测只是检测线圈电流,然后推测转子的运转情况,所以是开环。
从两种方案的特点上也能看出来,开环控制在启动时或用手捏住再松开后,可能猛拉硬拽或者先倒着转,闭环则不会出现猛拽或先倒转的情况。
除此之外,如果负载较重或者刚好处于电机比较糟糕工作条件的话,开环控制可能出现不转、转转停停或全程倒转但电流反馈正常工作的情况,闭环控制则可以明确获知当前PWM占空比已经拉到最大(最大电流限制可能不允许百分百占空比)但目标转速到不了。

其实一般直接说霍尔反馈或电流反馈可能更简单明了,但在看附录里的文档时,记得找带闭环(Closed Loop)关键字的内容
附件中slaa503开头的文档简要介绍了开环与闭环控制方式,如果希望更深入了解,得找更专业的文献。

正所谓:“上帝为你打开一扇窗的时候,也会关上一扇门”
没有霍尔传感器的时候,还是老老实实采集电流吧,其实电流反馈是足够好用的,大多数应用中并不存在所谓"霍尔反馈完爆电流反馈"
反之如果系统中已经存在霍尔传感器了,最好是用起来。

附件目录:
drv8313.pdf —— DRV8313的手册
slaa503-Sensored 3-Phase BLDC Motor Control Using MSP430.pdf —— 使用单片机控制DRV8313驱动电机的应用报告
stm32g030c8.pdf —— stm32g030c8数据手册
rm0454-stm32g0x0-advanced-armbased-32bit-mcus-stmicroelectronics.pdf —— stm32g030c8参考手册
CUBEMX和KEIL工程文件.rar —— 里面是名为G030C8_DRV8313的文件夹,全部代码在G030C8_DRV8313\Core目录下
已经编译好的hex文件.rar —— 内含两个hex文件,硬件连接相同的情况下写进去就能转,可用于测试

图1-1

首先从原理图看,本项目整体分为两个部分
核心部分和少量的可选部分。

图1-2

首先drv8313,这个必须有,毕竟本项目是以drv8313为中心建立的
当然如果有其他的3EN+3IN的三相半桥驱动IC,理论上也可以替代
3个Hi+3个Li的那种,就得完全重新设计了
另外,目前市面上的半桥驱动IC,一般都是TTL-2V电平兼容,最起码能兼容到TTL-3V电平,但不代表没有例外,如果参考本项目而使用其他驱动IC,一定要确保电平兼容

图1-3

STM32G030C8T6
这个选择其实比较多,只要能产生占空比可调的PWM信号的MCU一般都可,
考虑到一般运行要么IN引脚PWM调速,要么EN引脚PWM调速,并且在EN引脚PWM调速目前在本项目表现欠佳,大概率是面向不同的应用
也就是说,只要能输出3路占空比可调PWM信号再有IO若干就可以满足最基本的功能
但为了实现外部可选的调速功能,尽量还是要有一个片内ADC
建项时选择STM32G030C8T6主要是看中了全IO引脚都是5V耐受且引脚够多,其他优点还包括电源引脚仅第6引脚(VDD/VDDA)和第七引脚(VSS/VSSA)两个,VBAT和VREF+和VDD挨在一起布线省事。
当然最根本的还是一个16位高级定时器和4个16位通用寄存器以及一个12位ADC这些片内外设。

图1-4

6Pin连接器是STM32G030C8T6的调试接口
引脚定义按照STlink的标准SWD/SWV顺序来的,如图

图1-5

SWD全称 Serial Wire Debug ,是arm推出的调试接口,SWV全称 Serial wire Viewer,就是在SWD基础上增加SWO引脚往调试器发送信息
有arm单片机产品的不同厂家,含有SWD的调试接口引脚定义顺序未必相同,但每个厂家会对旗下产品的评估板、调试器按照固定引脚定义执行标准化
顺带一提,之前用过的几款立创开发板,调试接口的引脚定义就没一个重样的,而且绝对不按照芯片厂家的官方SWD/SWV顺序来,导致每次立创开发板到手第一时间重新转接调试接口。

图1-6

这个MX3.0连接座,以及上面的引脚定义,
是按照我在某宝电商买的这个  信浓直流无刷电机 分配的 ,说来惭愧,我之前没见过信浓的电机,也不知道这个是不是真的。
另外U、V、W三者之间以及HALL_U,HALL_V,HALL_W三者之间顺序互换,只要匹配就可以让电机运转
所以本项目对U/V/W三相的定义,可能顺序不正确,也可能不存在顺序正确一说。
另外这个是拆机的,不包全好,买了就是图便宜,几十个里才出一个坏的就是赚了
买的时候是2023年4月前后,印象中是当时淘宝最便宜的一个带霍尔无刷电机,无论是价格行情还是电机成色都不能代表现在的情况
本项目工作电压设计在8~18V,电机额定电压是105V,据称48V、36V也运行良好。
现在证明电机18V空转,每分钟转个2000转也是可以的。
如果手头有其他带霍尔无刷电机的话,建议按照手头的电机,修改这个连接座。
如电机运行需要更高的电压,参见下文修改。
PCB中,MX3.0正下方背板用丝印标出各引脚的定义,建议一并修改或直接删除。

图1-7

电源接口,VCC和GND,使用了 栅栏式接线端子 ,也可以直接焊线
VCC范围是8~18V,DRV8313工作电压是8~60V,稳压器最大工作电压18V,最大耐压20V不保证长期稳定
如果使用超过18V电压,建议稳压器换成开关电源器件或整体改成双电源供电
零散的引脚DC(通过RC电路支持PWM)和FG用于从外部进行调速控制、DIR用于改变方向,放在一个3Pin排针上了,都可以不启用

图1-8

两个串口引脚TX和RX,引出来线但代码上连启用配置都没有,也就是硬件上保留接口。

图1-9

画圈的可选部分
由于霍尔传感器是高低电平输出,所以可以接到MOS管栅极上控制LED导通
在最下边的MOS导通的情况下,只要上电就能用
用手拧中间的轴,连接到NMOS栅极的霍尔传感器信号发生变化,LED就会相应亮灭。
但由于每个霍尔传感器电机转一圈产生4个IO翻转周期、高低电平占空比50%,只要转起来的速度不是特别慢,
就是3个LED在50%占空比PWM驱动下,看起来不太亮个3个灯而已。

前段时间看了个动画,名字叫《前桥魔女》,看了第一集才知道前桥是个地名,魔女还是见习的。
当时看了以后让我深受启发,没道理前桥能有魔女,别的桥就不能有魔女

评论区的人个个都是人才,看了一圈,有这个想法的人不止我一个,马上发现后桥魔女、左桥魔女右桥魔女、天桥魔女铁桥魔女的
果不其然还有全桥魔女、半桥魔女、电桥魔女、H桥魔女什么的,忍不住想告诉他全桥也称全H桥一般认为和H桥指同一样东西

俺寻思这不就来了嘛, 分立变压器2.5G以太网RTL8156BG芯片USB3.0网桥 现在改名叫网桥魔女

 

想啥呢,四层板又没法彩色丝印优惠券免费打样还得收冷门工艺费要三百多银子呢(虚晃一枪)

那么给全桥上再加一个半桥,不就成了三相半桥了嘛

刚好手边有一个lceda彩色丝印优惠券
所以马上在这个电路板画上
三相半桥魔女~~
的吉祥物

图1-10

那魔女呢?
当然是画不出来啦
就这还是拿在线AI(蛮难用的)生成未果,修改半天又拼接而成的,原本还有一部分可能是脸的东西,太丑就删掉了,俺寻思手绘保不齐还比这个好点,正印证了那句"你不了解AI,AI也不了解你"

有着灰蓝色的外壳,除了转也没别的本事,那就叫 灰壳转转
这下美术和命名两头短板了,老铁

元器件焊完以后,变成封面那样,那么这堆花里胡哨的有什么用呢

往好了想,这是一个霍尔传感器测试功能,可以手拧一圈快速判断霍尔传感器有没有正常工作
然而大多数情况下,就是3个LED在50%占空比PWM驱动下,看起来不太亮个3个灯而已。

/(ㄒoㄒ)/~~,又做出来无聊的东西了呢


现在电路板上的主要成员都亮相了,来到实际驱动的部分

图1-11

单片机由稳压器提供的3.3V供电,连接了外置8MHz无源晶振
VBAT、VREF+和VDD/VDDA连接3.3V,并联一堆旁路滤波电容,VSS/VSSA接地。
NRST、PA13(SWDIO)、PA14(SWCLK)连接到SWD调试接口
STM32G0系列没有SWO引脚,6P针座SWO位置引脚悬空
一般来讲NRST引脚应该再并联个对地轻触开关之类的用于复位,这次没接

然后看DRV8313,首先从简单的部分开始

图1-12

首先21引脚悬空,3个GND引脚和中间GND-Pad连接GND
两个VM引脚(4,11),也就是电源引脚连接VCC,同时按照手册建议,与VCP(3)之间连接100nF电容,与GND之间连接100nF滤波电容
同样参照手册,CPL(1)和CPH(2)之间连接10nF电容
然后是V3P3(15)内部稳压器引出引脚,需要并联容值不小于470nF的对地旁路电容,因为其他地方用的1uF电容比较多,焊接时我直接用的1uF
最后是3个PGND引脚,注意与GND引脚不同,这些引脚并不是在一起的,分别对应相同数字的OUT引脚内部下端NMOS源极,

图1-13

手册第10页7.2 Functional Block Diagram,OUT1/2/3在下端NMOS漏极,GND1/2/3在下端NMOS源极
可以直接连接到GND,但这样会完全丧失电流检测功能。3个源极分开应该是为了便于开环应用分别采集三路电流,只不过大多数应用中,三个接一起采集总电流一样能电流反馈,甚至官方的开发板,都是三个连在一起然后通过采样电阻到GND的就是了。

图1-14

由于我打算包含过流检测功能,所以同样三个源极连在一起然后通过采样电阻到GND

三个OUT1、OUT2、OUT3驱动电机旋转
由IN1、IN2、IN3和EN1、EN2、EN3共6个引脚控制3个OUT的状态
按照正确的方式给3个IN和3个EN施加信号就能让电机转起来,
施加PWM信号并调整占空比就能调整转速

图1-15

在DRV8313手册的第16页"8.2.1.2.2 Motor Commutation"章节有一句话
Both synchronous and asynchronous rectification are supported. Synchronous rectification is achieved by
applying a pulse-width-modulated (PWM) input signal to the INx pins while driving. The user can also implement
asynchronous rectification by applying the PWM signal to the ENx inputs.
也就是说3个IN和3个EN都可以使用PWM信号,PWM信号加在IN上是同步调速,PWM信号加在EN上是异步调速

再往下是一张很重要的表格,我们现在根据这张表格开始第一步——转起来

先看OUT1(Phase U)、OUT2(Phase V)和OUT3(Phase W)下面的部分
可以看到三路三态半桥输出的状态下,对应的IN和EN电平
总计有三种,分布在不同位置,也就是三态:
P管或等效为P管的N管单独导通,输出高电平H;N管单独导通,输出低电平L;P管或等效为P管的N管和N管都不导通,输出高阻Z

图1-16

对于DRV8313,从手册第10页7.2 Functional Block Diagram和第11页7.3.3 Charge Pump可以看出,每路半桥的上端MOS使用N管,三路总计6个NMOS
顺带一提,如果是LI和HI两个引脚控制一路半桥的驱动器,虽然同为三态半桥驱动器,但其实有四态:
P管或等效为P管的N管单独导通,输出高电平H;N管单独导通,输出低电平L;P管或等效为P管的N管和N管都不导通,输出高阻Z
多出来的是,P管或等效为P管的N管以及N管同时导通,输出为... (ˇˍˇ) ~  ... !   烧态

现在再来看表格的State
最下面两个比较直观,全输出低电平的状态是刹车,全高阻的状态是离线
上面6个,就是让电机转起来的内容
也就是说,我们要照着这张表格,判断出目前处于的状态(State),按表格中对应状态使用IN和EN引脚控制OUT引脚

图1-17

那么State的1/2/3/4/5/6是什么呢?现在打开附件的slaa503-Sensored 3-Phase BLDC Motor Control Using MSP430.pdf ,
德州仪器官方例程使用的单片机是MSP430还附送了代码,本项目使用的是STM32G030,虽然代码用不上但文档还是很有帮助的
翻到第4页,看Table 1. Hall Sensor Based Motor Commutation Sequence和下面的Figure 3. Hall Sensor Based Motor Commutation Sequence (One Electrical Cycle)
上面的表格就写了State的1/2/3/4/5/6在方向为CW和CCW分别对应的霍尔UVW高低电平,Active PWMs and Power FETs的内容,建议参考第10页的Figure 7. Closed-Loop Control – MSP430 Based Implementation但注意不要被误导,坦白讲第10页开头那图PWM的对应关系比较像3个LI+3个HI的驱动器。
下面的图中以CCW为例,将上面表格的画成更直观的一幅图其中HS开头的代表每个半桥的上端NMOS栅极电平,LS开头的代表每个半桥的下端NMOS栅极电平,结尾的UVW则代表对应的半桥

图1-18

除此之外,我还另外找了一张图,也是以CCW方向为例,只不过这张图不是只绘制了一个霍尔周期,而是绘制了电机完整转一圈的四个霍尔周期
单拿出来一个周期看的话,两张图基本一致。要说有什么差异的话,那就是后来这张图明显是PWM信号加在IN上的同步调速,而8313应用报告上的图对比来说更接近PWM信号加在EN上的异步调速。

至于State的1/2/3/4/5/6和三路霍尔UVW的对应关系是否准确,以及电机转一圈是不是4个霍尔周期
大家可以试试本项目的可选霍尔信号测试电路,用手拧着正反都试试,也看看每个LED灯在手拧一圈以后亮或灭几次。
其实这就是我增加这个可选功能的初衷,只不过由于能转起来就等同于State和HALL的对应关系成立,所以定位尴尬就是了

在图中最末尾,还有一个电机每转一圈产生12个周期的FG信号,由于后续也用得到,这里先提一嘴
观察最下面的FG一条下和最上面HALL_U/V/W三条线,可以看到任意HALL信号上升沿,触发FG变为高电平产生上升沿,相应的任意HALL信号下降沿,触发FG变为低电平产生下降沿
由于三路霍尔信号在工作正常的情况下,要么两高一低,要么两低一高,就可以总结出:
电机每转一圈产生12个周期的FG信号,在霍尔信号两低一高时为低电平,在霍尔信号两高一低时为高电平
电机每转一圈产生4个周期的FG信号则要简单点,在三路霍尔信号中任选一路,高低电平随其翻转。

图1-19

现在打开CUBEMX,选择STM32G030C8T6建立新项目。
简单配置一下时钟,然后回到引脚配置上

图1-20

配置PB13(25)为输入引脚,在原理图中作为HALL_U检测引脚,连接MX3.0的HALL_U引脚检测电机霍尔信号
配置PB14(26)为输入引脚,在原理图中作为HALL_V检测引脚,连接MX3.0的HALL_V引脚检测电机霍尔信号
配置PB15(27)为输入引脚,在原理图中作为HALL_W检测引脚,连接MX3.0的HALL_W引脚检测电机霍尔信号

上面三个输入引脚保持默认配置就可以,无需内置上拉和下拉

配置PA4(15)为Tim14_CH1、在原理图中将此引脚连接至8313的IN1(27)
配置PA6(17)为Tim16_CH1、在原理图中将此引脚连接至8313的IN2(25)
配置PA7(18)为Tim17_CH1、在原理图中将此引脚连接至8313的IN3(23)

配置PB0(19)为Tim3_CH3、在原理图中将此引脚连接至8313的EN3(22)
配置PC6(30)为Tim3_CH1、在原理图中将此引脚连接至8313的EN1(26)
配置PC7(31)为Tim3_CH2、在原理图中将此引脚连接至8313的EN2(24)

点开定时器配置
激活Tim14、Tim16、Tim17,并配置通道1为PWM Generation CH1
Tim14的设置和引脚配置如下图

图1-21

Tim16的设置与Tim14略有不同,准确来说是Tim16比Tim14多出一些功能,这部分功能用不到保持默认

图1-22

Tim17的设置与Tim16一样,毕竟功能也一样

然后是Tim3,在上边的MODE把Clock Source切换到Internal Clock,把前三路切换到PWM Generation CH1/2/3

图1-23

在下边的Configuration,将Counter Setting设置完以后,Tim3的通道1、2、3也相应设置成与Tim14、Tim16、Tim17的CH1一样。

这样4个定时器的ARR都配置配置成9999,CNT将从0到9999循环。
而6个定时器通道全都设置成了PWM Generation功能PWM1模式CH Polarity高电平,当CCR的值大于CNT时,对应通道的输出引脚将输出高电平,否则输出低电平

图1-24

这样就可以通过增加的CCR值来增加占空比,或减少CCR的值来减少占空比,并且由于0=0而不是大于0,所以CNT循环到0的时候,也不会因为CCR=CNT产生高电平
Pulse(16 bits value)设为0是为了初始化时CCR的值为0,电机运转时将不断修改CCR的值来切换输出或调整PWM占空比

图1-25

现在再回到DRV8313剩余的几个引脚,说了这么多,搞定的也就IN1/2/3和EN1/2/3这6个引脚。那么下一步,设半桥1为三相中的U,半桥2为三相中的V,半桥3为三相中的W,
连接OUT1(5)引脚至MX3.0插座的U(3)
连接OUT2(8)引脚至MX3.0插座的V(5)
连接OUT3(9)引脚至MX3.0插座的W(7)

至此还剩余,
nRESET,内建下拉的输入引脚,低电平将初始化内部逻辑,清除故障,并禁用输出
nSLEEP,内建下拉的输入引脚,低电平将进入低功耗睡眠模式
nFAULT,开漏输出引脚,低电平有效需要外部上拉,指示DRV8313已进入保护(Protection)状态
nCOMPO,内部比较器开漏输出引脚,需要外部上拉,当COMPN电压大于COMPP电压时输出低电平。官方推荐用于指示过流
COMPP,内部比较器正输入引脚
COMPN,内部比较器负输入引脚

图1-26

首先是内部比较器,可用于电流限制或其他功能
Uncommitted Comparator Can Be Used for Current Limit or Other Functions

图1-27

注意看这内部框图,比较器输出接在NMOS栅极上(这种画法有时只表示输出结构是开漏的,电平逻辑没变),从名字就能看出来,是nCOMPO而不是COMPO,输出是和比较器逻辑反向的。
由于只是比较器,所以COMPP可以COMPN互换以实现nCOMPO有效电平翻转。总之COMPP大于COMPN时,nCOMPO输出低电平
比如我希望过流时,比较器输出低电平,就把COMPP(12)连接到采样电阻和PGND,COMPN(13)连接到V3P3通过两个分压电阻提供的参考电压
那么给电流设限1.5A,1.5A * 0.01Ω = 0.015V,V3P3的典型电压是3.3V,3.3V / 301370Ω * 1370Ω = 0.0150014931811394631V,得出COMPN和V3P3之间的电阻为300k,COMPN和GND之间的电阻为1.37k,理论上在电流达到1.5A时,比较器输出将由高阻变为低电平

图1-28

CUBEMX配置PB2(21)为输入引脚,原理图上连接nCOMPO(19),并联上拉电阻或开启PB2内部上拉(Pull-up)
CUBEMX配置PB11(22)为输入引脚,原理图上连接nFAULT(18),并联上拉电阻或开启PB11内部上拉(Pull-up)

CUBEMX配置PB12(23)为输出引脚,初始化低电平,并在原理图连接nSLEEP(17)
CUBEMX配置PB13(24)为输出引脚,初始化低电平,并在原理图连接nRESET(16)
nSLEEP和nRESET都内建下拉,这样不用担心上电期间和单片机初始化时MOS管误导通了

现在已经DRV8313的引脚已经全连接了,但我们还需要一些对外交互的功能
比如使能或外部占空比调整(DC),旋转方向选择(DIR),转速输出(FG),以及HALL_TEST功能的使能引脚。

图1-29

在CUBEMX配置PA1(12)为ADC1通道1,在本项目中作为DC引脚用于检测电压,提供外部启停或直接外部调整驱动信号占空比,连接RC电路以支持PWM
在CUBEMX配置PA2(13)为输出引脚,初始化高电平,并在原理图连接图中最下面那个MOS的栅极,如果想关掉HALL_TEST功能,只要让PA2输出低电平就行了
在CUBEMX配置PD2(40)为输入引脚,在本项目中作为DIR引脚,提供外部方向选择(CW和CCW)
在CUBEMX配置PD3(41)为输出引脚,初始化低电平,在本项目中作为FG引脚,在霍尔传感器信号两高一低时输出高电平、两低一高时输出低电平,或者只在单一霍尔传感器信号为高电平时输出高电平、低电平时输出低电平

至此,原理图部分已绘制完成,PCB绘制没什么门槛,就直接带过了。

图1-30

然后再回到CUBEMX,简单配置下ADC1,为了自行测速、调速

图1-30

同样简单配置下TIM1,并激活中断

图1-32


然后切换到Project Manager,点开Advanced Setting,将GPIO、TIM、ADC改成LL,RCC维持HAL不变

图1-33

这里可以看到现在定时器已经全打开了,其实这样分配并不好,如果TIM1和TIM3各出3路PWM输出,TIM14用于测速,那么现在还有TIM16和TIM17可以留着拓展功能,但作为示例,是十分合理的,毕竟既有三个定时器各出一路输出控制3个IN信号,又有一个定时器各出三路输出控制3个EN信号
然后是Advanced Setting上面的Project,可以选择项目名称、位置和生成项目类型,由于代码没变化,所以都是能用的,我因为用Keil比较多,就选了MDK-ARM

图1-34

点击这个比其他按钮都大的 GENERATE CODE 按钮 生成工程和代码

现在打开main.c文件开始写代码

图2-1

首先声明全局变量,这些变量后面会陆续用到

图2-2

先延时两秒,现在整个系统肯定稳定了,
然后开启4个定时器输出,接着启动4个定时器计数,最后开启6路定时器输出通道
如果希望禁用3个霍尔LED,在这里添加LL_GPIO_ResetOutputPin(HALL_TEST_GPIO_Port, HALL_TEST_Pin)
最后,LL_GPIO_SetOutputPin(nRESET_GPIO_Port, nRESET_Pin)拉高nRESET引脚。

接着进入while1,现在就要拿出从DRV8313芯片手册和应用报告的两张表总结出来的内容了。

图2-3

先创建一个switch语句,参数带括号是(LL_GPIO_ReadInputPort(Hall_U_GPIO_Port) & (Hall_U_Pin | Hall_V_Pin | Hall_W_Pin)),返回值是HALL_U/V/W的电平,
然后是大括号里的内容,case后面跟三个引脚的宏定义(CUBEMX生成),按照表格的内容,首先是State1对应Hall_U_Pin|Hall_V_Pin|0,省略掉0就是Hall_U_Pin|Hall_V_Pin,然后使用LL_TIM_OC_SetCompareCH把EN1对应通道的CCR变成0,把EN2、EN3对应通道的CCR变成DRV8313_ENValue,把IN1、IN3对应通道的CCR变成0,把IN2对应通道的CCR变成DRV8313_INValue
IN调制同步调速时DRV8313_ENValue大于一万,根据自测速结果或外部DC控制增减DRV8313_INValue,反之EN调制异步调速时DRV8313_INValue大于一万,根据自测速结果或外部DC控制增减DRV8313_ENValue。无论同步调速还是异步调速,这几行代码都不会改变。还需要把Hall_State变量的值设为1,设之前先判断Hall_State变量的值是否与1不同,不同则代表电机已经从一个状态来到的下一个状态,也就是转了24分之一圈,反之如果Hall_State变量的值不需要变,说明还没转过去6路PWM信号也不需要变,所以干脆把Hall_State变量的判断在最前面。
这里有一点要注意,如果Hall_State变量的值和目前的UVW信号匹配,代表电机还没到下一阶段,所以什么也不干,如果Hall_State变量预设的值是1/2/3/4/5/6其中之一,刚好上电时电机停留的位置又匹配上了,最终就是在6个IN、EN信号全是0的情况下一直什么也不干,直到电机不小心被碰了一下霍尔信号改变。所以Hall_State变量的初始值一定要是1/2/3/4/5/6以外的值,第一次进入switch虽然电机还没转,单纯获取当前状态也得算一次,然后6个CCR寄存器配置一遍。
由于CCW阶段1的霍尔信号是两高一低,FG输出高电平,然后FG_Value+1。

图2-4

然后是下一阶段,State2对应0|Hall_U_Pin|0,省略掉0就是Hall_U_Pin,同样先判断当前的Hall_State是不是2,如果不是就说明进入了下一阶段
同样先把Hall_State改成2,再使用LL_TIM_OC_SetCompareCH把EN2对应通道的CCR变成0,把EN1、EN3对应通道的CCR变成DRV8313_ENValue,把IN2、IN3对应通道的CCR变成0,把IN1对应通道的CCR变成DRV8313_INValue,CCW阶段2的霍尔信号是两低一高所以FG输出低电平,最后FG_Value+1。

图2-5

State3/4/5/6也按这个思路,最终变成这样,本质就是U/V/W三相三态半桥,轮流进行高电平半桥和高阻半桥状态互换、低电平半桥和高阻半桥状态互换,如此循环往复而已
这里先以同步调速为例,变量的预设值不修改
要让电机转起来,还需要拉高nSLEEP,暂时先不考虑太多,while(1)前面添加LL_GPIO_SetOutputPin(nSLEEP_GPIO_Port, nSLEEP_Pin),编译后写到单片机里直接开转吧

图2-6

注意现在应该已经能转了,如果不能转,检查一下原因。
为了便于排错,附件中包含已经编译好的hex文件写进去就能转,可以先排除硬件原因。hex文件的具体内容,在后面具体解释。

图2-7

现在添加调速功能,在HAL_Delay(2000)附近启动TIM1计数和中断,每隔500毫秒中断一次。

图2-8

打开stm32g0xx_it.c文件,添加外部变量

图2-9

然后修改中断函数,预先根据目标转速计算出FG_Value在500毫秒的累计值,然后和当前FG_Value值比较,同步调速时修改DRV8313_INValue,异步调速时修改DRV8313_ENValue,转速小于目标转速就加,大于目标转速就减,再清零FG_Value。加减策略其实有讲究,我这几行代码没讲究但能用。
现在重新测试,VCC电压为18V情况下,应该能达到每分2000转的,虽然占空比也快满了。

图2-10

不放心的话可以在TIM1的中断函数,把这些修改成150,最终转速稳定在1500转每分

图2-11

同步调速结束了,再试试异步调速。像上面那样把DRV8313_INValue和DRV8313_ENValue初始值互换,再像下面这样修改TIM1的中断函数,把DRV8313_INValue全替换成DRV8313_ENValue。

图2-12

然后编译,写进去,转速明显变慢了,此时占空比其实并不低。起初我以为跟每个阶段LL_TIM_OC_SetCompareCHx的执行顺序有关但并不是,看来本项目用的这个电机,并不适合异步调速,不知道异步调速在其他场合表现怎么样。
现在改回同步调速,目前为止都是CCW,现在开始CW。根据CW的State1/2/3/4/5/6和HALL_U/V/W的对应关系,把CCW的代码复制到上面,改一改变成下图这样。

图2-13

其实改的地方不多,毕竟三相半桥的三态输出情况在每个阶段还是那样,只不过霍尔信号和6个阶段的的对应关系改变了而已,由于CW和CCW的霍尔信号两高一低/两低一高情况在每个阶段正好相反,所以FG输出也正好相反。
然后把复制完未修改的CCW代码用一个#if defined(CCW)包起来,编译,写进去,它转起来了,当然方向是和刚才相反的。

图2-14
图2-15
图2-16

现在把修改而成的CW的代码用一个#if defined(CW)包起来,再将被包起来CW/CCW代码,套上检测DIR引脚电平的if/else语句,再把这些新添加的代码(总计3段),分别用#if defined(DIR)包上。

图2-17

然后从最前面添加宏定义 #define CW #define CCW #define DIR,
现在方向策略由CW、CCW、DIR宏定义调整,
CW、CCW、DIR全保留 —— 方向由DIR引脚电平决定,高电平CW,低电平CCW。
注释掉CCW、DIR —— 方向固定为CW
注释掉CW、DIR —— 方向固定为CCW

最后再回到FG引脚,市面我们见过很多带开漏输出FG引脚的自带驱动逻辑的驱动器,这些驱动器一个霍尔周期产生1个FG信号周期而不是3个FG信号周期。开漏的话没什么难度配置成开漏输出初始高电平就好,但要注意stm32g030c8t6所有IO引脚都是5V耐受也仅限于5V耐受,再高的电压老老实实推Nmos,Nmos源极接地栅极高电平时漏记输出低电平,所以FG高低电平输出要对换。
至于FG信号周期,以HaLL_U为例,改成case后面有HaLL_U的都是LL_GPIO_SetOutputPin(FG_GPIO_Port, FG_Pin),后面case没有HaLL_U的都是LL_GPIO_ResetOutputPin(FG_GPIO_Port, FG_Pin)
但FG_Value尽量不要动,为了尽可能测速精确,每个State计数一次是最稳妥的。

现在轮到最后一个外部控制引脚DC和最后一个片内外设ADC1登场了。其他引脚,还剩nCOMPO和nFAULT,直接带着nCOMPO一起吧

图2-18

首先开启ADC1,并开始一次转换,while(1)之前的LL_GPIO_SetOutputPin(nSLEEP_GPIO_Port, nSLEEP_Pin)删掉
进入while(1),当数据转换完成标志位激活时,先清除标志位,然后读取数据送入DC_Value变量并开始下一轮采集。
现在读取nCOMPO引脚电平,nCOMPO会在COMPP电压大于COMPN电压时输出低电平,如果现在是高电平就说明未过流,否则就拉低nSLEEP电平关断6个MOS
在未过流的情况下,根据DC_Value的值(0~4096),超过1.65伏(DC_Value>2047)拉高nSLEEP电平,或低于1.1伏(DC_Value<1365)拉低nSLEEP电平,介于两者之间时维持当前nSLEEP电平
是不是有点草率,其实这是给外部控制PWM占空比预留的,DC_Value低于某值拉低nSLEEP电平就是为了占空比够低时直接关闭三相半桥输出,由于这会让使用TIM1中断实现的自动测速调速功能失去意义所以没有实装
 
顺带一提当前的自主调速代码,在高电平占空比已达百分之百的情况下,如果转速未能达到目标转速,DRV8313_INValue或DRV8313_ENValue还会继续增加下去

图2-19

所以我们在第一个#if defined(DIR)前再增加一行DRV8313_INValue = DRV8313_INValue % 10010;,异步调速时换成DRV8313_ENValue,由于每次修改CCR的值之前必然经过这一句,所以不用担心变量溢出然后电机突然停转再渐渐提高转速的情况了。
好在如果目标转速设定的很低,由于高电平占空比甚至不需要到0%就已经不转了,一直停停转转下去即便不稳定也基本还在目标转速上,这样我们就不用担心了

图2-20

可能有人觉得,那为什么不在TIM1中断函数里改呢,这样代码更少效率也更高啊。缺乏创意(连忙摆手),常识就是用来打破的(理直气壮),就在while(1)里加(犟心独到)

然后是关于已经编译好的hex文件,其中包括2000.hex和20.hex。
功能是上电两秒后开始转并逐渐调整到目标转速,两个文件除了目标转速不同外没有区别。此外电机转一圈FG引脚产生12个周期,每隔15秒改变一次旋转方向,霍尔LED是全程打开的。
注意改变旋转方向时会瞬间产生大电流,其实以目前的驱动方式并不适合在旋转中改变方向,建议先停下来再倒转

另外关于2000.hex,之前我的stm32g0xx_it.c文件注释不幸变成乱码,为了抢救这几十个字的注释我掏出了之前的备份替换,毕竟stm32g0xx_it.c内容很少。不幸的是那是个还没有在DRV8313_INValue变量末尾添加%10010的版本,并且我在生成2000.hex和20.hex两个文件时还没发现这件事
所以,如果你的电压低于18V,大概率转不到2000转每分,达到百分百占空比的情况下,DRV8313_INValue变量和TIM14/16/17的CCR1寄存器还会继续增加下去,直到数值超过16位最大值65535导致CCR1溢出,电机突然不转了再渐渐提高转速,这是正常情况切莫惊慌。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
drv8313.pdf
1
2
slaa503-Sensored 3-Phase BLDC Motor Control Using MSP430.pdf
1
3
stm32g030c8.pdf
1
4
rm0454-stm32g0x0-advanced-armbased-32bit-mcus-stmicroelectronics.pdf
1
5
CUBEMX和KEIL工程文件.rar
0
6
已经编译好的hex文件.rar
0
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航