xiangyuan_122 发表于 2015-12-17 09:37:58

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

网上找的,没用过英飞凌,编译可以通过,不知是否能用

小小苹果 发表于 2015-12-17 10:31:09

不懂帮顶,希望高人评价一下。

huangqi412 发表于 2015-12-17 13:33:36

什么编译器

xiangyuan_122 发表于 2015-12-17 15:02:17

huangqi412 发表于 2015-12-17 13:33
什么编译器

程序里有说明,Keil C51

xiangyuan_122 发表于 2015-12-18 09:52:48

传两篇隐极永磁同步初始角检测相关文章

mandylion2008 发表于 2015-12-18 17:29:19

反证法,如果很好用,那现在还讨论什么启动?

xiangyuan_122 发表于 2015-12-19 09:17:27

mandylion2008 发表于 2015-12-18 17:29
反证法,如果很好用,那现在还讨论什么启动?

难得大神围观,留下点干货呗{:biggrin:}

mandylion2008 发表于 2015-12-19 11:00:20

本帖最后由 mandylion2008 于 2015-12-19 11:53 编辑

xiangyuan_122 发表于 2015-12-19 09:17
难得大神围观,留下点干货呗

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





xiangyuan_122 发表于 2015-12-19 11:07:18

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

BLHELI也不是哪里都适用吧,电调上用一般也够了,但带重载也可以吗?比如压缩机?

mandylion2008 发表于 2015-12-19 11:15:56

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

世界上从来没有可以照搬的东西。
我可以负责任的说,BLHELI的启动经过改进是可以启动压缩机的带载启动的,但这种情况下,用电感法最好!

R88 发表于 2015-12-19 20:25:13

感谢楼主,这个启动是类似这个帖子说的http://www.amobbs.com/thread-5626901-1-1.html无预位置?

xiangyuan_122 发表于 2015-12-20 09:23:15

R88 发表于 2015-12-19 20:25
感谢楼主,这个启动是类似这个帖子说的http://www.amobbs.com/thread-5626901-1-1.html无预位置? ...

是的,我也是看这个的,里面提供了一篇原理性的论文我觉得不错,但没有源码,英飞凌的这个源码算法和那篇帖子的类似,文档里有流程图,可以让刚接触电感(铁芯饱和效应)法的了解其实现

xiangyuan_122 发表于 2015-12-20 09:35:27

mandylion2008 发表于 2015-12-19 11:15
世界上从来没有可以照搬的东西。
我可以负责任的说,BLHELI的启动经过改进是可以启动压缩机的带载启动的 ...

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

mandylion2008 发表于 2015-12-20 10:39:48

xiangyuan_122 发表于 2015-12-20 09:35
如果单纯说可以,三段式同样可以启动,但要效果好,适应的范围广,我认为还是基于铁芯饱和的电感法,从原 ...

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

chiefdh 发表于 2015-12-20 14:10:16

mandylion2008 发表于 2015-12-20 10:39
情况是这样的,因为很多人连方波都没有真正搞好,去谈论电感法没什么意义。
方波启动做好了,启动个压缩 ...

膜拜下大湿

powerlabor001 发表于 2015-12-20 14:52:04

哈哈,强烈期望mandylion2008大侠稍微点拨一下,适可而止既可,就一个问题,无刷直流电机带重载起动,方波算法,讲讲大概思路,谢谢,非常感谢。

a409600516 发表于 2015-12-24 15:47:58

mandylion2008 发表于 2015-12-19 11:00
把BLHELI研究透,在这个经验基础上,做出适当改进就行了!
很少看到有人通读整个程序,倒是很多人说汇编 ...

哥!!!多么希望你还是讲讲BLHeli吧,就像写《电调攻略》那样的干货出来,BLHeli好难看懂啊 !

CoolRain828 发表于 2016-8-14 22:39:47

感谢无私的分享!

ycping 发表于 2016-8-15 09:07:24

谢谢分享

CoolRain828 发表于 2016-9-23 21:21:46

不错的资料,好好研究一下

CoolRain828 发表于 2016-9-23 21:22:08

不错的资料,一定要好好学习一下!

zxs0226 发表于 2016-10-4 13:51:02

这个是可以准确的判断电机初始位置的,只是启动的第一步。

梦幻之旅 发表于 2016-10-5 19:50:58

留个记号

