amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 3947|回复: 30

分享:无感BLDC启动源码(基于英飞凌AP08018可变电感感应法)

  [复制链接]
发表于 2015-12-17 09:37:58 | 显示全部楼层 |阅读模式
网上找的,没用过英飞凌,编译可以通过,不知是否能用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2015-12-17 10:31:09 | 显示全部楼层
不懂帮顶,希望高人评价一下。
发表于 2015-12-17 13:33:36 | 显示全部楼层
什么编译器
 楼主| 发表于 2015-12-17 15:02:17 | 显示全部楼层

程序里有说明,Keil C51
 楼主| 发表于 2015-12-18 09:52:48 | 显示全部楼层
传两篇隐极永磁同步初始角检测相关文章

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2015-12-18 17:29:19 | 显示全部楼层
反证法,如果很好用,那现在还讨论什么启动?
 楼主| 发表于 2015-12-19 09:17:27 | 显示全部楼层
mandylion2008 发表于 2015-12-18 17:29
反证法,如果很好用,那现在还讨论什么启动?

难得大神围观,留下点干货呗
发表于 2015-12-19 11:00:20 | 显示全部楼层
本帖最后由 mandylion2008 于 2015-12-19 11:53 编辑
xiangyuan_122 发表于 2015-12-19 09:17
难得大神围观,留下点干货呗


把BLHELI研究透,在这个经验基础上,做出适当改进就行了!
很少看到有人通读整个程序,倒是很多人说汇编难读,就这种态度和恒心是搞不了深一点的技术的。我自己为了多多吸收别人的优点,是把整个BLHELI通读和试验了的,所以才能知己知彼。本来想就BLHELI的软件架构和具体的关键函数在论坛上传的,我相信以自己的表达方式将是非常直接了当容易理解的,可后来想想还是算了,我相信99%的人得到后都会说,我早就知道了。





 楼主| 发表于 2015-12-19 11:07:18 | 显示全部楼层
mandylion2008 发表于 2015-12-19 11:00
把BLHELI研究透,在这个经验基础上,做出适当改进就行了!
就像数学一样,聪明的人可以从一点点已知的条 ...

BLHELI也不是哪里都适用吧,电调上用一般也够了,但带重载也可以吗?比如压缩机?
发表于 2015-12-19 11:15:56 | 显示全部楼层
xiangyuan_122 发表于 2015-12-19 11:07
BLHELI也不是哪里都适用吧,电调上用一般也够了,但带重载也可以吗?比如压缩机? ...

世界上从来没有可以照搬的东西。
我可以负责任的说,BLHELI的启动经过改进是可以启动压缩机的带载启动的,但这种情况下,用电感法最好!
发表于 2015-12-19 20:25:13 | 显示全部楼层
感谢楼主,这个启动是类似这个帖子说的http://www.amobbs.com/thread-5626901-1-1.html无预位置?
 楼主| 发表于 2015-12-20 09:23:15 | 显示全部楼层
R88 发表于 2015-12-19 20:25
感谢楼主,这个启动是类似这个帖子说的http://www.amobbs.com/thread-5626901-1-1.html无预位置? ...

是的,我也是看这个的,里面提供了一篇原理性的论文我觉得不错,但没有源码,英飞凌的这个源码算法和那篇帖子的类似,文档里有流程图,可以让刚接触电感(铁芯饱和效应)法的了解其实现
 楼主| 发表于 2015-12-20 09:35:27 | 显示全部楼层
mandylion2008 发表于 2015-12-19 11:15
世界上从来没有可以照搬的东西。
我可以负责任的说,BLHELI的启动经过改进是可以启动压缩机的带载启动的 ...

如果单纯说可以,三段式同样可以启动,但要效果好,适应的范围广,我认为还是基于铁芯饱和的电感法,从原理上来看其算法鲁棒性确实比较好,跟电机参数关联不大,不需要电机凸极效应,主要比较几种通电模式下电流大小即可,当然,我还没具体去做,具体实现过程中有哪些问题会影响其适用性还不知,如果你认为电感法不可行,想必也是有遇到这方面的问题,你也可以提出来一起探讨。
发表于 2015-12-20 10:39:48 | 显示全部楼层
xiangyuan_122 发表于 2015-12-20 09:35
如果单纯说可以,三段式同样可以启动,但要效果好,适应的范围广,我认为还是基于铁芯饱和的电感法,从原 ...

