STM8下推式磁悬浮实验
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_511868.png极简陋的模拟电路 (原文件名:磁悬浮(STM8 PWM).png)
源代码(STVD + Cosmic)ourdev_511866.zip(文件大小:53K) (原文件名:maglev_stm8.zip)
悬浮视频ourdev_511458.zip(文件大小:1.41M) (原文件名:maglev.zip)
电路基于ST三合一开发板的STM8S Mini Kit,ADC基准电压3.3V。
STM8使用内部16MHz RC振荡,分频比为1,核心频率16MHz。
ADC2时钟分频比为12,频率1.333MHz,工作在单次采样模式,采样时间为14 * 0.75µs + 7µs = 17.5µs,加上中断处理时间,采样率约为55KS/s。
TIM1时钟分频比为4,频率4MHz,计数器TOP值(ARR)为999,因此PWM频率为4KHz。
完成初始化后,主程序进入死循环,系统完全依赖中断服务例程运作。
设计要点详解:
1.ADC2采样完成(EOC)中断
<pre>/*
* ADC2 End Of Conversion interrupt handler
* Positions are filtered by a 7th-order moving average filter.
*/
@far @interrupt void ADC2_IRQHandler(void)
{
static u8 xFilterPos, yFilterPos;
static s16 xFilterBuf = {0, 0, 0, 0, 0, 0, 0, 0};
static s16 yFilterBuf = {0, 0, 0, 0, 0, 0, 0, 0};
s16 adcValue, acc = 0;
u8 i;
adcValue = ADC2_GetConversionValue();
if (currentChannel == ADC2_CHANNEL_6)
{
xFilterBuf = adcValue;
xFilterPos++;
for (i = 0; i < 8; i++)
{
acc += xFilterBuf;
}
xPos = acc >> 3;
currentChannel = ADC2_CHANNEL_7;
}
else
{
yFilterBuf = adcValue;
yFilterPos++;
for (i = 0; i < 8; i++)
{
acc += yFilterBuf;
}
yPos = acc >> 3;
currentChannel = ADC2_CHANNEL_6;
}
// Switch the channel and start new conversion.
ADC2_ClearFlag();
ADC2_ConversionConfig(ADC2_CONVERSIONMODE_SINGLE, currentChannel, ADC2_ALIGN_RIGHT);
ADC2_StartConversion();
}</pre>
EOC中断轮流采集CH6和CH7通道的数据,并对采样值进行7阶移动平均滤波,结果存放于xPos和yPos变量。
2.TIM1更新/溢出中断
<pre>/*
* TIM1 update/overflow interrupt handler
* This IRQ is executed every 250us.
*/
@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
static u8 direction;
s16 xError, yError;
s16 xPWM, yPWM;
// Change X direction
if (direction & X_DIRECTION_FLAG)
{
GPIO_WriteHigh(GPIOC, GPIO_PIN_3);
}
else
{
GPIO_WriteLow(GPIOC, GPIO_PIN_3);
}
// Change Y direction
if (direction & Y_DIRECTION_FLAG)
{
GPIO_WriteHigh(GPIOC, GPIO_PIN_5);
}
else
{
GPIO_WriteLow(GPIOC, GPIO_PIN_5);
}
// PID calculation
xError = xPID.targetValue - xPos;
yError = yPID.targetValue - yPos;
xPWM = calcPID(&xPID, xError);
yPWM = calcPID(&yPID, yError);
// Set the direction and OC polarity based on the PID output (takes effect on next PWM cycle)
if (xPWM >= 0)
{
direction &= (u8) ~X_DIRECTION_FLAG;
TIM1_OC1PolarityConfig(TIM1_OCPOLARITY_LOW);
}
else
{
direction |= X_DIRECTION_FLAG;
xPWM = -xPWM;
TIM1_OC1PolarityConfig(TIM1_OCPOLARITY_HIGH);
}
if (yPWM >= 0)
{
direction &= (u8) ~Y_DIRECTION_FLAG;
TIM1_OC2PolarityConfig(TIM1_OCPOLARITY_LOW);
}
else
{
direction |= Y_DIRECTION_FLAG;
yPWM = -yPWM;
TIM1_OC2PolarityConfig(TIM1_OCPOLARITY_HIGH);
}
// Update the PWM (takes effect on next PWM cycle)
TIM1_SetCompare1(xPWM);
TIM1_SetCompare2(yPWM);
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}</pre>
TIM1更新/溢出中断每个PWM周期开始时(250µs)执行一次,每次执行会根据当前xPos和yPos进行PID运算和更新PWM占空比。10-bit ADC采样范围0~1023,因此PID的参考点设在中点511。
为了防止更新占空比造成当前PWM周期占空比不正常,输出比较器使用了预载功能,即更新会在下一个PWM周期才生效。
控制方向根据PID运算结果的符号来判断,保存在direction变量中,在下一个PWM周期才对应更新GPIO的输出状态,与PWM占空比更新同步。
PWM控制时序如下图(只画了X轴,Y轴同理):
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512191.png
PWM时序 (原文件名:磁悬浮(PWM时序).png)
当PID输出为正数时,PC3输出低电平,PC1/TIM1_CC1输出高电平有效的PWM脉冲。
当PID输出为负数时,PC3输出高电平,PC1/TIM1_CC1输出低电平有效的PWM脉冲,图中T3为占空比20%的PWM,T4为占空比40%的反向输出PWM。
结合L293D,图中T1, T2周期输出占空比20%的正向PWM至线圈,而T3, T4周期分别输出20%和40%占空比的反向PWM至线圈,从而实现双向磁场控制。
3.PID参数
<pre> xPID.Kp = 4;
xPID.Ki = 0;
xPID.Kd = 30;
xPID.integrationError = 0;
xPID.prevError = 0;
xPID.targetValue = 511;</pre>
由上面的代码可见,本系统只使用了PD控制,Ki为0,积分项不参与计算。Kp, Kd的值需要根据悬浮物的质量调整,整定方法可参考有关资料,这里就不详述了。
4.霍尔采样电路
霍尔采样电路采用了2片有源线性霍尔UGN3503,后接一级运放反相放大器,放大倍数为30倍,并且由一个10K多圈电位器调整输出中点电平。
运放和霍尔使用5V单电源供电,UGN3503的输出中点电压约2.5V,运放LM324输出电压范围约50mV~3.6V,因此STM8的ADC参考电压使用3.3V,分别调整10K电位器使LM324输出1.65V,此时STM8的ADC采样结果应该接近511,误差虽然越小越好,但不需要绝对准确(霍尔、运放都有温漂,不可能绝对准确),一般调整至480~550范围内即可。
5.硬件安装
http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512193.png
线圈及霍尔安装 (原文件名:磁悬浮(线圈及霍尔安装).png)
每组两个线圈同名端相连(即反向串接)。霍尔置于4个线圈中间的空隙,高度约在线圈中部,需注意霍尔作用面应位于线圈中轴线上,不应采用图中虚线标示的安装方式,否则会造成定位误差。
磁环置于电路板下面,需要注意的是磁环的放置会影响霍尔输出,因此运放输出中点调节最好配合磁环定位同时调节。
呼,终于写完了。实用的设计,程序还需要加入有无悬浮物的判断,加入可调速旋转功能,PID最好加入自整定甚至模糊逻辑以应对不同质量的悬浮物和温漂等不确定因素,等等等等……
下推式磁悬浮实验算是暂时告一段落,在找到合适的铁心之前,先这样了。
希望以上内容能对各位一直以来关注磁悬浮板块的网友有一定的帮助,期待看到更多成功的作品! 沙發 mark 下推式磁悬浮…… 祝贺哦,楼主厉害,早上4点还在线。我这里还没有着手搞呢,计划没有变化快,呵呵。 看了视屏,很稳定呀~~ 一直想知道霍尔传感器会不会引入线圈产生的共模磁通,如果有,如何处理呢?希望楼主能说说,十分感谢 【5楼】 lijieamd
一直想知道霍尔传感器会不会引入线圈产生的共模磁通,如果有,如何处理呢?希望楼主能说说,十分感谢
----------------------------
因为霍尔传感器检测平面和线圈、磁环的磁通是垂直的,理论上不会。
实际上由于安装定位误差,总会有一点的,目前我的模型上的误差是95% PWM占空比时约造成霍尔采样值1%误差,相对来说还是很小的。
这个误差基本上不用理会,系统是一个大的负反馈回路,自己能抵消掉的,只是误差太大了会影响调节范围,降低稳定性。 工作原理和设计要点讲解已更新到楼主位。 OURDEV的第一个.
贺! 无传感器的真厉害
楼主佩服佩服 mark 一下 多谢lz 想问下安装在线圈里的2片霍尔UGN3503的脚有2组是不是并联的?
望gzhuli 咕唧霖能指点在上面所发图片的2个霍尔3503接线? 【10楼】 bengchai
有传感器,2片3503。无传感器的下推式估计难度较高,估计要先从上拉式入手。
【12楼】 dnv2009
电源和地是并联的,见楼主位的电路图。
实际安装是两个脚插在同一个洞里的。 原来这东西的线圈是两两串联的,我一直以为是四路PWM分别控制四个线圈,如同四轴的四个无刷电机一样
咕唧霖能否解释下:“每组两个线圈同名端相连(即反向串接)” http://cache.amobbs.com/bbs_upload782111/files_23/ourdev_512325.png
(原文件名:线圈.png)
如图所示,两个线圈绕向相同,黑点表示同名端,箭头表示电流方向。
两个线圈反向串联时,电流通过就会产生相反的磁场极性,对悬浮物的作用力是一边推一边拉,使悬浮物水平移动,实现位置控制。
如果同向串联,则两个线圈产生相同的磁场极性,同时推或同时拉,达不到控制的目的。
我之前也考虑过不使用环形磁铁,4路PWM分别控制4个线圈产生同极磁场来实现悬浮,但粗略分析磁力线分布后,感觉不可行,就没考虑了。 哦,是这个意思,我原来想象中用4线圈,控制时也是对角线两线圈磁极相反的
只不过是用软件控制两线圈相反极性的,你这个接法是硬件的,更可靠而且可以少用两路PWM输出
不过我从来没有认为过,可以用多个线圈直接悬浮,而不使用下推磁铁,这样悬浮负载质量稍大,线圈电流一定高得惊人
控制姿态位置是这种系统的关键,主要负载的重力支撑,还是靠静态的磁铁比较靠谱 我买了一个磁悬浮地球仪。拆开后,其它的都能搞定,就正面的电路板上有两个黑黑邦定芯片,请知道这个芯片的型号请告诉我一下,本人想自已试着再做做。填补一下内心对磁悬浮的好奇。QQ:54495816815814466620 冒似LM324运放 这里再次祝贺。 收藏 弱弱的问下图中霍尔传感器是用来做什么的啊? 回复【21楼】cinderellah
弱弱的问下图中霍尔传感器是用来做什么的啊?
-----------------------------------------------------------------------
霍尔传感器的功能是检测磁场强度,在这个电路中是用来检测悬浮永磁体的位置。 看了,很奇怪为什么只需要两个线圈就行了,而不是4个线圈
还闪出一个念头就是,能不能直接用很多块精心设计分布的永磁铁,直接做成悬浮呢。 哪里看到只有2个线圈了? 收藏,准备也试试看~ 标记
很好玩 记号,记号啊 楼主,能不能发些详细的资料给我呀。按你的资料打板试试。邮箱:10919293@163.com,谢谢! 回复【28楼】szxyc8
楼主,能不能发些详细的资料给我呀。按你的资料打板试试。邮箱:10919293@163.com,谢谢!
-----------------------------------------------------------------------
楼主位的电路是在洞洞板上焊的,图中的STM8S207SBT6 MINIKIT是ST的三合一开发板中的STM8核心板,资料在[原创]ST MCU MiniKit(三合一开发板)使用参考的2楼。
如果还有要补充的,就是线圈数据:0.4mm漆包线,一层27.5圈,14层,总共约380圈。骨架尺寸见■电磁线圈骨架尺寸及漆包线。 好东西 楼主,如何联系你啊 mark mark! 楼主:gzhuli 咕唧霖
请留下你的联系方式,学习请教中。。
QQ:910266897 有问题在论坛问就行了,我不怎么用qq。 楼主请指教下面的帖子,原始作者-楼主我联系不到,他的M8程序说是临着你的程序改的:
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3788832&bbs_page_no=1&bbs_id=3049
你的程序原理我看懂了,可那M8的程序我觉的怎么不对劲呢?它怎么产生双向磁场控制呢?
下面的帖子是我发的。上拉式我实验成功了,模拟的,悬距1.5CM左右,再实验没大的改观。
现在想做下推式的磁悬浮,想上M8,对AVR不是很懂,之前玩过51单片机,简单程序可以看的懂,对PID,pwm原理知道点,但程序没调试过,还望指教的。谢谢!
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4010330&bbs_page_no=1&bbs_id=3049 记号 mark 这贴好,记一下。 有时间也弄个玩玩。。。。。 回复【35楼】gzhuli 咕唧霖
-----------------------------------------------------------------------
我想开发这产品,有人帮忙吗? 楼主真厉害,支持,我也想问一下磁悬浮地球仪里的软封集成块是什么型号!跪求!跪求! mark 请问楼主 为什么相对两个线圈要反向接呢?这样磁场方向不是反了吗,浮子不是弹到一边去了吗? 很好的作品,值得学习 回复【44楼】KTearXu
请问楼主 为什么相对两个线圈要反向接呢?这样磁场方向不是反了吗,浮子不是弹到一边去了吗?
-----------------------------------------------------------------------
四个线圈是用来控制浮子水平位置的,所以正是要制造两极相反的磁场,一边吸一边斥,把浮子推向一边。 好贴,收藏,学习,制作,试验..... mark GOOD 一直以为换向的频率会很高 是专用芯片做的呢 . 很牛 mark 怎样开始学习和制作 mark mark 做个标记,不懂的时候再回来看看 学习了~~正想学着做来着的~~ 很好和强大,看看什么说话自己也能做一个 楼主我有个问题不是很清楚,最下面的大的永磁铁起到什么作用。 COOL ! 马克~~~~~~~~~~~~ 有人搞了么 我想看实际的结果 好东西, 有时间搞个玩玩 clogord 发表于 2012-3-26 14:37 static/image/common/back.gif
有人搞了么 我想看实际的结果
LZ位有视频下载,这个是网友用mega8仿制成功的:
用ATmega8制作的下推式磁悬浮
http://www.ourdev.cn/thread-3788832-1-1.html 不懂,
当个看客也不容易啊。
视频下载不了,楼主能否给个在线的链接? vp110 发表于 2012-3-26 15:22 static/image/common/back.gif
不懂,
当个看客也不容易啊。
视频下载不了,楼主能否给个在线的链接?
看这里:http://www.ourdev.cn/forum.php?mod=redirect&goto=findpost&ptid=3357157&pid=3749826 看到了,太帅了。
谢谢楼主 这位兄弟,能否告知电话或打我电话18961496183 陈立,我们公司正在研发一套奶粉铁盖的自动输送系统,国外有采用磁悬浮分开盖子的做法,能否有机会一起研发! czjiuyu 发表于 2012-3-26 19:09 static/image/common/back.gif
这位兄弟,能否告知电话或打我电话18961496183 陈立,我们公司正在研发一套奶粉铁盖的自动输送系统,国外有 ...
不好意思,我最近比较忙,也不是干这行的,纯粹业余爱好,可能帮不上忙了。 兄弟,能否上QQ或是电话联系讨论下啊,因为我那个东西应该属于磁悬浮的一种,有结果了公司肯定会有报酬的! 本帖最后由 所向披靡 于 2012-4-30 22:57 编辑
请问楼主,我的3583脚和5脚调至1.65v,2脚和6脚接3503输出(大约2.54v),为什么1脚和7脚才零点几伏?谢谢。硬件都做好了,很想成功一次啊。 弱弱的问下 为什么线圈下面还要加磁环呢 用4个线圈吸和斥不就能保持平衡了吗 所向披靡 发表于 2012-4-30 22:54 static/image/common/back.gif
请问楼主,我的3583脚和5脚调至1.65v,2脚和6脚接3503输出(大约2.54v),为什么1脚和7脚才零点几伏?谢 ...
358的输出(1脚和7脚)调至1.65V,不是输入。 甘子贤 发表于 2012-5-9 16:41 static/image/common/back.gif
弱弱的问下 为什么线圈下面还要加磁环呢 用4个线圈吸和斥不就能保持平衡了吗 ...
线圈对磁铁的作用力很小,只能控制磁铁横向移动,托不起磁铁的。 这样啊。。受教了, 万分感谢 还想请教下老师, 线圈下面的加的磁环如果换成一个个圆形磁铁,那么圆形磁铁的N, S极 要怎么放置呢? 是所有N级朝上还是S级朝上,或者是一半上一半下? 附件怎么都下不了呢 {:cry:} 附件怎么都下不了呢 {:cry:} MARK下推式 磁悬浮 STM8 mark 下推式磁悬浮…… 我现在连理论家都不是,单纯小白一个,需要学的还有好多好多。请问楼主,我应该从哪来学起?我是大学生,专业是“光信息科学与技术”,平时都是学知识,没用到实际上,没做过什么实际的东西,现在对磁悬浮很有兴趣,但是没地方入手,求教!求教!
邮箱xiaob5809469@126.com
QQ:356525307 和楼上一样,真心求教~~谢谢了
xiaohaier@stu.snnu.edu.cn 本帖最后由 zjz6106 于 2012-9-18 13:05 编辑
我现在在做下推式磁悬浮。有两个问题:1.霍尔元件放在线圈的中心位置(高度),但是仍然会受线圈磁场影响;2.线圈电流达到1A,800匝,0.27mm的线,仍然感觉对磁铁横向的拉力不足。请问这是为什么?还有漂浮物用不用加配重?谢谢啦 你好啊!! 请问四个线圈一定最好要在环形磁铁中央吗?不在的话会不会产生不好的影响? zjz6106 发表于 2012-9-18 13:03 static/image/common/back.gif
我现在在做下推式磁悬浮。有两个问题:1.霍尔元件放在线圈的中心位置(高度),但是仍然会受线圈磁场影响; ...
1.多少是会受线圈影响,因为不可能刚好放在正中心,误差总是有的,这可以不管,PID能应付。
2.加铁心是必须的,空心线圈磁场发散,控制距离很短。 SHIYOULAN 发表于 2012-9-23 23:57 static/image/common/back.gif
你好啊!! 请问四个线圈一定最好要在环形磁铁中央吗?不在的话会不会产生不好的影响? ...
不一定在中央,不在中央的话各个方向的控制力不同,需要不同的PID参数。 xiaob5809469 发表于 2012-7-29 12:06 static/image/common/back.gif
我现在连理论家都不是,单纯小白一个,需要学的还有好多好多。请问楼主,我应该从哪来学起?我是大学生,专 ...
做其实不难,肯动手一定能做出来。如果想从中学点东西就从自动控制理论学起,无论是模拟方案还是数字方案,无非都是一个闭环反馈控制过程而已。 甘子贤 发表于 2012-5-22 19:04 static/image/common/back.gif
还想请教下老师, 线圈下面的加的磁环如果换成一个个圆形磁铁,那么圆形磁铁的N, S极 要怎么放置呢? 是所 ...
我没做过这种,感觉应该是全部朝上。 gzhuli 发表于 2012-9-24 00:30 static/image/common/back.gif
不一定在中央,不在中央的话各个方向的控制力不同,需要不同的PID参数。 ...
好的。。我做的东西,感觉悬浮物在环形磁铁的正上方的活动范围太小了!! 很容易被永磁铁拉出去!是不是我的PID参数没调好?麻烦你帮我看一下! SHIYOULAN 发表于 2012-9-24 11:43 static/image/common/back.gif
好的。。我做的东西,感觉悬浮物在环形磁铁的正上方的活动范围太小了!! 很容易被永磁铁拉出去!是不是 ...
范围是很小,5mm左右吧。 gzhuli 发表于 2012-9-24 11:48 static/image/common/back.gif
范围是很小,5mm左右吧。
调了一天,基本可以了,最多的时候能停留20秒左右,后来会震动,然后飞出去了。 请问PID参数只能一个个试么?有没有什么快得方法!? 振荡就减小I,加大D。
快的方法就是采集输入和输出波形,推出传递函数,再按照传递函数来取PID参数。 gzhuli 发表于 2012-9-24 00:27 static/image/common/back.gif
1.多少是会受线圈影响,因为不可能刚好放在正中心,误差总是有的,这可以不管,PID能应付。
2.加铁心是必 ...
加铁心后,磁铁不就被铁心吸下去了吗? zjz6106 发表于 2012-10-1 00:24 static/image/common/back.gif
加铁心后,磁铁不就被铁心吸下去了吗?
铁心在环形磁铁的中心,那里的磁场比上面的磁铁强。 请问源代码中的这段什么意思?
if (xPWM >= 0)
{
direction &= (u8) ~X_DIRECTION_FLAG;
TIM1_OC1PolarityConfig(TIM1_OCPOLARITY_LOW);
}
else
{
direction |= X_DIRECTION_FLAG;
xPWM = -xPWM;
TIM1_OC1PolarityConfig(TIM1_OCPOLARITY_HIGH);
}
公司最近也买了一个样品,这个帖正好可以学习下~ gzhuli 发表于 2012-10-1 11:28 static/image/common/back.gif
铁心在环形磁铁的中心,那里的磁场比上面的磁铁强。
请问源代码中的这段什么意思?
if (xPWM >= 0)
{
direction &= (u8) ~X_DIRECTION_FLAG;
TIM1_OC1PolarityConfig(TIM1_OCPOLARITY_LOW);
}
else
{
direction |= X_DIRECTION_FLAG;
xPWM = -xPWM;
TIM1_OC1PolarityConfig(TIM1_OCPOLARITY_HIGH);
} 小不点儿 发表于 2012-10-5 10:47 static/image/common/back.gif
请问源代码中的这段什么意思?
if (xPWM >= 0)
{
代码下面不是有解释么? gzhuli 发表于 2012-10-5 11:28 static/image/common/back.gif
代码下面不是有解释么?
初学者,正在用MSP430做,在学习STM8的源代码,但是进展很慢,希望您能给出AD以及TIMI(也就是您公布的程序)的源代码的详细讲解,就当是扫盲,普及一下C语言编程的知识,please~~~~ 小不点儿 发表于 2012-10-5 12:03 static/image/common/back.gif
初学者,正在用MSP430做,在学习STM8的源代码,但是进展很慢,希望您能给出AD以及TIMI(也就是您公 ...
如果 (xPWM 大于等于 0)
{
方向 与等于 取反X_方向_标记;
定时器1_输出比较器1极性设置(定时器1_输出比较器极性_低);
}
否则
{
方向 或等于 X_方向_标记;
xPWM 等于 负xPWM;
定时器1_输出比较器1极性设置(定时器1_输出比较器极性_高);
}不知道这样够详细了没有?
页:
[1]
2