分享:无感BLDC启动源码(基于英飞凌AP08018可变电感感应法)
网上找的,没用过英飞凌,编译可以通过,不知是否能用 不懂帮顶,希望高人评价一下。 什么编译器 huangqi412 发表于 2015-12-17 13:33什么编译器
程序里有说明,Keil C51 传两篇隐极永磁同步初始角检测相关文章 反证法,如果很好用,那现在还讨论什么启动? mandylion2008 发表于 2015-12-18 17:29
反证法,如果很好用,那现在还讨论什么启动?
难得大神围观,留下点干货呗{:biggrin:} 本帖最后由 mandylion2008 于 2015-12-19 11:53 编辑
xiangyuan_122 发表于 2015-12-19 09:17
难得大神围观,留下点干货呗
把BLHELI研究透,在这个经验基础上,做出适当改进就行了!
很少看到有人通读整个程序,倒是很多人说汇编难读,就这种态度和恒心是搞不了深一点的技术的。我自己为了多多吸收别人的优点,是把整个BLHELI通读和试验了的,所以才能知己知彼。本来想就BLHELI的软件架构和具体的关键函数在论坛上传的,我相信以自己的表达方式将是非常直接了当容易理解的,可后来想想还是算了,我相信99%的人得到后都会说,我早就知道了。
mandylion2008 发表于 2015-12-19 11:00
把BLHELI研究透,在这个经验基础上,做出适当改进就行了!
就像数学一样,聪明的人可以从一点点已知的条 ...
BLHELI也不是哪里都适用吧,电调上用一般也够了,但带重载也可以吗?比如压缩机? xiangyuan_122 发表于 2015-12-19 11:07
BLHELI也不是哪里都适用吧,电调上用一般也够了,但带重载也可以吗?比如压缩机? ...
世界上从来没有可以照搬的东西。
我可以负责任的说,BLHELI的启动经过改进是可以启动压缩机的带载启动的,但这种情况下,用电感法最好! 感谢楼主,这个启动是类似这个帖子说的http://www.amobbs.com/thread-5626901-1-1.html无预位置? R88 发表于 2015-12-19 20:25
感谢楼主,这个启动是类似这个帖子说的http://www.amobbs.com/thread-5626901-1-1.html无预位置? ...
是的,我也是看这个的,里面提供了一篇原理性的论文我觉得不错,但没有源码,英飞凌的这个源码算法和那篇帖子的类似,文档里有流程图,可以让刚接触电感(铁芯饱和效应)法的了解其实现 mandylion2008 发表于 2015-12-19 11:15
世界上从来没有可以照搬的东西。
我可以负责任的说,BLHELI的启动经过改进是可以启动压缩机的带载启动的 ...
如果单纯说可以,三段式同样可以启动,但要效果好,适应的范围广,我认为还是基于铁芯饱和的电感法,从原理上来看其算法鲁棒性确实比较好,跟电机参数关联不大,不需要电机凸极效应,主要比较几种通电模式下电流大小即可,当然,我还没具体去做,具体实现过程中有哪些问题会影响其适用性还不知,如果你认为电感法不可行,想必也是有遇到这方面的问题,你也可以提出来一起探讨。 xiangyuan_122 发表于 2015-12-20 09:35
如果单纯说可以,三段式同样可以启动,但要效果好,适应的范围广,我认为还是基于铁芯饱和的电感法,从原 ...
情况是这样的,因为很多人连方波都没有真正搞好,去谈论电感法没什么意义。
方波启动做好了,启动个压缩机真的没什么问题,我都给朋友试过了(很多高手都在论坛,我知道乱吹牛会被人鄙视的,我在外面跟搞技术的人交往,我是极其的低调,有时会让人产生轻视的感觉,但我感觉良好,因为如果搞的很高调,人家就不会说出一些有用的东西了,哈)。
我觉得应该在有一个扎实的基础上再去提高,不然一说什么都懂,一旦要拿出个可以实用的算法又不行,高校里面的人很喜欢这样,我不太喜欢这样,我要的是实践派风格。
对于电感法的启动,根据我以前做车用控制器的经验,可以做到重载零速启动,保证100%可靠,因为这个方法不同于公开的资料,应当是比较有价值的,所以很少提及。 mandylion2008 发表于 2015-12-20 10:39
情况是这样的,因为很多人连方波都没有真正搞好,去谈论电感法没什么意义。
方波启动做好了,启动个压缩 ...
膜拜下大湿 哈哈,强烈期望mandylion2008大侠稍微点拨一下,适可而止既可,就一个问题,无刷直流电机带重载起动,方波算法,讲讲大概思路,谢谢,非常感谢。 mandylion2008 发表于 2015-12-19 11:00
把BLHELI研究透,在这个经验基础上,做出适当改进就行了!
很少看到有人通读整个程序,倒是很多人说汇编 ...
哥!!!多么希望你还是讲讲BLHeli吧,就像写《电调攻略》那样的干货出来,BLHeli好难看懂啊 ! 感谢无私的分享! 谢谢分享 不错的资料,好好研究一下 不错的资料,一定要好好学习一下! 这个是可以准确的判断电机初始位置的,只是启动的第一步。 留个记号 a409600516 发表于 2015-12-24 15:47
哥!!!多么希望你还是讲讲BLHeli吧,就像写《电调攻略》那样的干货出来,BLHeli好难看懂啊 ! ...
慢慢看,就是汇编看起来有点生涩,, 文档值得一看 mark mark。。。。 本帖最后由 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;
}
感谢!!! 不明觉厉!感谢楼上各位点评。 不错的资料,一定要好好学习一下! xiangyuan_122 发表于 2015-12-18 09:52
传两篇隐极永磁同步初始角检测相关文章
试过,非凸极马达基本不可能实现 MARK一下,以后慢慢研究,最近在忙项目中! 难得的好资料,感谢楼主,改到自己程序里试试! 感谢分享 不错的资料,一定要好好学习一下!!! 我按照文档的意思尝试了下,发现电机转子在哪个位置,采回来的ADC值都差不多,很是怀疑可行性,楼主可否指点下。 zlf66778899 发表于 2017-2-20 22:52
对定位函数分析了一下,请高手斧正
//***************************************************************** ...
这段代码的源出处是哪里? 学习一下 学习一下,准备试验一下。 好东西 收藏了 学习了 下载了,学习了 学习了谢谢 MARK
有的电机只有80%的准确率。电机转子在特定的位置,还是会出现在全0和全1的无效位置。 zlf66778899 发表于 2017-2-20 22:52
对定位函数分析了一下,请高手斧正
//***************************************************************** ...
感谢楼主分享,英飞凌的这个文档确实挺有用 在自己的板子上尝试了一下,发现经常测试不准确,反复测试,同一相正反测试,一时正向大于反向,一时反向大于正向,测试出来的转子所处扇区偏差大,不知道是什么原因。。 hfei1980 发表于 2022-7-17 11:52
在自己的板子上尝试了一下,发现经常测试不准确,反复测试,同一相正反测试,一时正向大于反向,一时反向大 ...
(引用自48楼)
大佬,您好。我也遇到了同样的问题,您解决了吗,可以指点一下方向吗?谢谢了。 调了好几天了。{:cry:}
页:
[1]