情况是这样的,因为很多人连方波都没有真正搞好,去谈论电感法没什么意义。
方波启动做好了,启动个压缩机真的没什么问题,我都给朋友试过了(很多高手都在论坛,我知道乱吹牛会被人鄙视的,我在外面跟搞技术的人交往,我是极其的低调,有时会让人产生轻视的感觉,但我感觉良好,因为如果搞的很高调,人家就不会说出一些有用的东西了,哈)。
我觉得应该在有一个扎实的基础上再去提高,不然一说什么都懂,一旦要拿出个可以实用的算法又不行,高校里面的人很喜欢这样,我不太喜欢这样,我要的是实践派风格。
对于电感法的启动,根据我以前做车用控制器的经验,可以做到重载零速启动,保证100%可靠,因为这个方法不同于公开的资料,应当是比较有价值的,所以很少提及。
发表于 2015-12-20 14:10:16 | 显示全部楼层
mandylion2008 发表于 2015-12-20 10:39
情况是这样的,因为很多人连方波都没有真正搞好,去谈论电感法没什么意义。
方波启动做好了,启动个压缩 ...

膜拜下大湿
发表于 2015-12-20 14:52:04 | 显示全部楼层
哈哈,强烈期望mandylion2008大侠稍微点拨一下,适可而止既可,就一个问题,无刷直流电机带重载起动,方波算法,讲讲大概思路,谢谢,非常感谢。
发表于 2015-12-24 15:47:58 | 显示全部楼层
mandylion2008 发表于 2015-12-19 11:00
把BLHELI研究透,在这个经验基础上,做出适当改进就行了!
很少看到有人通读整个程序,倒是很多人说汇编 ...

哥!!!多么希望你还是讲讲BLHeli吧,就像写《电调攻略》那样的干货出来,BLHeli好难看懂啊 !
发表于 2016-8-14 22:39:47 | 显示全部楼层
感谢无私的分享!
发表于 2016-8-15 09:07:24 | 显示全部楼层
谢谢分享
发表于 2016-9-23 21:21:46 | 显示全部楼层
不错的资料,好好研究一下
发表于 2016-9-23 21:22:08 | 显示全部楼层
不错的资料,一定要好好学习一下!
发表于 2016-10-4 13:51:02 | 显示全部楼层
这个是可以准确的判断电机初始位置的,只是启动的第一步。
发表于 2016-10-5 19:50:58 | 显示全部楼层
留个记号
发表于 2016-11-14 15:20:03 | 显示全部楼层
a409600516 发表于 2015-12-24 15:47
哥!!!多么希望你还是讲讲BLHeli吧,就像写《电调攻略》那样的干货出来,BLHeli好难看懂啊 ! ...

慢慢看,就是汇编看起来有点生涩,,
发表于 2017-2-7 20:13:17 | 显示全部楼层
文档值得一看
发表于 2017-2-7 20:27:24 | 显示全部楼层
mark                     
发表于 2017-2-19 15:11:04 | 显示全部楼层
mark。。。。
发表于 2017-2-20 22:52:18 | 显示全部楼层
本帖最后由 zlf66778899 于 2017-2-20 22:56 编辑

