电子说
步骤1:准备
步骤2:工具和材料
工具
数字万用表(DMM)-如果您的DMM具有频率计示波器(最好具有至少2个通道)《
T8 Torx驱动程序(您需要其中之一来打开任何硬盘驱动器)。一个好的硬件商店就会有它们。
机器商店和Rapid Prototype Machine(这些工具非常有用,但是我有点机灵,我认为没有它们就可以完成该项目)。
材料
计算机硬盘驱动器上的BLDC电机
另一个硬盘驱动器上的磁环(电机的一半)。
硬盘驱动器上的几(3-6)个银盘
一秒钟小型电机(直流刷过OK)
橡皮筋或(最好是)皮带,用另一台电机转动BLDC
电子面包板
实心线22 AWG用于面包板连接
一个Arduino Duemilanove微控制器
三个120 k欧姆电阻
六个〜400欧姆电阻
线性或旋转电位计100 k欧姆
ST Microelectronics L6234三相电动机驱动器IC
两个100 uF电容器
一个10 nF电容器
一个220 nF电容器
一个1 uF电容器
一个100 uF电容器
三个整流二极管
一个2.5安培保险丝
一个保险丝座
3 Honeywell SS411A双极霍尔效应数字正弦波在传感器上
三个1 K电阻器
注意:Mike Anton已设计并正在销售一种产品,该产品将代替本使用说明中显示的电力电子和霍尔传感器电路(它使用反电动势感应控制)。规格和购买信息可在以下两个链接中找到:https://www.tindie.com/stores/manton/http://manton.wikidot.com/open:bldc-motor-driver
12 V爱好型铅酸电池
步骤3:了解BLDC控制
如果您要执行此项目,我建议您花一些时间彻底了解BLDC的工作原理和控制方法。在线有大量参考资料可供参考(有关一些建议,请参见下文)。但是,我确实提供了一些来自我的项目的图表和表格,这些图表和表格可以帮助您理解。
这里列出了我认为对理解该项目最重要的概念:
MOSFET晶体管
三相半桥
三相电动机的六步换向《脉冲宽度调制(PWM)
霍尔效应数字位置传感器
Microchip无刷直流电动机基本原理AVR443:ATMEL的基于传感器的三相无刷直流电动机控制
》 Microchip的无刷直流电动机控制轻松实现,带飞思卡尔霍尔传感器的三相BLDC电动机控制
一个很好的视频,展示了一个扫气式硬盘电动机,但作者似乎将电动机作为步进电动机运行,不作为BLDC4上L6234电动机驱动器IC上的更详细的参考资料
网页,包括数据表,应用笔记和购买信息。免费样品http://www.st.com/stonline/domains/buy/samples/index.htm
用于混合动力电动汽车应用的PM无刷电机驱动器的设计。这是我发现的唯一描述再生制动换向顺序的论文。
这篇论文《电动汽车的再生制动》很有用,我从中借鉴了一些数据,但我认为它错误地描述了再生的工作原理。
步骤4:电机
我使用打捞的磁盘驱动器电机完成了这个项目,因为它很容易实现,而且我喜欢学习BLDC的绳索的想法使用小型低压电动机进行控制,不会造成任何安全问题。另外,霍尔传感器的磁体的配置也非常简单,它使用了第二个电动机的磁环(转子)(请参见步骤4)。
如果您不想全部在安装和校准霍尔传感器时遇到麻烦(步骤5-7),我知道至少有一些CD/DVD驱动器电机内置了霍尔传感器。
要在电动机上提供一些旋转惯量并给它们一点点要承受的负载,我在电机上放了5个硬盘驱动器磁盘,轻轻地粘在一起,并用少许强力胶粘到了电机上(这使飞轮进入了我的原始项目)。
如果要卸下电机从硬盘驱动器上,您将需要一个T8梅花形螺丝刀来拧开外壳(通常在中心有一两个螺钉,这些螺钉隐藏在粘贴式标签的后面),以及用于将电动机固定到位的内部螺钉。您还需要卸下磁头读取器(音圈致动器),以便卸下存储磁盘才能到达电机。
此外,您还需要另一台相同的硬盘驱动器电动机,从中卸下转子(内部有一个磁铁环)。为了将电动机拉开,我用虎钳夹住电动机的转子(顶部),然后用两把螺丝起子分开180度,在定子(底部)上撬动。将虎钳固定在虎钳中而不变形不会那么容易。为此,您可能需要构建一组木制的V型块。
我在车床上的磁环上钻了一个孔,以便将其紧密地安装在电动机的顶部。如果您无法使用车床,则可以使用强力胶将倒转的转子固定到电动机上。
下面的照片2和3显示了我拉开的其中一个电动机的内部。在上半部分(转子)的内部有8极(用塑料包裹的磁铁)。在下半部分(定子)上有12个槽(绕组)。三相电动机的每一相都有4个串联的插槽。
某些HD电动机的底部有三个触点,每一相一个,还有一个是电动机的中心抽头(其中三个相遇)。在此项目中,不需要中央分接头,但在无传感器控制中,它可以派上用场(我希望这些天之一可以发布有关无传感器控制的说明)。如果您的电动机有四个触点,则可以用欧姆表识别相。电阻位于中心抽头和相位之间,是两相电阻的一半。
关于BLDC电动机的大多数文献都涉及梯形反电动势波形,但硬盘驱动器似乎具有看起来为正弦的反电动势(请参阅参考资料)。下图)。据我所知,虽然效率可能会有所降低,但使用方波PWM驱动正弦电动机效果很好。
与所有BLDC电动机一样,该电动机由三相半电动机驱动-晶体管桥(请参见下面的第二张照片)。我将ST Microelectronics(L6234)制造的IC用于电桥,也称为电机驱动器。 L6234的电气连接在步骤8中显示。下面的第三张照片显示了电动机驱动器和三个电动机相位的示意图。
为了使电动机顺时针运行,将按照以下顺序进行切换(第一个字母为上方的晶体管,第二个字母为下方的晶体管):
第1步3 2 5 6 6顺时针:CB ,AB,AC,BC,BA,CA
逆时针方向:BC,BA,CA,CB,AB,AC
此6步序列需要360度“电度”,但对于这些电机,仅90物理度。因此,该序列每电动机旋转发生四次。看来这两个序列是相同的,但它们却不相同,因为对于6步序列中的每一步,通过相的电流对于CW而言是一个方向,而对于CCW而言是相反的方向。
您可以通过从电池或电源向任意两个电机相施加电压来亲自查看。如果施加电压,电机将向一个方向转动一点,然后停止。如果您可以按照上述顺序之一快速更改相电压,则可以手动旋转电动机。当电动机高速运行时,晶体管和微控制器非常迅速地完成所有这些切换,每秒每秒数百次。
另外,请注意,如果将电压施加到两相中,则电动机稍微移动然后停止。这是因为扭矩变为零。您可以在下面的第四张照片中看到这一点,该照片显示了一对电机相位的反电动势。这是一个正弦波。当波穿过x轴时,该相位提供的扭矩为零。在六步BLDC换向序列中,这永远不会发生。在特定相位上的扭矩变低之前,将电源切换到另一相组合。
步骤5:霍尔传感器机械设置
大型BLDC电机通常在电机内部装有霍尔传感器。如果您有这样的电动机,则可以跳过此步骤。另外,我了解到至少有一些CD/DVD驱动器电动机具有内置霍尔传感器。
三个霍尔传感器用于在电动机旋转时进行位置检测,因此换向发生在正确的瞬间。我的高清电机的运行速度高达9000 RPM(150 Hz)。由于每转有24个换向,因此以9000 RPM的换向每280微秒发生一次。 Arduino微控制器以16 MHz运行,因此每个时钟周期为0.06微秒。我不知道执行换向需要多少个时钟周期,但是即使花费100个时钟,每个换向也需要5微秒。
HD电机没有霍尔传感器,因此有必要将其安装到电机的外部。传感器需要相对于电动机旋转进行固定,并暴露于一系列随电动机旋转而变化的磁极。我的解决方案是从同一台电动机上取下磁环,然后将其倒置安装在要控制的电动机上。将三个霍尔传感器安装在此磁环的正上方,彼此在电机轴上相距30度(电动机旋转120度)。
我的霍尔传感器安装架由一个简单的支架组成,该支架由三个铝制部件组成我用快速原型机加工了三个塑料零件。如果您无权使用这些工具,那么寻找另一种制作支架的方法应该不会太困难。为霍尔传感器创建支架将更具挑战性。这可能是一种方法:
1。找到一个适当大小的塑料盘,您可以在其上小心地为霍尔传感器加环氧树脂。
2。在纸张上打印出一个模板,该模板的圆与磁环的半径相同,并且三个标记之间的距离为15度《3》。将模板粘到磁盘上,然后以模板为指导小心地将霍尔传感器涂在适当的位置。
步骤6:霍尔传感器电路
现在,您已将霍尔传感器正确安装在电动机上,将它们分别与下面所示的电路连接,并使用DMM或示波器对其进行测试,以确保输出与输出信号一样高和低。电机旋转。我使用Arduino的5V输出以5V运行这些传感器。
步骤7:校准霍尔传感器
霍尔传感器是数字设备,它们根据检测到的是南磁极还是北磁极而输出高电平或低电平(1或0)。由于它们的间隔为15度,并且磁体在其下方旋转,每45度改变一次极性,所以这三个传感器永远不会同时处于高电平或低电平状态。随着电机旋转,传感器输出以六步模式变化,如下表所示。传感器必须与电动机的运动对齐,以便三个传感器之一精确地在电动机换向位置改变。在这种情况下,第一霍尔传感器(H1)的上升沿应与相位C(高)和B(低)的组合的开启相一致。这相当于在桥式电路中将晶体管3和5导通。我用示波器将传感器与磁体对准。我必须使用示波器的三个通道来执行此操作。我通过连接到第二个电动机的皮带旋转了电动机,并测量了两个相组合(A和B,A和C)之间的反电动势,这是下图中的两个正弦波。然后,在示波器的通道3上查看来自霍尔传感器2之一的信号。旋转霍尔传感器底座,直到霍尔传感器的上升沿与换向应发生的点完全对准为止(请参见下图)。我现在意识到,只需两个通道即可进行相同的校准。如果使用相位组合B-C的BEMF,则H2的上升沿将与B-C曲线的零交叉重合。
此处应进行换向的原因是要始终保持尽可能高的电动机转矩。反电动势与扭矩成正比,您会注意到,每次换向都会在反电动势越过下一相曲线以下时发生。因此,实际扭矩由每个相组合的最高部分组成。
如果您无法使用示波器,这是我进行对准的一个想法。对于任何想了解BLDC电机工作原理的人来说,这实际上都是一个有趣的练习。如果将电动机A相(正相)和B相(负相)连接到电源并打开电源,则电动机将旋转一小段然后停止。然后,如果将负极电源线移至C相并打开电源,则电动机将转动一点然后停止。序列的下一部分将是将正极引线移至B相,依此类推。执行此操作时,电动机将始终在转矩为零的点处停止,该点在图形上与图形与x轴交叉的位置之一相对应。注意,第三相组合的零对应于前两个组合的换向位置。因此,B-C组合的零扭矩位置是您要定位H2上升沿的位置。用细标记或锋利的刀片标记该位置,然后使用DMM调整霍尔传感器安装座,直到H2的输出准确地在该标记上变高。即使您在此校准中稍有偏离,电动机也应能正常工作。
步骤8:电力电子设备
三个电机相将从L6234三相电动机驱动器。我发现它是经受时间考验的好产品。使用电力电子设备,有很多方法可以无意间炸炸您的组件,而我不是电气工程师,所以我并不总是完全了解发生了什么。在我的学校项目中,我们还用6个MOSFET晶体管和6个二极管制成了自己的三相半桥。我们将它与另一个驱动程序(Intersil的HIP4086)一起使用,但是在设置时遇到了很多问题-我们烧坏了一堆晶体管和芯片。
我运行L6234(从而运行了电动机)在12V
L6234具有一组不寻常的输入来控制6晶体管半桥。而不是为每个晶体管提供一个输入,而是为三相的每一个提供一个使能(EN)输入,然后通过另一个输入(IN)选择该相中的哪个晶体管导通(上或下)。例如,要导通晶体管1(上部)和6(下部),EN1和EN3都为高电平(EN2为低电平以保持该相截止),IN1为高电平,IN3为低电平。
尽管L6234应用笔记建议将用于控制电机速度的PWM应用于IN引脚,但我还是决定在EN引脚上使用它,因为认为将一个相位的上,下晶体管交替导通将是“怪异的”。实际上,同时打开两个相的低晶体管似乎没有错,因为它们处于相同的电势,因此任何一个都不会流过电流。用我的方法,在PWM频率上交替启用和禁用高相,而在整个换向期间保持低相导通。
下面是电机驱动器的示意图,我已经在其中添加了与Arduino开发板的引脚连接。我还在电池正极和电路之间加了一个2.5 Amp的保险丝,在电源和接地之间加了一个100 uF的电容,以减少再生电流的纹波。该图有点小,因此请查看L6234的文档以获取较大版本。
注意:Mike Anton为L6234制作了PCB,(我相信)可以代替
http://manton.wikidot.com/open:bldc-motor-driver
https://www.tindie.com/stores/manton/
第9步:再生制动
因为到目前为止我还没有找到很多有关三相电动机再生制动的信息,所以我将描述我对它的工作原理的理解。请注意,我不是电气工程师,因此请对我的解释进行任何更正。
在进行电动机驱动时,控制系统以使转矩最大的方式将电流发送到电动机的三个相中。在再生制动中,控制系统也会使转矩最大化,但这一次是负转矩,这会导致电动机减速,同时将电流传回电池。
我使用的再生制动方法来了摘自美国政府Oakridge国家实验室的论文。这个实验室对汽车的电动机做了很多研究。下图来自另一篇论文,有助于说明其工作原理(但是,我认为第二篇论文中的解释部分不正确)。请记住,电动机相位中的BEMF电压会随着电动机旋转而上升和下降。在该图中,显示了一个瞬间,其中B相的BEMF高,而A相的低。在这种情况下,电流有可能从B流到A。
再生制动的关键是低端晶体管正在快速导通和关断(PWM每秒切换数千次)。当高端晶体管开关为OFF时;当低晶体管导通时,电流如第一幅图所示流动。用电力电子学的术语来说,电路就像一个称为升压转换器的设备,能量存储在电机相中(维基百科上有一篇很好的文章解释了升压转换器的工作原理)。当低端晶体管截止时,该能量被释放,但电压更高,电流瞬间流过每个晶体管旁边的“反激”二极管,然后流回电池。二极管可防止电流从电池流向电动机。同时,沿该方向(与电动机相反)的电流与磁铁环相互作用,产生负转矩,使电动机减速。低侧晶体管通过PWM进行开关,PWM的占空比控制制动量。
在进行电动机驱动时,电动机的换向在适当的时候从一个相组合切换到下一个相组合,以保持较高的转矩。尽可能。再生制动的换向非常相似,因为一定的切换模式可以使电动机产生最大可能的负转矩。
如果您在第1步中观看视频,则可以看到再生制动有效,但是不能很好地工作。我认为主要原因是我使用的硬盘驱动器马达是一个低扭矩的马达,因此除了最高速度外,它不会产生太多的BEMF。在较低的速度下,几乎没有再生制动。另外,我的系统在相对较低的电压(12 V)下运行,并且由于通过反激二极管的每条路径都会使电压下降几伏,因此效率也大大降低了。我使用普通的整流二极管,如果使用一些具有较低压降的特殊二极管,则可能会获得更好的性能。
步骤10:与Arduino的连接
下面是arduino上的输入和输出列表。还包括我的电路板的图和照片。
2-霍尔1数字输入-还将120 K电阻连接到gnd
3-霍尔2数字输入-也将120 K电阻器连接到gnd
4-霍尔3个数字输入-同样是120 K电阻至接地5-IN 1数字输出与400欧姆电阻串联
6-IN 2数字输出与400欧姆电阻
7串联-IN 3数字输出与400欧姆电阻串联的电阻
9-EN 1与400欧姆电阻串联的数字输出
10-EN 2与400欧姆电阻串联的数字输出
11-EN 3与400欧姆电阻串联的数字输出
100 k欧姆电位计连接到+ 5V,两端接地,中间为模拟引脚0。该电位器用于控制电动机速度和制动量。
+ 5V电源也用于运行霍尔传感器(请参见步骤5)。
步骤11 :用于Arduino的控制软件
下面是我为Ardjuino编写的整个程序,并带有注释:
/*
* BLDC_congroller 3.1。 1
* by David Glaser
*
* 3.x系列程序适用于ST L6234三相电动机驱动器IC
*
*顺时针运行磁盘驱动器电动机
*带再生制动
*电机速度和制动由单个电位器控制
*电机位置由三个霍尔效应传感器确定
* Arduino接收来自3个霍尔传感器的输出(引脚2,3 ,4)*并将它们的组合转换为6个不同的换相步长
*在引脚9,10,11上以32 kHz的PWM输出(分别对应于EN 1,2,3
* 3 DO引脚5,6,7(IN 1,2,3)
*模拟输入0连接到电位计以更改PWM占空比并更改
*电动和再生制动。
* 0-499:制动
* 500-523:滑行
* 524-1023:电动
*注释了很多行,这些行用于
*将各种值打印到串行连接。
*/
int HallState1;//三个霍尔传感器(3,2,1)的变量
int HallState2;
int HallState3;
int HallVal = 1;//所有3个霍尔传感器的二进制值
int mSpeed = 0;//电动机的转速等级
int bSpeed = 0;//制动水平
int油门= 0;//此变量与模拟输入一起使用,以测量油门电位器的位置。
void setup(){
pinMode(2,INPUT);//Hall 1
pinMode(3,INPUT);//Hall 2
pinMode(4,INPUT);//Hall 3
//L6234电动机驱动器的输出
pinMode(5,OUTPUT);//IN 1
pinMode(6,OUTPUT);//IN 2
pinMode(7,OUTPUT);//IN 3
pinMode(9,OUTPUT);//EN 1
pinMode(10,OUTPUT);//EN 2
pinMode(11,OUTPUT);//EN 3
//Serial.begin(9600);//如果要使用串行连接,请取消注释此行
//还要在程序末尾取消注释Serial.flush命令。
/*在引脚9,10和11
上设置PWM频率//一部分代码来自
http://usethearduino.blogspot.com/2008/11/changing-pwm-frequency-on-arduino.html
*/
//为引脚9,10设置PWM至32 kHz
//首先清除所有三个预分频器位:
int prescalerVal = 0x07;//创建一个名为prescalerVal的变量,并将其设置为等于二进制数“ 00000111”数字“ 00000111”数字“ 00000111”
TCCR1B&=〜prescalerVal;//并用二进制数“ 11111000”将TCCR0B中的值与
//现在设置适当的预分频器位:
int prescalerVal2 = 1;//将prescalerVal设置为等于二进制数“ 00000001”
TCCR1B | = prescalerVal2;//或用二进制数“ 00000001”对TCCR0B中的值进行操作
//将引脚3,11设置为32 kHz至32 kHz(此程序仅使用引脚11)
//首先清除所有三个预分频器位:
TCCR2B&=〜prescalerVal;//与TCCR0B中的值一起使用二进制数“ 11111000”
//现在设置适当的预分频器位:
TCCR2B | = prescalerVal2;//或用二进制数“ 00000001”对TCCR0B中的值进行////首先清除所有三个预分频器位:
}
//PRGROM的主循环
void loop(){
//time = millis();
//打印自程序启动以来的时间
//Serial.println(time);
//Serial.print(“ ”);
节气门= AnalogRead(0);//油门电位器的值
mSpeed = map(throttle,512,1023,0,255);//电机映射到电位计的上半部
bSpeed = map(throttle,0,511,255,0);//锅底一半的再生制动
//mSpeed = 100;//用于调试
HallState1 = digitalRead(2);//从1号大厅读取输入值
HallState2 = digitalRead(3);//从2号大厅读取输入值
HallState3 = digitalRead(4);//从3号大厅读取输入值
//digitalWrite(8,HallState1);//当对应的传感器为高电平时LED点亮-最初用于调试
//digitalWrite(9,HallState2);
//digitalWrite(10,HallState3);
HallVal =(HallState1) +(2 * HallState2)+(4 * HallState3);//计算3个霍尔传感器的二进制值
/*Serial.print(“H 1:“);//用于调试
Serial.println(HallState1);
Serial.print(“ H 2:”);
Serial.println(HallState2);
Serial.print(“ H 3: “);
Serial.println(HallState3);
Serial.println(”“);
*/
//Serial.println(mSpeed);
//Serial.println(HallVal);
//Serial.print(” “);
//监视晶体管输出
//delay(1000);
/* T1 = digitalRead(2);
//T1 =〜T1;
T2 = digitalRead(4);
//T2 =〜T2;
T3 = digitalRead(5 );
//T3 =〜T3;
Serial.print(T1);
Serial.print(“ t”);
Serial.print(T2);
串行。 print(“ t”);
Serial.print(T3);
Serial.print(“ n”);
Serial.print(“ n”);
Serial.print (digitalRead(3));
Serial.print(“ t”);
Serial.print(digitalRead(9));
Serial.print(“ t”);
串行.println(digitalRead(10));
Serial.print(“ n”);
Serial.print(“ n”);
//延迟(500);
*/
//电机换向
//每个二进制数都有一个对应于打开的不同晶体管的情况
//位数学用于更改输出的值
//对于本教程在Arduino的位上:http://www.arduino.cc/playground/Code/BitMath
//PORTD包含L6234驱动器上的IN引脚的输出
//,该输出确定是高位还是低位使用各相的晶体管
//EN引脚的输出由Ard控制uino命令AnalogWrite,其中
//设置PWM的占空比(0 = OFF,255 = ON或由电位计控制的油门值)。
if(throttle》 511){
开关( HallVal)
{
案例3:
//PORTD = B011xxx00;//引脚0-7 xxx的所需输出是霍尔输入,不应更改。
PORTD&= B00011111;
PORTD | = B01100000;//
AnalogWrite(9,mSpeed);//A相上的PWM(高端晶体管)
AnalogWrite(10,0);//关闭B相(占空比= 0)
AnalogWrite(11,255);//C相导通-占空比= 100%(低压晶体管)
断开;
情况1:
//PORTD = B001xxx00;//引脚0-7
的所需输出PORTD&= B00011111;//
PORTD | = B00100000;//
AnalogWrite(9,mSpeed);//A相上的PWM(高端晶体管)
AnalogWrite(10,255);//(低端晶体管)上的B相
analogWrite(11,0);//关闭阶段B(占空比= 0)
中断;
情况5:
//PORTD = B101xxx00;//引脚0-7
的所需输出PORTD&= B00011111;//
PORTD | = B10100000;
模拟写(9,0);
模拟写(10,255);
模拟写(11,mSpeed);
中断;
情况4:
//PORTD = B100xxx00;//引脚0-7所需的输出
PORTD&= B00011111;
PORTD | = B10000000;//
模拟写(9,255);
模拟写(10,0);
模拟写(11,mSpeed);
中断;
情况6:
//PORTD = B110xxx00;//引脚0-7所需的输出
PORTD&= B00011111;
PORTD = B11000000;
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !