无刷电机很多地方都有,如四轴无人机电机、高速涵道风扇、硬盘电机等:
它们有三根线引出,若是有霍尔的则还有三个霍尔传感器信号引出,要想它转起来需要进行准确的电子换相,现在很多静音风扇都是采用霍尔的有感无刷驱动,比如nidec的,某米的智能风扇就是直接用nidec的自带驱动的电机。有霍尔与无霍尔的驱动其实改下电路反馈就可以通用(后文会提到)。下面介绍6种驱动的方案:
①开源的方案。简单的有mega8和C51单片机驱动。下面是Mega8的简单原理图:
Mega8电路及软件工程文件:Mega8无感无刷电路.rar
电路主要利用比较器中断进行自动换相,但是开始必须做好电机启动准备,就是给电机其中2相通电并保持几十毫秒使电机归到指定换相处,然后开环进行慢慢加速,速度起来后就可以利用mega8比较中断自动闭环换相了。
开环驱动的波形:
如上图,时间间隔为T,A相中2T时长上臂的场效应管导通,接着全部关掉等T时间,然后再下臂导通2T时间,其余的相也按上图差T或2T相位进行操作即可。其实开环(不检测换相点)也是可以让它动起来的,但是效率会很低或力矩小,而且要依据启动、加速、稳定不同阶段设定好T的大小。
上面简单说了下基本驱动步骤,做做实验玩,实际要兼容很多电机或达到好点启动效果需要调很多东西,下面说一个可以直接使用的开源电调制作:
BLHeli开源电调,下面以F330及EFM8BB1主控驱动为例,其余主控或者电路类似。
硬件设计:如果是直接使用开源程序,那么就要清楚代码里各IO是什么功能,并按它做电路。首先去网上下载“BLHeli-master”,然后确定2个问题:什么型号主控、各IO定义就可以做电路了。
先在里面的SiLabs或BLHeli_S SiLabs文件夹找到**.inc后缀的文件,里面有IC型号和IO定义(下图为BLHeli-master\BLHeli_S SiLabs\J.inc,附件中EFM8BB1电路就适用此):
先确定IC再看其IO定义,最后再看6个MOS管控制的输出极性,是高电平关闭还是低电平关闭其mos管。接着还有2件事要做:一是设计电阻反馈电路,一般按图上画即可,适当根据电源电压调整电阻比例即可,这个一般问题不大;二是设计MOS管驱动电路,因为单片机仅有0或3.3V控制输出,但是mos管却的用12V等电平信号,简单的就是采用上臂全为P管下臂为N管,这样控制上臂导通只要单片机IO输出处再加个三极管即可控制,如上面mega8驱动电路图。此外可以用驱动芯片驱动全N管,如FD6288为三相驱动全N管,其输入高(3.3-5V)即可控制对于mos管导通,0则关闭(FD6287则是下臂为负逻辑功能,0表示导通)。
当然也可用IR2101之类的,但注意一点即可:要与IC定义的控制极性一致。此外很重要一点就是IO定义要与硬件一致,不然会导致启动抖动、启动失败。
上图为F330的电路,适用SiLabs下的Turnigy_Plush_60A.inc或Turnigy_Plush_80A.inc。
软件下载:开源的代码是可以编译的,但是前提得安装那个编译环境,例如BLHeli_S SiLabs文件夹下代码就需要Silabs IDE安装到C盘,查看MakeHexfiles.bat内17行指向即可知:
SET KeilPath=C:\SiliconLabs\SimplicityStudio\v4\developer\toolchains\keil_8051\9.53\BIN
路径最后指向keil的编译exe,此时可已选择直接安装Silabs IDE或者在已安装keil C51的电脑上找到其安装文件夹下的keil_8051\9.53\BIN,再改下上面路径即可;此外SiLabs 下的(F330等C51单片机)需要Raisonance编译,网上找了一圈都没找到那软件,最后只有放弃这个的编译。
下载软件可以用Silicon 的FLASH Programing Utility或者BLHeliSuite,前者是官网下载软件,直接可以下载hex程序(Hex files文件夹内是编译好的hex),后者则是专门刷下电调的程序。两者都需要一个下载器: C8051f下载器 U-EC6,某宝上20-100多不等。支持C2下载口即可。BLHeliSuite先确保连接下载器连接再选固件下载即可:
注意不要下错固件,虽版本号一样但分MAIN、TAIL、MULTI,一般选多轴(MULTI)即可。
电调做好后启动则得遵循一定原则,控制信号必须为1-2ms的脉冲(周期可以有浮动,一般50Hz),上电启动前把PWM信号设为最小(1ms),然后启动音乐过后慢慢加大脉冲宽度(不要超过2ms),无刷电机就能动起来。
1-2ms可以网上买电调测试工具,也可以自己做,用mega8做,找一个mega8最小系统,其PC0输入0-VCC的模拟电压,PD0输出1-2ms@50Hz的PWM信号,熔丝位低位0x63,高位0xD9(hex文件在附件内)。
②DRV8301,大疆的驱动就用到这个驱动芯片,电路图如下:
不过我没试成功,SPI接口怎么写8301都不回应,难道我又买到假货了。逻辑分析仪、示波器均上了都没办法把它读取出来。于是不得不放弃了。
③JY02A,居逸无感无刷驱动芯片,看上去很牛的国产芯片,正弦驱动,听说JY01已在很多设备电机上使用(滑板车、平衡车),不过芯片好不好用得试下。Mos管驱动依旧使用FD6288:
上图左侧是CK3364驱动,右侧是JY02A,拼板的
电路做好后,一上电却怎么也启动不了,动一下又停,大概它尝试了10次后就彻底停了,但是若用手加速把电机带起来后它也能转下去,也就是启动怎么也不成功。
经过2个星期断续测试后面总算发现问题:启动失败的现象正是过流保护状态,启动瞬间电流需要大,因此在地线上会串入脉冲干扰,若地线靠近主电源回路则会产生感应电动势,此时地线电压可能会被提高,芯片Is端电压一到40mv则会进入保护从而停止,最后导致电机启动加速时就立刻停,地线并不是越宽广越好,最后断开不必要的地线(高低压单点接地)后启动正常。
但启动也不太顺,启动时有时会抖动下再转,看了说明及咨询他们技术那边都说是启动力矩过大导致,但QD启动力矩调节端参考电压从0-2.5V都没找到一个合适的,其中启动效果硬盘电机>大疆电机2512>借来的定做电机,后来还改了反馈电阻值(试了5组预想的,效果基本一致),芯片还是电路设计问题在此不作评论了。
④CK3364N,这个便宜的芯片当时没寄托什么希望,才3.5元,也是SPWM驱动(正弦波输出),刚好JY02A价格一半,不过结果却出乎我意料。其PDF资料未找到,只有网页版的,可网上搜CK3364N即可。不过这芯片在阿里巴巴上好买点,某宝那唯一的店店家一直不在线。
Mos管驱动部分不变,CK3364N直接可用于无刷无感和无刷有感的,无感的则要加个LM339比较芯片,其实无感和有感的电路主要在反馈检测这部分,若有霍尔元件则直接读取霍尔信号既可以判断电机位置及何时需换相,无感的则需利用其反向电动势组成电阻网络,在利用比较器判断。具体区别可以网上找CK3364N有感和无感的电路,怎么加减元件都有很清楚标识。如下面官方提供的图:
CK3364N的电路反馈电阻、电容等尽量按官方提供的参考电路参数,若在速度增加时出现噪声(此时反馈电路出现干扰导致换相精确时间没控制好),此时可适当减少反馈网络的滤波电容值及增大电阻值(可同比例增大,如上面原理图)。
其次根据不同电机调节启动力矩,调节RQD端的电压值,增大或减少那电阻比值。其中一相的输出如下图:
对比JY02A,CK3364N启动更加顺畅平稳,而且速度加减速那么生硬,显得平滑很多,在风扇等设备上显得更加合适。主要是其调试难度比JY02A低很多(附近可下载全部硬件电路)。
⑤DRV10983,当初选此芯片就是看上他外围简单、功率正好满足要求,谁知道最坑的也是这个芯片,电路图及PCB如下:
芯片直接支持最大28V电压,而且内置降压开关电路,加个电感就可输出5或3.3V,输出电压通过写寄存器控制。买了5片芯片,发现2片芯片IIC无法读取数据,不过这个才5.5元,难道又是拆机货或者仿品。
芯片最大电流2.5A支持小于50W的电机,我测试的电机正好最大功率40W,电压24V,上电后电机一直无法启动,一动一停的,于是把英文手册看了3遍,得出结论:还是得用其官方的上位机调节优化参数才行。但是这个等准备2个东西:一是安装labview 2014运行库及DRV10x调试软件;二是得买个USB2ANY板子,好几百。
最后我选择模仿它的上位机,用串口助手代替人机交互:软界面第一处输入数值,则利用串口软件发送 1+数值即可修改。下位机(用STM32F103控制IIC)还得对全部指令及数值进行解析,从开始到写完整整用了5个晚上,手册不知翻了多少遍了。
在完成串口交互界面后,开始测量电机参数并调节。先是对电机的电阻进行测试,再是测试计算电机的Kt值(示波器接电机其中2相,手动转到电机看电机两相间产生的正弦信号,测出幅值及周期即可算出)。设置好后电机还是转一会停一下,不过这次转的时间长了许多。
于是先把手册上的缺省值写入芯片再设定电阻及Kt值,但是怎么试都是一个效果,示波器观察发现:
脉冲增加过程中突然停下,速度刚上来一点就停下来了,于是再换个硬盘电机试了下,它居然正常转起来了,其中各EEPROM值设置如下:
MotorParam1-C9
MotorParam2-D
MotorParam3-0
SysOpt1-0
SysOpt2-D4
SysOpt3-C0
SysOpt4-BA
SysOpt5-AF
SysOpt6-FD
SysOpt7-89
SysOpt8-E8
SysOpt9-D0
初步可以确定是之前电机因功率不匹配带不起来。不是说2.5A么?不过2.5A是持续电流,电阻低的电机启动时电流远远比这个大,因此在启动加速时会突然停止加速。这芯片还真挑电机。
⑥STspin32f0,利用其FOC库驱动。芯片除了难焊一点,其余都还不错,芯片无需降压,而且集成mos驱动电路和运放,但是作为一个mcu其可用的IO并不多。
STspin32f0有官方例程,不过ST的各型号基本都支持FOC库,芯片性能越强则控制精度越高越稳定,低端的只能控制一个电机,高级点的可以控制2个电机,可自行百度找ST FOC库如何使用。官网有上位机调试软件:MotorControl Workbench,不过主要的还是调节下启动的一些参数和速度PI参数,主要参数在Drive parameters.h宏定义调节(SystemDriveParams文件夹内):
- 243行:
- /* Speed control loop */
- #define SPEED_LOOP_FREQUENCY_HZ 1000 /*!<Execution rate of speed
- regulation loop (Hz) */
- #define PID_SPEED_KP_DEFAULT 19736 //PID中P值初始值
- #define PID_SPEED_KI_DEFAULT 800 //PID中I值初始值
- #define PID_SPEED_KD_DEFAULT 0
- /* Speed PID parameter dividers */
- #define SP_KPDIV 512 //PID中P值除以的系数 越大则P的控制越弱
- #define SP_KIDIV 16384 //PID中I值除以的系数
- #define SP_KDDIV 16
- #define SPD_DIFFERENTIAL_TERM_ENABLING DISABLE //PID中微分未使用
- 电机启动参数调节(分几步开环启动及所需的时间、速度等):
- /****************************** START-UP PARAMETERS **********************/
- /* Encoder alignment */
- #define ALIGNMENT_DURATION 700 /*!< milliseconds */
- #define ALIGNMENT_ANGLE_DEG 90 /*!< degrees [0...359] */
- #define FINAL_I_ALIGNMENT 2997 /*!< s16A 2997*/
- // With ALIGNMENT_ANGLE_DEG equal to 90 degrees final alignment
- // phase current = (FINAL_I_ALIGNMENT * 1.65/ Av)/(32767 * Rshunt)
- // being Av the voltage gain between Rshunt and A/D input
- /* Sensor-less rev-up sequence */
- #define STARTING_ANGLE_DEG 90 /*!< degrees [0...359] */
- /* Phase 1 */
- #define PHASE1_DURATION100 /*milliseconds 100 */
- #define PHASE1_FINAL_SPEED_RPM 50 /* rpm 0 */
- #define PHASE1_FINAL_CURRENT 2075
- /* Phase 2 */
- #define PHASE2_DURATION500 /*milliseconds 1000 */
- #define PHASE2_FINAL_SPEED_RPM 500 /* rpm */
- #define PHASE2_FINAL_CURRENT 2151
- /* Phase 3 */
- #define PHASE3_DURATION200 /*milliseconds */
- #define PHASE3_FINAL_SPEED_RPM 1000 /* rpm */
- #define PHASE3_FINAL_CURRENT 2227
- /* Phase 4 */
- #define PHASE4_DURATION200 /*milliseconds */
- #define PHASE4_FINAL_SPEED_RPM 2000 /* rpm 2000*/
- #define PHASE4_FINAL_CURRENT 4150 //4150
- /* Phase 5 */
- #define PHASE5_DURATION2000 /* milliseconds */
- #define PHASE5_FINAL_SPEED_RPM 2000 /* rpm 3000*/
- #define PHASE5_FINAL_CURRENT 4150 //4150
- #define ENABLE_SL_ALGO_FROM_PHASE 3 //启动需几个阶段
调好启动及PI值基本就可以启动转起来,下面说下几个常用的函数:
启动:MCI_StartMotor(oMCI[0]);
停止:MCI_StopMotor(oMCI[0]);
速度设定:MCI_ExecSpeedRamp(oMCI[0], 目标速度, 1000); //1000是变化斜坡时间1s
获取运行状态:STM_GetState(oSTM);
获取电机错误状态:STM_GetFaultState(oSTM);
清除电机错误状态:MCI_FaultAcknowledged(oMCI[0]); 清除完才可继续转。
若要用MotorControl Workbench 5.2.0上位机联机调试最好屏蔽工程中main.c中61行的宏定义#define EXAMPLE_POTENTIOMETER,以便确保串口发送指令控制速度。
总得来说ST的FOC库驱动声音最小,灵活性也是最大的,要说简单的话肯定JY02A和CK3364N最简单,无需任何程序直接可用。追求速度的还是建议用开源的BLHeli固件,方波驱动,动力强速度响应极快;追求静音的话的考虑下正弦驱动的,要做好做稳定还是建议ST的FOC库,STM32F4芯片性能强大完全能应付。若节约时间及物料成本则CK3364N是不错的选择。下面是全部的软硬件资源,仅供学习。
STspin32f0官方例程.zip ST MotorControl Workbench5.2.zip BLHeliSuite-master.zip BLHeli-master.zip [ 此帖被ly7317090803在2018-11-20 19:48重新编辑 ]