bigallium 发表于 2011-2-13 00:47:03

上拉式磁悬浮试验成功

嗯,整个装置就是这样,如图。用STM32采样两个霍尔的值,相减再减去两个霍尔在无磁场时的电压差值就能得到磁铁产生的磁场的强度,从而得到磁铁与下面那个霍尔之间的距离(将磁场强度与距离在小距离变化内看作近似线性的),然后用PID控制就行了。
难度不大,有些编程知识就可以了的。
说一下经验吧:
1、用两个霍尔放在线圈两端,与铁心尽量等距,这样磁场测量基本就不会受到线圈磁场的影响了
2、用L298控制电流方便
3、线圈绕匝数少一点可以降低线圈电感,我这个电感太大了,0.23H我了个去,线圈电流调整时滞太大,磁铁震荡的厉害
4、没有用放大器放大霍尔信号,这可以省去很多硬件电路上的麻烦和不确定性,但AD位数要高不然震动大。其实我觉得12位好像还不够..要放大的话可以用LMV324,单电源轨到轨,很好使
5、霍尔和线圈间垫个木片什么,太近的话会过霍尔量程的
6、骨架是以前淘宝买的,线圈绕可以到电机或摩托修理店,那里有手动绕线机两千圈呼呼两分钟绕完了还有圈数示数
7、以上有什么错误的话欢迎指正,本大葱学电子也是半桶水的,学校自控原理大三才上还没学

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615700VNSB8P.jpg
(原文件名:20110212034.jpg)

bigallium 发表于 2011-2-13 00:56:54

两张图:

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615701CRYX5S.jpg
(原文件名:20110212028.jpg)

http://cache.amobbs.com/bbs_upload782111/files_36/ourdev_615702EVNUO1.jpg
(原文件名:20110212027.jpg)

视频,可以看到震动不小,郁闷呢
点击此处下载 ourdev_615703ZN17KU.rar(文件大小:3.13M) (原文件名:20110212.rar)

PID程序,不知道有没有用,发出来吧,程序写的不太规范= =

///////////////////////////////////////////////
//PID控制函数
//入口参数:两个通道的ADC值
///////////////////////////////////////////////
void PIDControl(USHORT16 adc1,USHORT16 adc2)
{
#define PWMVALUE TIM2->CCR2

const short PWMBias=500,DistanceBias=450;//PWM调整基值,磁铁与霍尔距离基值
static int MagnetDistance;//磁铁距离数组,1001大小是为了可能要后后期分析
static UINT32 DistancePointer=11;//磁铁距离数组指针
static int MagnetSpeed;//磁铁速度数组
static UINT32 SpeedPointer=11;//磁铁速度数组指针
static int Proportion,Integration,Differentiation,Result;//比例,积分,微分,运算结果

DistancePointer++;
SpeedPointer++;
MagnetDistance = adc1-adc2;//求两霍尔差值得到距离
MagnetSpeed = MagnetDistance
                               - MagnetDistance[(DistancePointer-4)%1000];//求四毫秒间平均速度

Proportion = ( MagnetDistance
               +MagnetDistance[(DistancePointer-1)%1000]
               +MagnetDistance[(DistancePointer-2)%1000]
               +MagnetDistance[(DistancePointer-3)%1000]
                )/4;//求四毫秒间平均距离,为了去除噪音
Proportion = ( Proportion - DistanceBias )*7;//距离减去距离基值乘以P参数7,得到比例调整值
                                             //,括号里的Proportion在上面求得了平局距离
Differentiation = MagnetSpeed*60;//速度乘以D参数220,得到微分调整值
Integration = 0;//不需要积分项

Result = PWMBias + Proportion + Differentiation + Integration;//求和
if(Result>4095) Result=0;
PWMVALUE = Result;//把结果给PWM

}

cqfeiyu 发表于 2011-2-13 01:22:27

牛人

gzhuli 发表于 2011-2-13 01:23:08

震动一般是PD参数没调好。

avr_16KB 发表于 2011-2-13 01:25:03

顶楼上的pp

sadf123 发表于 2011-2-13 09:23:42

恭喜LZ.

bigallium 发表于 2011-2-13 21:58:57

纠正了PID程序...之前的PID程序有误所以震荡很严重,其实之前PID程序能把磁铁挂起还真幸运。现在已经很稳了,PID参数调整对稳定性影响也不大。
有一个PC监视真的很方便。