=FBI= 发表于 2016-11-14 15:20:03

a409600516 发表于 2015-12-24 15:47
哥!!!多么希望你还是讲讲BLHeli吧,就像写《电调攻略》那样的干货出来,BLHeli好难看懂啊 ! ...

慢慢看,就是汇编看起来有点生涩,,

lgj 发表于 2017-2-7 20:13:17

文档值得一看

sml009 发表于 2017-2-7 20:27:24

mark                     

Seven-007 发表于 2017-2-19 15:11:04

mark。。。。

zlf66778899 发表于 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 & 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 & 7;得以执行,x被赋值3;
               如果是b>步的比较结果是情况2>则if(!(x ^ (sense & y))) x = sense;得以执行,x被赋值2;
               如果是b>步的比较结果是情况1>则else x = HallPatt & 7;得以执行,x被赋值3;
调用zerostart_sensor(4, 1)的情况如下
        a> y = ((HallPatt & 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 & 7;得以执行,x被赋值6;
               如果是b>步的比较结果是情况2>则if(!(x ^ (sense & y))) x = sense;得以执行,x被赋值4;
               如果是b>步的比较结果是情况1>则else x = HallPatt & 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 & 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 & 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 & 7;
                }
        }
        return x;
}

drive 发表于 2017-7-11 09:48:14

感谢!!!

小小苹果 发表于 2017-7-11 12:01:56

不明觉厉!感谢楼上各位点评。

jimgx 发表于 2017-7-12 15:47:40

不错的资料,一定要好好学习一下!

lionoil 发表于 2017-11-2 13:17:46

xiangyuan_122 发表于 2015-12-18 09:52
传两篇隐极永磁同步初始角检测相关文章

试过,非凸极马达基本不可能实现

stallone007912 发表于 2017-11-2 13:45:37

MARK一下,以后慢慢研究,最近在忙项目中!

段胖子 发表于 2017-11-10 10:02:00

难得的好资料,感谢楼主,改到自己程序里试试!

578243539 发表于 2018-7-21 08:56:33

感谢分享

xuqingtian 发表于 2018-8-9 14:57:16

不错的资料,一定要好好学习一下!!!

zhenjiang071 发表于 2018-10-12 15:01:15

我按照文档的意思尝试了下,发现电机转子在哪个位置,采回来的ADC值都差不多,很是怀疑可行性,楼主可否指点下。

zkmcu 发表于 2018-10-21 16:57:20

zlf66778899 发表于 2017-2-20 22:52
对定位函数分析了一下,请高手斧正
//***************************************************************** ...

这段代码的源出处是哪里?

aisledianzi 发表于 2019-4-17 22:01:01

学习一下

fxhfxh 发表于 2019-6-18 12:33:02

学习一下,准备试验一下。

大风起兮 发表于 2019-7-8 18:49:32

好东西 收藏了

Steven.c 发表于 2019-8-1 11:07:17

学习了

brightchl 发表于 2019-9-18 14:34:16

下载了,学习了

狂欢的青年 发表于 2020-1-6 09:16:30

学习了谢谢

koon 发表于 2020-2-4 09:10:57

MARK      

skype 发表于 2021-1-19 09:44:57




有的电机只有80%的准确率。电机转子在特定的位置,还是会出现在全0和全1的无效位置。

yang1479 发表于 2021-11-25 10:54:41

zlf66778899 发表于 2017-2-20 22:52
对定位函数分析了一下,请高手斧正
//***************************************************************** ...

感谢楼主分享,英飞凌的这个文档确实挺有用

hfei1980 发表于 2022-7-17 11:52:24

在自己的板子上尝试了一下,发现经常测试不准确,反复测试,同一相正反测试,一时正向大于反向,一时反向大于正向,测试出来的转子所处扇区偏差大,不知道是什么原因。。

lpx280666373 发表于 2022-10-9 08:28:33

hfei1980 发表于 2022-7-17 11:52
在自己的板子上尝试了一下,发现经常测试不准确,反复测试,同一相正反测试,一时正向大于反向,一时反向大 ...
(引用自48楼)

大佬,您好。我也遇到了同样的问题,您解决了吗,可以指点一下方向吗?谢谢了。 调了好几天了。{:cry:}
页: [1]
查看完整版本: 分享:无感BLDC启动源码(基于英飞凌AP08018可变电感感应法)