小时候玩过四驱车的都知道,玩具里面的小马达长什么样。这次BLOG就是说小马达的事。现在小马达都升级了,安装了减速器和编码器。我在网上找到这个图片。见图1
图1 直流电机
这种小直流电机 ,6V电压就能正常驱动,3V也能动,就是慢,12V就很猛了。总之转速与扭力与电压成正比。
前面带齿轮部分就是减速器,它有一个固定的减速比值。
后面转盘与两个传感器组成编码器。
这次要谈的是电器部分。
一、编码器
编码器不是什么神奇的东西,它不能返回速度值,也不能返回转动角,也不返回正转反转的信号。我们要从它能够返回的信号中,设法解析得到我们需要的值。
编码器有光电的,有磁感的。我这个是磁感的。
这电机上的编码器与手摇编码器不同。
手遥的比较灵敏,这是因为两个传感器比较靠近,即它们到圆心的夹角比较小。例如30度。
本文的这个电机,两个传感器到图心的夹角是90度。见图2
图2 电机的编码器分析
C1和C2是传感器(霍尔元件的集成电路)。它输出的是一个开关量,假设感应到磁极时会输出高电平,否则输出低电平。(就像我们假设从正电到负电流向就是电流方向,实际上电子是从负电出发流向正电,但不影响我们研究。)单个的电路图见图3,PCB见图4。
我没有磁极检测仪器,我就用万用表测其中一个输出的电压,手动转动磁盘。磁盘就是那黑色个圆盘。转到一周,得到7个高电位的点。那么,我认为有7个磁极,而且磁极对应高电压。具体,磁极是N还是S,实际哪个位置点,这些我就不管了。
下面进行分析:
主轴(先不管减速器,主轴指电机本身的轴)转一周,单个传感器出现N=7次脉冲,而正转到反转的两个输出脉冲波有相位差,如图5
图5 正转与反转的相位图
可以买一个“逻辑分析仪”(很便宜)接上ch1和ch2,电机通电5V,编码器也通电5V,就可以看到类似图5的脉冲波。(你可以在逻辑分析仪应用软件上测得波的时间,用作验证。这就不多说。)
我们还是从几何和数学角度分析。如图2。C1和C2是传感器,它们成90度夹角。k1,k2,k3...是磁极点。我们定义从减速器正面看顺时针为正转。那么编码器后面看逆时针就是正转。
我们认为磁极的夹角是A角=360/N=360/7。(约等于51度,记N=7)当k1正对着C1时,k3与C2的夹角是B角。
注意,C1与C2夹角约90度,那就是4等分圆(记M=4)。除本文以外的电机编码器,必定存在N与M,而且N与M互质。所以角B不等于0。两个传感器电位不可能同时上升(沿)或下降(沿)。
相位差,这种原理我就不谈了,不拿微积分来说事。只要知道,两个波会有时间差。
(1)当C1对上k1,正向转动 t1 时间后,k3就对上C2。那么记角速度v,那么t1 = B/v
(2)当C1对上k1,反向转动 t2 时间后,k2就对上C2。那么记角速度v,那么t2 =(A-B)/v ; A=360/N
通过C1与C2夹角,当360/M>A>(360/M-A)也得到
t1 = (A-(360/M-A))/v
t2 = (360/M-A)/v
噢,{N,M}={7,4}则可以按上述公式,如果是别的值,需要画出几何图形,再作分析。
那就是说:
1.1 正反转的检测:
正转时,我得到一个常数A/(t1*v) = A/B = (360/N)/(360/N-(360/M-360/N)) = 1/(2 - N/M) = 4 ;
反转时也得到一个常数 A/(t2*v) = A/(A-B) = (360/N)/(360/M-360/N) = 1/(N/M - 1) = 4/3 =1.3333 ;
上述这两个值,测量时是同一个变量。下面用算法说明。
算法:
我们设一个10us的定时器,当C1得到上升沿(外部中断)清零累加变量a,以后每10us让a++,当C2得到上升沿(外部中断),保存Y=a,当第二次C1得到上升沿(外部中断),记下X=a,然后重复。一段时候后,停下来。
取X/Y的值,如果X/Y>3 ,则为正转,否则为反转。
实验:
经过我的不,实测,得到两组数据:
(Data1:电压3.2V) 正转:X=318, Y=62, 则 X/Y=5.129;反转:X=289, Y=228, 则 X/Y=1.267
(Data2:电压3.2V) 正转:X=323, Y=64, 则 X/Y=5.047;反转:X=290, Y=238, 则 X/Y=1.218
精算与修订:
我认为两个传感器的角度不是标准直角,我用手机量角器app,测了,约92度。我设M=3.877
得到正转的常数=5.142,反转的常数=1.241,很接近上面的结果。反算得到
夹角角度=360/M=92.85
1.2 主轴的行程:
我们让电机转到s秒,记行程C(单位,圈),
算法:
每次启动电机,清零累加器Ints,C1每得到一次上升沿中断,让Ints++,那么主轴转动的圈数C,
公式:
得到 C = Ints/N = Ints/7
1.3 主轴转速检测:
我们让电机转到s秒,记转速W(单位,rpm,即:圈/分钟),转速与电压成正比。
算法:
利用上面算法中的10us定时器,每中断让time++,( 或者在C1的中断,time += a;)
那么得到的runTime_ms = time/100;
主轴转速:W = C / runTime_ms * 60000 (rpm)
后面结合减速比,得到输出的转速。
因为单片机内的计时有误差,所以放弃自动测速。
二、直流电机
网上的Blog都在说要注意死区,那是因为他们都在用2003,而ULN2003就是达林顿放大器。现在都是用电机驱动芯片,不用管死区。我们只用1个PWM就可以了。
例如我现在用的MX1616H,它有两点转入,一个正向PWM,一个反向PWM,需要正转时,给正向PWM,反向接地;需要反转时,正向接地,给反向PWM。我们不用管死区,芯片里面自己处理。
三、减速器
商家会给出减速比的值;大部分商家只给减速后的转速,没有减速比。
3.1 输出杆转动角
公式:
记 减速比 P
记 输出轴终点与起点夹角 R = (int)(C/P*360) % 360
( 在360度内 C = (R/360)*P, 逆转则是:R = 360*C/P )
算法:
限制C1的中断次数,记max_ints,达到后立即停机。(与下面的算法相同)
公式:
max_ints = N*C = N*P*(R/360)
3.2 (验证)减速比
我买的店,只给我额定电压(6V)下的转速 15rpm
我们可以限制每次的行程定义在N的倍数,并观察减速后的转动角。
实验:
我先让电机转动800ms,然后设定do{ Delay(30); } white(Ints<2095); ( 延时单位ms。)
输出杆“刚好转动一周”。我选的电机是很大的减速比,所以多转动几圈,输出杆也看不出变化。
行程C=300。(因为程序总误差,所以停止后最终ints=2101。电压3.2V,实际时间6.13秒,转速约10rpm)
转动了s秒。记主轴转速V0,输出杆转速V1。
减速比 P = V0:V1=( C/s ) : ( 1/s ) = C : 1
这时的C只是近似值,我找多家商家,找到最接近的减速比是 P=298
为了验证减速比,我让主轴转好几十个圈,看看能够达到设定的转动角。我们知道误差是会累积的,如果减速比不对的话,就能够看出来了。
算法:
设定R=180,再多转F圈 ( 整圈数,记 F),那么即可以设 C=(F+180/360)*P
max_ints=N*C=N*((F+0.5)*P)
上面的限制程序写成
motor_run();
do{ Delay(30); } white(read_motor_Ints()
motor_stop();
实验:
(A) R=180,F=50, 假设 P=298,则max_ints=105343,代入105340即可。
测试后发现,角度不足180,误差-20度。R=160
(B) 再测试 R=180,F=50, 假设 P=300,则max_ints=106050,代入106045即可。
测试后发现,角度大于180,误差+110度。R=290
噢,我这个电机的减速比是有小数的。大约是298.xx
我来精算一下:
(max_ints/7/P-50)*360=R
P=max_ints/(7*(R/360+50))
当 max_ints=105343, R=160时 P=298.328
当 max_ints=106050, R=290时 P=298.196
求平均,P=298.26
那么再试试R=180度,F=50,P=298.26
设 max_ints = N*P*(F+R/360) = 7*298.26*(50+180/360) =105434.9
结果,R很接近180,误差-5度。
.... 可见,即便是商家给的数值也是有大误差。
3.3 输出杆的转速
公式:
记 V = W / P
测得以上数值,很多控制都能够做到了。
(一)我们得到电机的输出杆转速V,以便后面用PID控制。
(二)我们可以检测正转和反转,在接线电机后,可以检出有没有接错线。而且对于不同型号电机,可以查出转向判断常数。
(三)对于角度控制,可以从角度,算出需要的中断次数,从而检测和控制,达到要求。也可以从停机后的中断数,算出当前输出杆的角度。
为什么要写这个?因为网上写的都是理论。但就差实际的东西。