///////////////////////////////////////////////
//PID控制函数
//入口参数:两个通道的ADC值
///////////////////////////////////////////////
void PIDControl(int adc1,int adc2)
{
#define PWMVALUE TIM2->CCR2

UCHAR8 DataBeTrans;

const int PWMBias=00,DistanceBias=550;//PWM调整基值,磁铁与霍尔距离基值
static int MagnetDistance;//磁铁距离数组,1001大小是为了可能要后后期分析
static UINT32 DistancePointer=11;//磁铁距离数组指针
static int MagnetSpeed;//磁铁速度数组
static UINT32 SpeedPointer=11;//磁铁速度数组指针
static int Proportion,Integration,Differentiation,Result;//比例,积分,微分,运算结果

DistancePointer++;
SpeedPointer++;
MagnetDistance =(DistanceBias- adc1+adc2);//求两霍尔差值得到距离,原来这里给弄错了。
if(MagnetDistance<0)MagnetDistance= 0;
MagnetSpeed = MagnetDistance
                               - MagnetDistance[(DistancePointer-4)%1000];//求四毫秒间平均速度

Proportion = ( MagnetDistance
               +MagnetDistance[(DistancePointer-1)%1000]
               +MagnetDistance[(DistancePointer-2)%1000]
               +MagnetDistance[(DistancePointer-3)%1000]
                )/4;//求四毫秒间平均距离,为了去除噪音
//if(Proportion > DistanceBias)Proportion=DistanceBias;
Proportion = Proportion*35;//距离减去距离基值乘以P参数7,得到比例调整值
                           //,括号里的Proportion在上面求得了平均距离

Differentiation = MagnetSpeed*200;//速度乘以D参数220,得到微分调整值
Integration = 0;//不需要积分项

Result = PWMBias + Proportion + Differentiation + Integration;//求和
if(Result>4096) Result=0;
if(Result<0) Result=0;
PWMVALUE = Result;//把结果给PWM

//以下为PC监视服务程序
ADCtoPC_Protocol(MagnetDistance, 1 , DataBeTrans);//将得到的AD值转换为PC协议可接收的数组
                  //监视距离
InsertDataToTxGroup(USART1,DataBeTrans);//发送第一字节,高8位
InsertDataToTxGroup(USART1,DataBeTrans);//发送第二字节,低8位

}

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/

yuanhaosh 发表于 2011-7-7 01:04:05

今天第一次上这个网站没想到这么多高手 有的忙了

doujiang 发表于 2012-2-12 20:07:39

mark

semonpic 发表于 2012-2-12 21:12:43

这个要顶

FpvCamera 发表于 2012-2-12 21:29:32

mark

ziyoudeyunduo 发表于 2012-3-27 16:20:40

我现在追求稳定的振动,把浮子安上透明翅膀,噗噗的振动,像一只蜻蜓,观赏价值大大提高。{:biggrin:}

praiseslow 发表于 2012-4-3 09:53:10

很佩服,楼主真有实干精神。

kmani 发表于 2013-5-22 09:35:00

本帖最后由 kmani 于 2013-5-22 09:38 编辑

感谢楼主了,一直在想这种悬浮怎么测浮子与线圈之间的距离(也没可以去查),看了楼主图文并茂的讲解之后明白了。
不过,我想了,楼主那样计算浮子与线圈之间的距离不太准确。以下是敝人的思路。
x-y=k1....(1);等式一。
x+(m/d^2)-(y+m/(d+le)^2)=k2....(2);等式二。
符号说明:x、y分别是下面、上面霍尔的读数。k1、k2分别是无、有磁场时下面霍尔读数与上面霍尔读数的差值。
d、le分别是浮子与下面霍尔的距离以及线圈的高度(就上下两个霍尔之间的距离)。m是浮子紧贴着霍尔时,霍尔的读数,可以用测电池内阻那种方法间接得到m的准确值。
计算方法:等式二减去等式一得:(m/d^2)-m/(d+le)^2=k2-k1 ;这里只有d是未知量,可以解出来。
这样计算就比较准确了。

xinglucao 发表于 2013-5-22 21:36:14

嗯!以前做过一个!就是很简单的一个硬件负反馈!很稳定呢!

lucky_jeck 发表于 2013-6-1 08:30:22

学习学习。
{:lol:}

tlsmf 发表于 2013-11-10 11:40:29

顶            正在搞

nbm_qyh 发表于 2014-1-12 12:05:41

学习了,收藏

hezhiyao 发表于 2014-5-10 13:55:10

您好,我自己也在做一个磁悬浮。请问霍尔和线圈以及磁铁之间是怎么工作的啊?能不能解释一下,不胜感激

richard1984 发表于 2019-9-6 11:40:11

问一下,驱动L298n用的是一路PWM还是两路PWM?

nazicj 发表于 2021-3-29 15:47:37

牛人真厉害!!!
页: [1]
查看完整版本: 上拉式磁悬浮试验成功