搜索
bottom↓
回复: 934

写给四轴新人:无感无刷直流电机之电调设计全攻略

  [复制链接]

出0入0汤圆

发表于 2010-8-21 13:14:17 | 显示全部楼层
对LZ的景仰犹如滔滔江水连绵不绝又如黄河泛滥一发不可收拾
LZ好文。已经不是一般的cool可以标注。

有个问题,请教LZ。
-----------------------------------------------------------------------------------------------------------------
如果要进行毫秒极的延时,主要是利用uint SetDelay(uint t)和char CheckDelay(uint t)这两个函数来完成,分别在timer0.c的第44行和第49行。具体要怎么做呢,下面我们来看一个情景分析。假设我现在要延时100ms,就应该这么写:
unsigned int a;
a = SetDelay(100);
while (!CheckDelay(a));
当前的全局变量CountMillseconds有可能为任意值,我们就假设当前的CountMillseconds =12345好了。先调用SetDelay(100),返回12345+100-1到a中,a的值就为123444。然后再在while中反复调用CheckDelay(a),返回值为(12444- CountMillseconds) & 0x8000 >> 8,现在CountMillerseconds=12345,故返回值为0,继续在while里循环。当时间渐渐过去,CountMillseconds会渐渐变大,到过了100ms后,CountMillseconds的值会走到12445,由于无符号整形数减法的特性,(12444- CountMillseconds)会借位而产生一个非常大的数,然后这时候就会返回非零,退出while循环。而且由于无符号数加法的特性,即便在调用SetDelay时CountMillseconds已接近65535了也没有关系,读者可自行理解。第54行的void Delay_ms(unsigned int w)函数帮你把这三句话都集成到一个函数中了。
------------------------------------------------------------------------------------------------------------------
w 为 uint, 则最大可为65535。如CountMillerseconds=0,则t=0+65535-1=65534,根据(((t - CountMilliseconds) & 0x8000) >> 8);有(0b1111111111111110&0b1000000000000000)  >> 8 = 0x80,此时不等于0,根据 while (!CheckDelay(akt));于是延时结束。这样并不能实现延时65535ms。根据代码,有一个前提应是要求延时时间应小于或等于0x800000000方可。

以上为我个人理解,可能考虑不周有误,请LZ和各位网友多多指正。

如果以上理解正确,则在V0.41版本BL-CTRL中的main.c文件第140行的void Wait(uchar dauer)函数完成微秒级(原文处误拼成了”极“延时,不是挑刺,只是为了这样一篇好文章更完美)的延时时间输入参数也同理应为小于或等于8位char的一半,即128.

不知以上对否?

还有56页,第10行中间“若一切都每哟问题,则运行第102行”中“没有”拼成了“每哟”。没有其他意思,只是觉得文章写得太好了。不忍心看到一点瑕疵。

出0入0汤圆

发表于 2010-8-22 17:07:21 | 显示全部楼层
lijieamd兄实验功底很强啊。照这样看,比较器如果一直处在比较工作状态是不对的了。因为在上管PWM,下管ON的工作模式中,会带来过零误判的问题。我得去看看4AXIS的BL-CTRL实际代码,再来讨论。

出0入0汤圆

发表于 2010-8-22 18:05:51 | 显示全部楼层
【楼主位】 timegate 墨鸢

攻略的69页中间原文如下:
-------------------------------------------------------------------------------------------------------------

(2)第334~446行:测试六个MOSFET 的短路特性。
(main.c的void MotorTon(void)函数的第334~346行有两个用意:一是看看是否有管子已被击穿,二是看看场效应管的开关特性是
否足够陡峭。现分析如下:第336,337行打开A相的下单臂(即NA-管),并测一下电流。此时,电流应该是极小,但是如果测到大电流,则说明NA+管已是击穿状态。然后第338~340行先关断所有管,然后延时一下,再打开A相的上单臂,在第341行测电流时也应该是极小,如果测到大电流,说明可能有两种情况:1. NA-场效应管已是击穿状态,2. NA-场效应管的下降沿过于缓慢,以至于NA+都打开了,NA-还没彻底关断。如果测到大于0.5A的大电流,不管哪种情况,都会在343行将局部变量anz设为4,表明故障点,并通过串口发给上位机。
--------------------------------------------------------------------------------------------------------------------

V0.41版本BL-ctrl相应代码如下:
334: for(i=0;i<t;i++)
335:    {
336:      LOW_A_EIN;
337:      DelayM(1);
338:      FETS_OFF;
339:      Delay(5);
340:      HIGH_A_EIN;
341:      DelayM(1);
342:      FETS_OFF;
343:      if(Strom > grenze + RuheStrom) {anz = 4; uart_putchar('4'); FETS_OFF; break;}
344:      Delay(5);
345:    }
346:Delay(10000);

此段代码用来测试NA+与NA-场效应管是否已坏。但是337行调用DelayM(1)测NA-场效应管单独导通时电流,341行同样调用DelayM(1)测试NA+场效应管单独导通进电流。而DelayM(1)的返回值并没有利用起来(有利于判断是上管还是下管)。另外,343行的判断是有问题的。因为如果337行的检查没有通过,但341行的检测通过了,即上管的strom不满足> grenze + RuheStrom,但下管的strom满足> grenze + RuheStrom满足,则此段程序仍然视为通过检测。所以,如果上管导通时,电流变大,说明下管关断能力不强或是已坏。当关断上管,轮到发信号给下管使其导通时,尽管可能下管已坏,但如果上管关断得好,此时测得电流并不大。会被视为A的上下管都没有问题,通过。实际上上管存在问题。这个可能性是存在的。

所以,判断语句最好应使用上下管测得的最大电流值作为判断依据。即343行判断语句中不应使用Strom,而应使用Strom_max,而且在使用前和使用后应对Strom_max清零。以便取得的是A管上下管测试时取得的最大电流值,且在对B管进行测试前清零。

以上不知妥否?

出0入0汤圆

发表于 2010-8-23 00:15:04 | 显示全部楼层
攻略的69页第二部分从(3)标题倒数3行:
    “之后365~363行”
应改为
    “之后的348到363”。
------------------------------------------------
只是觉得文章写得太好,不忍心看到瑕疵而已。

出0入0汤圆

发表于 2010-8-23 07:47:30 | 显示全部楼层
【100楼】 timegate 墨鸢
关于us级的延时,有一点不同的想法
-----------------------------------------------------------------------

又看了一下源代码,觉得你说的没错,这里毫秒级的最大延时确实只能达到0x7FFF,微秒级的延时也只能达到127,谢谢指正!

-------------------------------------------------------------------------------------
us级的算法是{(CountMilliseconds当前值+要延时的时间t-1)-CountMilliseconds不断递增的当前值},这个结果的最高位为1时即认为延时时间已经到了。

以四位二进制数为例:

延时时间            T0(us级)
t                 CountMilliseconds(当前值)                    
0b1000                       0b0010                             

有0b0010+0b1000-0b0001=0b1001

在CountMilliseconds跳变到0b1001前,都有{(CountMilliseconds当前值+要延时的时间t-1)-CountMilliseconds不断递增的当前值}的结果的最高位为0
在CountMilliseconds跳变到0b1001时,结果仍然为0.
直到CountMilliseconds跳变到0b1010时,结果才为1.
所以貌似延时五位二进制数的一半可以满足要求。
如果以上分析正确,则延时17位进制数的一半时间即0x8000,仍然是满足要求的。

出0入0汤圆

发表于 2010-8-26 22:37:28 | 显示全部楼层
回复 【119楼】 timegate 墨鸢
----------------------------------

好,My pleasure.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 06:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表