很早之前就想做一款无刷电机操控器,忙于作业一向没有弄。最近有点时刻画板,打样,焊接,调试,总算顺畅的转起来。期间也遇到许多问题,上网查资料,自己量波形前前后后搞了差不多近一个月,(中心又出差一周)总算搞的差不多了,特意写个总结。
板子外观100*60mm 中等巨细。DC 12V输入,规划最大电流10A.(实践没试过那么大的电机,手头的电机也就5 6A的姿态)硬件上能够切换有感(HALL)和无感(EMF)两种形式,外部滑动变阻器调速 预留有 PWM输入、刹车、正回转、USB和uart等接口。
先来说下原理无刷电机实践上的意思便是直流电机,和传统的DC电机是相同的,仅仅把有刷的电滑环变成了电子换向器。
由于少了电滑环的冲突所以寿数静音方面有了很大的提高,转速也更高。
当然难点就在怎么获取当时转子的方位好换相,所以又分为两种有感和无感。
有感便是在电机端盖的部位加装霍尔传感器别离相隔30度或60度。无感便是靠检测悬浮相的感应电动势过零点(后边在细讲)。
当然各有各的优缺点,有感在低速方面好,能够频频启停换相。无感的结构相对比较简略成本低,航模上使用居多。
先说有感,电源首要被分成了3个绕组U V W这个交流电仍是有差异的。
它仅仅3个h桥按必定的次序导通模仿出来的,实质仍是直流电。电机靠hall方位按必定次序换相,转速与电压电流有关。这一点牢记,不是换的越快转的越快。(方位决议换相时刻,电压决议转速)一般调速便是调电压,6步pwm办法是现在常用的。当然后续还有foc等更好算法。
硬件部分网上底子都是老练的计划。三相H桥,H桥一般有上臂mos和下臂mos组成,假如仅仅简略的做演示上臂选pmos下臂选nmos操控电路简略直接用单片机的io就能够驱动。可是pmos低内阻的价格高。功率上面很难做大。
这也便是为什么底子一切的商业操控器满是nmos的原因。
可是上臂用nmos存在一个问题vgs操控电压大与vcc 4v以上才干彻底导通。为了简化电路采用了ir公司出的驱动ic,它内部有自举升压电路。外部仅需一个续流的二极管及储能电容即可。
有感形式操控相对简略,3个霍尔传感器输出一般都是数字信号,分压后直接接单片机io。
当然操控办法上也就简略许多,三个霍尔接中止输入,在中止处理程序中依据组合状况换相,程序上也没什么杂乱的。主程序 一向检测ad值,改动pwm占空比,及电流维护等。
如下一个典型的换相代码。Stm32 有两个高档定时器tim1 tim8 能够输出4组互补型pwm,还能够设定死区时刻等,使用上十分便利。
switch(step)
{
case 4: //B+ C-
TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Disable);
TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Disable);
}
下图为uvw三相的霍尔检测到的电平及w相的波形。
下图为 uvw三相波形及w相霍尔电平
下图为 w相电平, w相上臂on 下臂pwm ,w相霍尔信号。
下图为w相ir2304芯片输出,上臂电压可显着看到已高于vcc,下臂为pwm信号
在说说无感形式,由于没有了霍尔,电机无法知道转子当时的方位所以就无法换相,而感应电动势也只需在转起来之后才有,所以无感形式的发动是个难点。
一般办法都是分三段法:1 预定位 2 发动 3 进入闭环反应
正如网友说的江湖一层纸,戳破不值半文钱。
1. 预定为便是强制给某一相通电一段时刻,让电机定位到这个方位。占空比30-50%不要太大,可能会发热。
2. 发动,便是逐渐的强制换相,当然要有个加快的进程,使电机转起来。
这样的一个进程太慢会颤动回转,太快会丢步。参数需求一点点试,有点像操控步进电机。要能使电机转的能发生电动势,我也是参照的德国MK 电调的算法。
每次延时时刻比上一次少1/25,构成一个加快的进程,直到电机彻底转起来发生满足的电动势。
3. 闭环反应操控换相跟有感差不多相同。
speed_duty=30; //30% start
BLDC_PHASE_CHANGE(Step[Phase]); //固定一相
Delay_MS(200);
speed_duty=pwm;
timer = 300;
while(1)
{
for(i=0;i
{
Delay_US(120); //等候
}
timer-= timer/25+1;
if(timer
{
if(TEST_MANUELL)
{
timer = 25; //开环强制换向
}
else
{
bldc_dev.motor_state=RUN;
break;
}
}
Phase++;
Phase %= 6;
BLDC_PHASE_CHANGE(Step[Phase]); //
}
提到感应电动势许多人不明白,先来说说电流,电机线圈的内阻一般很小比方0.2欧,电机的电压比方10v,按理来说电流100a为何电机不烧哪?
其实电机线圈在通电的一会儿并不是彻底导通的,由于有反向电动感应势的存在,可能有-9.8v。10v-9.8v = 0.2v /0.2 = 1A.这样算起来电流还合理。
在说说那个初中学习的法拉第 ,当线圈切开磁场时会发生感应电动势,依据右手定则。。。。。。。。不明白的自行上网搜。
如下图当ac相在通电12v的情况下,停止状况下正中心中性点理论为6v,可是转起来就不必定了,由于b相实践是在切开磁场,是会发生电动势的。而电动势的巨细正负取决与当时在磁场ns极的方位。当切开ns时为-1,切开sn时为1,平行时为0.
使用这一特性不就刚好能够得到转子的方位吗?
首要检测电路网上现已一大很老练了。
如下图,当然许多时分需求在4.7k对地的电阻上并一个100nf的电容,做一个低通滤波。也能够在软件中做滤波处理。
咱们所要做的便是检测这个悬浮相的电动势过零点。
网上常用的两种办法:1 单片机ad收集;2 比较器比较。我挑选了比较器lm339价格现已很廉价了,在高速上比ad有显着优势,只需比较cin bin ain 与n点的压差即可取得零点。
抱负很完美,实践很严酷,实践中底子得不到这么完美的波形。
如下图,这个现已是比较好的了,仍是有许多毛刺。这个给单片机中止,必定一大堆问题,严峻的换错相烧mos管。
为何会有这些毛刺哪,有些还挺有规则。
参阅了网上的介绍,这中心还有一个叫消磁的东西。
原理不深究了,横竖时刻很短,软件上做一个滤波消掉就能够了。
进入中止函数后做如下处理 ,定时器的中止我暂时用的20us。
const unsigned int FilterNums = 0xff;
static unsigned int nums =0;
static unsigned int Queue_UStatus =0;
static unsigned int Queue_VStatus =0;
static unsigned int Queue_WStatus =0;
static unsigned char EMF_SVal =0;
unsigned char Filter_U_Status=0;
unsigned char Filter_V_Status=0;
unsigned char Filter_W_Status=0;
unsigned char EMF_Val=0;
unsigned int status_h;
unsigned int status_l;
unsigned int Delay30deg =0;
if ( TIM_GetITStatus(TIM3 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
至于网上说检测到过零点后,延时30度换相,对电源功率有影响。我试了下,如同没什么显着的差异。也有人说在大功率的电机下不延时反而更滑润等等。实在怎样有待各位实践试验了。
最终秀几张转起来的相片
硬盘电机 无感形式
电动工具电机 有感形式
加装散热片的姿态