对定位函数分析了一下,请高手斧正
//*********************************************************************
//* This function detects the rotor position.  It's input parameter is
//* the previous rotor position.  It returns the current rotor position
//*********************************************************************
/*
!!!注意!!!
!>HallPatt数组的值是8进制数字
!>steady = 1时, 不产生变化的相未进行电流比较,但x和z的移位还是执行了


steady 为0时,顺次通过对ACB三相加以正反向脉冲电流的比较结果组合生产相应的位置
steady 为1时,则
        a> 先取得对应sense位置的下一预期位置与sense位置比较会产生变化的一相,
  b> 并对该相加以正反向脉冲电流取得比较结果
        c> 根据比较结果来判断是当前位置是sense位置还是sense的下一预期位置
对steady为1时举例,调用zerostart_sensor(2, 1)的情况如下
        a> y = ((HallPatt[2] & 7) ^ 2) & 7 = ((023 & 7) ^ 2) & 7 = 1
     如果当前位置是位置2的下一预期位置(位置3),B相的电流比较结果应该是1,
        b> 取得B相正反电流比较结果,有三种情况:
     1> 正向明显大于反向 x = 1, z = 0,已经进入位置3
                 2> 正向明显小于反向 x = 0, z = 0,未进入位置3
     3> 正向接近反向 x = 1 或 x = 0, z = 1,处于位置2和位置3的临界点
        c> 判断,
                 如果是b>步的比较结果是情况3>则if(z & y) x = HallPatt[sense] & 7;得以执行,x被赋值3;
                 如果是b>步的比较结果是情况2>则if(!(x ^ (sense & y))) x = sense;得以执行,x被赋值2;
                 如果是b>步的比较结果是情况1>则else x = HallPatt[sense] & 7;得以执行,x被赋值3;
调用zerostart_sensor(4, 1)的情况如下
        a> y = ((HallPatt[4] & 7) ^ 4) & 7 = ((046 & 7) ^ 4) & 7 = 2
     如果当前位置是位置4的下一预期位置(位置6)C相的电流比较结果应该是1,
        b> 取得C相正反电流比较结果,有三种情况:
     1> 正向明显大于反向 x = 2, z = 0,已经进入位置3
                 2> 正向明显小于反向 x = 0, z = 0,未进入位置3
     3> 正向接近反向 x = 2 或 x = 0, z = 2,处于位置2和位置3的临界点
        c> 判断,
                 如果是b>步的比较结果是情况3>则if(z & y) x = HallPatt[sense] & 7;得以执行,x被赋值6;
                 如果是b>步的比较结果是情况2>则if(!(x ^ (sense & y))) x = sense;得以执行,x被赋值4;
                 如果是b>步的比较结果是情况1>则else x = HallPatt[sense] & 7;得以执行,x被赋值6;
     
*/
unsigned char zerostart_sensor(unsigned char sense, bit steady)
{

        unsigned char x;
        unsigned char y;
        unsigned char z;
        unsigned char resultfor,resultrev;

        x=0;                                         //x is the rotor position
        z=0;                                         //to indicate that there is no significant difference between 2 current peaks
        y = HallPatt[sense] & 7;        //y is the expected commutation state
        y ^= sense;                                //y is now the bit that should change if the expected state is now the current state
        y &= 0x07;

        CC6_vLoadChannelShadowRegister_CC6_CHANNEL_3(0x20);
        CC6_vEnableShadowTransfer_CC6_TIMER_13();

        //取得A相正反电流比较结果
        if(!steady || (steady && y == 0x04))
        {
                resultfor = currentcompare(0x16);                //retrieve ADC conversion result of first current peak due to forward magnetic field in phase A
                resultrev = currentcompare(0x29);                //retrieve ADC conversion result of second current peak due to reverse magnetic field in phase A
                if(resultfor > resultrev++) x++;               
                if //if there is no significant difference between the 2 current peaks from phase A
                (
                        resultfor == resultrev ||
                        resultfor == (resultrev - 1) ||
                        resultfor == (resultrev - 2)
                )
                {
                        z++;
                };
        }
       
        z<<=1;
        x<<=1;

        //取得C相正反电流比较结果
        if(!steady || (steady && y == 0x02))
        {
                resultfor=currentcompare(0x25);                //retrieve ADC conversion result of first current peak due to forward magnetic field in phase C
                resultrev=currentcompare(0x1A);                //retrieve ADC conversion result of second current peak due to reverse magnetic field in phase C
                if(resultfor>resultrev++)x++;
                if //if there is no significant difference between the 2 current peaks from phase C
                (
                        resultfor==resultrev ||
                        resultfor==(resultrev-1) ||
                        resultfor==(resultrev-2)
                )
                {
                        z++;  
                }
        }

        z<<=1;
        x<<=1;

        //取得B相正反电流比较结果
        if(!steady || (steady && y == 0x01))
        {
                resultfor=currentcompare(0x19);           //retrieve ADC conversion result of first current peak due to forward magnetic field in phase B
                resultrev=currentcompare(0x26);           //retrieve ADC conversion result of second current peak due to reverse magnetic field in phase B
                if(resultfor>resultrev++)x++;
                if(resultfor==resultrev || resultfor==(resultrev-1) || resultfor==(resultrev-2))z++;  //if there is no significant difference between the 2 current peaks from phase B
        }

        if(steady)
        {
                if(z & y) x = HallPatt[sense] & 7;        //if the bit that is supposed to change(y) corresponds to the bit
                                                                                                                                                                //where the current peaks are almost the same(z), then the expected state is now the current state
                else
                {
                        if (!(x ^ (sense & y))) x = sense;
                        else x = HallPatt[sense] & 7;
                }
        }
        return x;
}
发表于 2017-7-11 09:48:14 | 显示全部楼层
感谢!!!
发表于 2017-7-11 12:01:56 | 显示全部楼层
不明觉厉!感谢楼上各位点评。
发表于 2017-7-12 15:47:40 | 显示全部楼层
不错的资料,一定要好好学习一下!
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 粤ICP备09047143号 )

GMT+8, 2017-9-25 01:44

阿莫电子论坛, 原"中国电子开发网"

© 2004-2016 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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