搜索
bottom↓
回复: 162

用ATmega8制作的下推式磁悬浮

  [复制链接]

出0入0汤圆

发表于 2009-12-24 18:46:30 | 显示全部楼层 |阅读模式
最近这段时间在坛里溜达,闲来无事,参照《STM8下推式磁悬浮实验 》,用Mega8+L298N+3503做了个下推式磁悬浮, 现将图片发上来,供参考。


(原文件名:1.jpg)


(原文件名:2.jpg)


(原文件名:3.jpg)


(原文件名:4.jpg)

没有大环形磁铁,就用小磁铁围一圈代替,效果很好。

(原文件名:7.jpg)
霍尔器件位于四个电磁铁中间位置。


(原文件名:HR.jpg)

出0入0汤圆

发表于 2018-7-8 18:11:26 | 显示全部楼层
我的做好了不工作正在研究怎么搞,对这个单片机不太了解,搞起来好麻烦

出0入0汤圆

发表于 2018-6-28 22:13:24 | 显示全部楼层
标记一下  打算动手做一个

出0入0汤圆

发表于 2018-6-16 10:08:22 | 显示全部楼层
磁悬浮玩具还有新动向吗

出0入0汤圆

发表于 2015-12-22 13:28:43 | 显示全部楼层
liguang70217 发表于 2009-12-25 18:12
源程序公开:
//--------------------------------------------------------------------------
//下推式磁 ...

还在的话我想问一句,你原理图里画的是PB1,PB2
为什么程序里写的
#define  LED_A _PB0
#define  LED_B _PB1
(恕我小白)

出0入0汤圆

发表于 2015-5-14 20:28:07 | 显示全部楼层
电子知识不太高  但是我想做一个这个磁悬浮,  有师傅可以教教我吗

出0入0汤圆

发表于 2014-8-8 17:05:12 | 显示全部楼层
学习了!!!!!

出0入0汤圆

 楼主| 发表于 2014-8-6 22:52:10 | 显示全部楼层
喝点小酒就晕了

出0入0汤圆

 楼主| 发表于 2014-8-6 22:51:15 | 显示全部楼层

哦!,操作错误现在行了

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-8-6 22:50:01 | 显示全部楼层
文件为何传不上来?

出0入0汤圆

 楼主| 发表于 2014-8-6 22:49:31 | 显示全部楼层
BIT.h等文件论坛里原先有的,懒得找了就放上来

出0入0汤圆

 楼主| 发表于 2014-8-6 22:48:43 | 显示全部楼层
BIT.h等文件论坛里原先有的,懒得找了就放上来

出0入0汤圆

发表于 2014-8-5 16:52:14 | 显示全部楼层
不错啊,我也想玩一下

出0入4汤圆

发表于 2014-6-16 23:43:54 | 显示全部楼层
高!      

出0入0汤圆

发表于 2014-6-16 13:47:33 | 显示全部楼层
chongcao 发表于 2010-5-31 16:22
谢谢楼主的回复,找到了:RD_UseAVRPORTBit.h AVR通用位操作支持库。
本人对单片机了解不多,真诚向各位大 ...

RD_UseAVRPORTBit.h AVR通用位操作支持库....那个地方可以下载啊。我新手,希望高手们多多帮助。。

出0入0汤圆

发表于 2013-7-8 11:26:30 | 显示全部楼层
crazy_b-boy  ----- 你的怎么让他旋转呢?

出0入0汤圆

发表于 2013-7-8 11:23:20 | 显示全部楼层
郁闷,楼主是不是弃楼了,呵呵;我的联系方式chengli008@126.com

出0入0汤圆

发表于 2013-7-8 11:11:09 | 显示全部楼层
crazy_b-boy--我的也是一直抖动,p已经=70了,d和i调整没有用,请问有什么好主意吗

发表于 2010-11-16 14:17:35 |只看该作者
我放上上去上面的磁铁一直在抖 一会就掉了 非常不稳定 有时候还转得非常快

出0入0汤圆

发表于 2013-3-13 16:53:43 | 显示全部楼层
多谢分享,强力顶一下

出0入0汤圆

发表于 2013-2-3 20:49:02 | 显示全部楼层
跟科幻片一样的东西

出0入0汤圆

发表于 2013-1-30 16:12:48 | 显示全部楼层
学习了~~

出0入0汤圆

发表于 2013-1-30 16:12:29 | 显示全部楼层
学习了~~

出0入0汤圆

发表于 2013-1-5 15:58:26 | 显示全部楼层
我看了其他的一些用全硬件设计的用了3个霍尔元件,这里貌似只用了两个?

出0入0汤圆

发表于 2012-11-12 23:26:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-10-30 08:53:04 | 显示全部楼层
牛人阿!!!

出0入0汤圆

发表于 2012-10-30 08:43:45 | 显示全部楼层
酷b了      

出0入0汤圆

发表于 2012-10-29 23:04:34 | 显示全部楼层
cool                                            

出0入0汤圆

发表于 2012-10-4 16:07:49 | 显示全部楼层
这个可以做什么玩具吗?

出0入0汤圆

发表于 2012-10-4 14:05:04 | 显示全部楼层
请问有人做过MSP430的这个磁悬浮的移植吗,求解。。。

出0入0汤圆

发表于 2012-9-21 20:54:23 | 显示全部楼层
mark!!!!!

出0入0汤圆

发表于 2012-8-4 10:42:10 | 显示全部楼层
liguang70217 发表于 2009-12-25 18:12
源程序公开:
//--------------------------------------------------------------------------
//下推式磁 ...

您的代码和之前提供的代码只是删除了#include"BIT.H",这样的代码没有影响吗?

出0入0汤圆

发表于 2012-8-4 10:12:54 | 显示全部楼层
请问在哪找到程序控制文件#include"BIT.h"啊??

出0入0汤圆

发表于 2012-7-24 14:05:27 | 显示全部楼层
强人,顶一下;不顶不行了;

出0入0汤圆

发表于 2012-7-23 19:28:46 | 显示全部楼层
本人是单片机小白,能教我编译和下载这程序到M8吗。。。。。。。。。QQ:527541953

出0入0汤圆

发表于 2012-7-14 18:14:57 | 显示全部楼层
用ATmega8制作的下推式磁悬浮

出0入0汤圆

发表于 2012-5-2 07:33:24 | 显示全部楼层
程序有个地方看不懂
if(xpos>ZD)
{
xpos=xpos-ZD;
CA=1;
xError = xPID.targetValue - xpos;
xPWM = calcPID(&xPID, xError);
OCR1A = xPWM;
}
else
{
xpos=ZD-xpos;
CA=0;
xError = xpos;
xPWM = calcPID(&xPID, xError);
OCR1A = xPWM;
}
为什么xpos>ZD,xpos=xpos-ZD,xError = xPID.targetValue - xpos
    而当xpos<ZD的时候却是xpos=ZD-xpos,xError = xpos而不是xError = xPID.targetValue - xpos

出0入0汤圆

发表于 2012-4-1 22:03:49 | 显示全部楼层
成本很高啊 这个要太多磁铁了

出0入0汤圆

发表于 2012-2-19 18:18:46 | 显示全部楼层
求完整材料账单。。。巨菜的鸟飘过。。。。

出0入0汤圆

发表于 2012-1-15 11:24:03 | 显示全部楼层
楼主,可不可以透漏一下你的那个小磁铁的尺寸大小?谢谢

出0入0汤圆

发表于 2011-12-8 21:45:01 | 显示全部楼层
ding顶,材料很难备齐

出0入0汤圆

发表于 2011-10-5 21:16:07 | 显示全部楼层
回复【115楼】mykent
请问bit.h文件那里有呀
--------------------------------------------------------------------
是不是楼主自己写的

出0入0汤圆

发表于 2011-9-29 15:51:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-9 11:21:22 | 显示全部楼层
很厉害,谁能教我做啊?那个黄色的是什么啊?

出0入0汤圆

发表于 2011-7-13 19:28:29 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-7-13 15:58:50 | 显示全部楼层
楼主牛人呀!!!好东西!!

出0入0汤圆

发表于 2011-6-27 21:44:40 | 显示全部楼层
非常好!!

出0入0汤圆

发表于 2011-6-27 21:13:37 | 显示全部楼层
mark,不错

出0入0汤圆

发表于 2011-6-27 20:45:43 | 显示全部楼层
请问bit.h文件那里有呀

出0入0汤圆

发表于 2011-6-5 23:15:00 | 显示全部楼层
太好了,学习一下

出0入0汤圆

发表于 2011-5-26 10:13:50 | 显示全部楼层
楼主   我想跟你联系  怎么做  上拉式磁悬浮,急急急,13401664320

出0入0汤圆

发表于 2011-5-26 09:58:54 | 显示全部楼层
回复【22楼】liguang70217
-----------------------------------------------------------------------

兄弟    你的上拉式磁悬浮系统还在不?

出0入0汤圆

发表于 2011-5-15 09:34:23 | 显示全部楼层
回复【79楼】liguang70217
上电就有输出,电磁铁不放上的话理论上霍尔无信号,先调节运放输出电压为参考电压的1/2值,线圈温热属正常,511不需要改。
-----------------------------------------------------------------------



楼主你好,请问图中画红圈的是什么元件?我新手,不怎么懂。。。

(原文件名:E039141C-C6B9-4A6F-90CC-9C0A98522CCC.jpg)

出0入0汤圆

发表于 2011-5-14 19:41:20 | 显示全部楼层

用ATmega8制作的下推式磁悬浮 (原文件名:E039141C-C6B9-4A6F-90CC-9C0A98522CCC.jpg)
楼主你好,请问图中画红圈的是什么元件?我新手,不怎么懂。。。

出0入112汤圆

发表于 2011-4-11 20:01:24 | 显示全部楼层
强!

出0入0汤圆

发表于 2011-4-10 13:17:55 | 显示全部楼层
这悬浮最大高度是多少呀?有没有7CM   ??

出0入0汤圆

发表于 2011-3-24 22:46:57 | 显示全部楼层
回复【101楼】crazy b-boy
-----------------------------------------------------------------------

你好 我好像也和你遇到了同样的问题  就是抖动得厉害 不知道咋解决。。

出0入0汤圆

发表于 2010-12-14 16:48:55 | 显示全部楼层
看完了,大受鼓舞,虽然只研究过51单片机,帮人做过m16的电路,还是下决心做一个这个玩玩,顺便学习一下

出0入0汤圆

发表于 2010-12-12 00:16:31 | 显示全部楼层
尊敬的楼主您好:
            
              我刚买了一个磁悬浮地球仪,想问您下线路板正面的两个黑色圆形集成电路是什么型号,还有霍尔元件的型号。谢谢您。

出0入0汤圆

发表于 2010-12-4 18:27:22 | 显示全部楼层
回复【102楼】chongcao
-----------------------------------------------------------------------

谢谢您

出0入618汤圆

发表于 2010-12-2 22:50:13 | 显示全部楼层
回复【101楼】crazy b-boy
-----------------------------------------------------------------------
只加了1点积分就好了?不过积分确实有收敛振荡的作用。


回复【102楼】chongcao
-----------------------------------------------------------------------
找不到非晶棒,中波天线用的铁氧体磁棒效果不好,应该是导磁率太低。暂时没有时间改进了。

出0入0汤圆

发表于 2010-12-2 17:15:41 | 显示全部楼层
请教:gzhuli 咕唧霖
不知非晶研究的怎样,电磁铁的铁芯,目前用什么材料好?
提高悬浮距离。目前可以做哪些改进?

出0入0汤圆

发表于 2010-12-2 15:41:01 | 显示全部楼层
回复【98楼】gzhuli 咕唧霖
-----------------------------------------------------------------------

xPID.Kp = 4;   
xPID.Ki = 1;   
xPID.Kd = 26;
风扇撤了  初期调试时候调不好就热 也没动它 后期拆了

出0入0汤圆

发表于 2010-12-2 09:01:10 | 显示全部楼层

出0入0汤圆

发表于 2010-12-2 00:10:20 | 显示全部楼层
mark

出0入618汤圆

发表于 2010-12-1 21:15:07 | 显示全部楼层
很不错呀,能说说最后参数是怎么样的吗?
另外,L298N那么大个散热还要加风扇?应该没这么大功耗的吧?我DIP16的L293D都没上散热片。

出0入0汤圆

发表于 2010-12-1 20:36:32 | 显示全部楼层
http://v.youku.com/v_show/id_XMjI2NjMxMTI4.html 我做的优酷视频

出0入0汤圆

发表于 2010-12-1 20:36:03 | 显示全部楼层
回复【95楼】gzhuli 咕唧霖
-----------------------------------------------------------------------


谢谢您

出0入618汤圆

发表于 2010-12-1 09:26:49 | 显示全部楼层
回复【94楼】crazy b-boy
-----------------------------------------------------------------------

成功了?

出0入0汤圆

发表于 2010-11-30 21:33:49 | 显示全部楼层
点击此处打开 ourdev_601455HZJE07.jpg(文件大小:1.22M,只有400K以内的图片才能直接显示) (原文件名:20101128322.jpg)

出0入0汤圆

发表于 2010-11-26 15:45:29 | 显示全部楼层
为什么我测量线圈两端只有一个方向的电压啊
不是双极性吗?

出0入0汤圆

发表于 2010-11-21 21:33:03 | 显示全部楼层
楼主:你好!
    我想同你联系,如果可以请给我来电:13064607808,或来个短信,谢谢!

出0入0汤圆

发表于 2010-11-21 21:28:37 | 显示全部楼层
回复【楼主位】liguang70217
-----------------------------------------------------------------------

你好,能给我多指导吗?我是外行,但我相信我能。

出0入0汤圆

发表于 2010-11-21 19:28:57 | 显示全部楼层
会不会是 电阻放大的21倍 就很大了 pwm占空比输出就很大啊

出0入0汤圆

发表于 2010-11-21 19:23:53 | 显示全部楼层
熔丝位是1111吧 16M 晶振 PID 不合适 他就会一直抖吗?

出0入0汤圆

发表于 2010-11-18 19:49:02 | 显示全部楼层
我的是19  可能是小了 线圈距离有些大

出0入0汤圆

 楼主| 发表于 2010-11-18 18:28:21 | 显示全部楼层
PID参数凭经验而定,但一定要理解到位三个参数的作用,设置就简单了;悬浮磁铁应加配重,如果悬浮磁铁较轻的话同样不稳;我的那个是直径25的。

出0入0汤圆

发表于 2010-11-18 17:40:30 | 显示全部楼层
12M的晶振 ADCSRA = 0xC3;            /*使能、开启、8分频*/这是采样频率吧 用手拿着可以感觉到个方向的阻力
xPID.Kp = 4;  
xPID.Ki = 0;  
xPID.Kd = 30; 参数调的时候我怎么看震荡啊  位置的偏差也就是霍尔了 洞洞板两个洞之间的距离吧

出0入0汤圆

 楼主| 发表于 2010-11-18 13:34:03 | 显示全部楼层
晶振多大的?我用的是16M,底下的磁铁要和电磁铁平行,电磁铁在上,环形磁铁在下,电磁铁中心部分下半节可以放入半截磁芯,以加强磁力,一般的抖动的原因:一是单片机运行速度不够快,二是电磁铁磁力不够,三是永磁铁和电磁铁的位置偏差较大。

出0入0汤圆

发表于 2010-11-16 14:17:35 | 显示全部楼层
我放上上去上面的磁铁一直在抖 一会就掉了 非常不稳定 有时候还转得非常快

出0入0汤圆

发表于 2010-10-26 18:49:29 | 显示全部楼层
//--------------------------------------------------------------------------
//下推式磁悬浮源程序  2009.12.18
//liguang70217
//liguang70217@126.com
//http://liguang70217.blog.hexun.com/
//ICC-AVR application builder : 2009-12-17 17:27:22
// Target : M8
// Crystal: 12.000Mhz
//--------------------------------------------------------------------------
#include <iom8v.h>
#include <macros.h>
#define  N  7
#define MAX_PID_OUTPUT       950
#define MAX_INTEGRATION_ERROR 100
#define X_DIRECTION_FLAG         0x01
#define Y_DIRECTION_FLAG         0x02
//--------------------------------------------------------------------------
typedef struct {
int targetValue;
int Kp;
int Ki;
int Kd;
int integrationError;
int prevError;
} PID;

PID xPID,yPID;

unsigned char direction;

unsigned int value_buf_x[N],value_buf_y[N];
unsigned char ix=0,iy=0;

unsigned int xpos,ypos;  //AD转换后存放采集值
unsigned char HH;

unsigned int  xError, yError;
unsigned int  xPWM, yPWM;
//--------------------------------------------------------------------------
//------------延时子程序----------------------------------------------------
void delay(unsigned int h)
{
unsigned char j;
while(h--){
       for(j=190;--j;) continue;
          }
}
//--------------------------------------------------------------------------
// PID calculation routine  
int calcPID(PID *pid, int error)
{
int output;

if (pid->Ki != 0)
{
pid->integrationError += error;
// Limit the maximum integration error
if (pid->integrationError > MAX_INTEGRATION_ERROR)
{
pid->integrationError = MAX_INTEGRATION_ERROR;
}
else if (pid->integrationError < -MAX_INTEGRATION_ERROR)
{
pid->integrationError = -MAX_INTEGRATION_ERROR;
}
}

output = pid->Kp * error + pid->Ki * pid->integrationError + pid->Kd * (error - pid->prevError);

// Limit the maximum output
if (output > MAX_PID_OUTPUT)
{
output = MAX_PID_OUTPUT;
}
else if (output < -MAX_PID_OUTPUT)
{
output = -MAX_PID_OUTPUT;
}

pid->prevError = error;
  return output;
}
//--------------------------------------------------------------------------
void port_init(void)
{
PORTB = 0xff;
DDRB  = 0xff;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0xff;
}
//--------------------------------------------------------------------------
//TIMER1 initialize - prescale:1
// WGM: 7) PWM 10bit fast, TOP=0x03FF
// desired value: 2KHz
// actual value: 11.719KHz (82.9%)
void timer1_init(void)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x00;//中断允许
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x01;
OCR1AL = 0xFF;//匹配A值
OCR1BH = 0x01;
OCR1BL = 0xFF;//匹配B值
ICR1H  = 0xFF;
ICR1L  = 0xFF;//输入捕捉匹配值
TCCR1A = 0xA3;
TCCR1B = 0x09;//启动定时器
}
//--------------------------------------------------------------------------
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
MCUCR  = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR   = 0x00;
  
port_init();
timer1_init();

// TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//-----------------------------------------------------------------------------
//ADC采样函数,采样第0通道信号,采样分辨率256
//x为ad端口号
unsigned int get_ad(unsigned char x)  
{
union adres{ int y1; unsigned  char  adre[2]; }adresult;
unsigned int i;
ADMUX = 0xc0+x;            /*基准AVCC、左对齐、通道7*/   
ADCSRA = 0xC3;            /*使能、开启、8分频*/
while(!(ADCSRA & (1 << ADIF)));   /*等待*/
adresult.adre[0]=ADCL;            //读取并存储A/D转换结果,A/D转换的结果通过共
adresult.adre[1]=ADCH;            //用体的形式放入了变量y1中   
ADCSRA &= ~(1 << ADIF);    /*清标志*/
ADCSRA &= ~(1 << ADEN);    /*关闭转换*/
return adresult.y1;
}
//--------------------------------------------------------------------------
//滑动平均滤波
unsigned int filter_x(void)
{
   unsigned char count;
   unsigned long  sum=0;
   value_buf_x[ix] = get_ad(0);
   ix=ix+1;
   if ( ix == N ) ix = 0;
   for ( count=0;count<N;count++)
             sum = sum + value_buf_x[count];
   return (unsigned int)(sum/N);
}
//--------------------------------------------------------------------------
//滑动平均滤波
unsigned int filter_y(void)
{
   unsigned char count;
   unsigned long  sum=0;
   value_buf_y[iy] = get_ad(1);
   iy=iy+1;
   if ( iy == N ) iy = 0;
   for ( count=0;count<N;count++)
           sum = sum + value_buf_y[count];
   return (unsigned int)(sum/N);
}
//-----------------------------------------------------------------------------
void main(void)
{
unsigned int ZD;
unsigned int ccc;
init_devices();
  
ZD=511;
// PID Parameter Initialization
xPID.Kp = 4;
xPID.Ki = 0;
xPID.Kd = 30;
xPID.integrationError = 0;
xPID.prevError = 0;
xPID.targetValue = ZD;

yPID.Kp = 4;
yPID.Ki = 0;
yPID.Kd = 30;
yPID.integrationError = 0;
yPID.prevError = 0;
yPID.targetValue = ZD;


  
  while(1)  
  {
   xpos=filter_x();
   ypos=filter_y();
   
   if(xpos>ZD)
   {  
    xpos=xpos-ZD;  
PORTD|=(1<<0);  //CA=1
    xError = xPID.targetValue - xpos;
    xPWM   = calcPID(&xPID, xError);
    OCR1A  = xPWM;   
   }
   else  
   {  
    xpos=ZD-xpos;  
PORTD&=~(1<<0);   //CA=0  
xError = xpos;
    xPWM   = calcPID(&xPID, xError);
    OCR1A  = xPWM;
   }
      
   if(ypos>ZD)
   {
    ypos=ypos-ZD;  
PORTD|=(1<<1);  //CB=1  
    yError = yPID.targetValue - ypos;
    yPWM   = calcPID(&yPID, yError);
    OCR1B  = yPWM;   
   }
   else  
   {  
    ypos=ZD-ypos;  
PORTD&=~(1<<1);   //CB=0
    yError = ypos;
    yPWM   = calcPID(&yPID, yError);
    OCR1B  = yPWM;   
   }
  }
}
望高手指教

出0入0汤圆

发表于 2010-10-26 17:20:06 | 显示全部楼层
仿造不成功啊 线圈电阻多大啊 有反馈 硬件不用太苛刻吧 郁闷

出0入0汤圆

发表于 2010-10-26 17:18:23 | 显示全部楼层
//--------------------------------------------------------------------------
//下推式磁悬浮源程序  2009.12.18
//liguang70217
//liguang70217@126.com
//http://liguang70217.blog.hexun.com/
//ICC-AVR application builder : 2009-12-17 17:27:22
// Target : M8
// Crystal: 12.000Mhz
//--------------------------------------------------------------------------
#include <iom8v.h>
#include <macros.h>
#define  N  7
#define MAX_PID_OUTPUT       950
#define MAX_INTEGRATION_ERROR 100
#define X_DIRECTION_FLAG         0x01
#define Y_DIRECTION_FLAG         0x02
//--------------------------------------------------------------------------
typedef struct {
int targetValue;
int Kp;
int Ki;
int Kd;
int integrationError;
int prevError;
} PID;

PID xPID,yPID;

unsigned char direction;

unsigned int value_buf_x[N],value_buf_y[N];
unsigned char ix=0,iy=0;

unsigned int xpos,ypos;  //AD转换后存放采集值
unsigned char HH;

unsigned int  xError, yError;
unsigned int  xPWM, yPWM;
//--------------------------------------------------------------------------
//------------延时子程序----------------------------------------------------
void delay(unsigned int h)
{
unsigned char j;
while(h--){
       for(j=190;--j;) continue;
          }
}
//--------------------------------------------------------------------------
// PID calculation routine  
int calcPID(PID *pid, int error)
{
int output;

if (pid->Ki != 0)
{
pid->integrationError += error;
// Limit the maximum integration error
if (pid->integrationError > MAX_INTEGRATION_ERROR)
{
pid->integrationError = MAX_INTEGRATION_ERROR;
}
else if (pid->integrationError < -MAX_INTEGRATION_ERROR)
{
pid->integrationError = -MAX_INTEGRATION_ERROR;
}
}

output = pid->Kp * error + pid->Ki * pid->integrationError + pid->Kd * (error - pid->prevError);

// Limit the maximum output
if (output > MAX_PID_OUTPUT)
{
output = MAX_PID_OUTPUT;
}
else if (output < -MAX_PID_OUTPUT)
{
output = -MAX_PID_OUTPUT;
}

pid->prevError = error;
  return output;
}
//--------------------------------------------------------------------------
void port_init(void)
{
PORTB = 0xff;
DDRB  = 0xff;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0xff;
}
//--------------------------------------------------------------------------
//TIMER1 initialize - prescale:1
// WGM: 7) PWM 10bit fast, TOP=0x03FF
// desired value: 2KHz
// actual value: 11.719KHz (82.9%)
void timer1_init(void)
{
TCCR1B = 0x00;//停止定时器
TIMSK |= 0x00;//中断允许
TCNT1H = 0x00;
TCNT1L = 0x00;//初始值
OCR1AH = 0x01;
OCR1AL = 0xFF;//匹配A值
OCR1BH = 0x01;
OCR1BL = 0xFF;//匹配B值
ICR1H  = 0xFF;
ICR1L  = 0xFF;//输入捕捉匹配值
TCCR1A = 0xA3;
TCCR1B = 0x09;//启动定时器
}
//--------------------------------------------------------------------------
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
MCUCR  = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR   = 0x00;
  
port_init();
timer1_init();

// TIMSK = 0x04; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//-----------------------------------------------------------------------------
//ADC采样函数,采样第0通道信号,采样分辨率256
//x为ad端口号
unsigned int get_ad(unsigned char x)  
{
union adres{ int y1; unsigned  char  adre[2]; }adresult;
unsigned int i;
ADMUX = 0xc0+x;            /*基准AVCC、左对齐、通道7*/   
ADCSRA = 0xC3;            /*使能、开启、8分频*/
while(!(ADCSRA & (1 << ADIF)));   /*等待*/
adresult.adre[0]=ADCL;            //读取并存储A/D转换结果,A/D转换的结果通过共
adresult.adre[1]=ADCH;            //用体的形式放入了变量y1中   
ADCSRA &= ~(1 << ADIF);    /*清标志*/
ADCSRA &= ~(1 << ADEN);    /*关闭转换*/
return adresult.y1;
}
//--------------------------------------------------------------------------
//滑动平均滤波
unsigned int filter_x(void)
{
   unsigned char count;
   unsigned long  sum=0;
   value_buf_x[ix] = get_ad(0);
   ix=ix+1;
   if ( ix == N ) ix = 0;
   for ( count=0;count<N;count++)
             sum = sum + value_buf_x[count];
   return (unsigned int)(sum/N);
}
//--------------------------------------------------------------------------
//滑动平均滤波
unsigned int filter_y(void)
{
   unsigned char count;
   unsigned long  sum=0;
   value_buf_y[iy] = get_ad(1);
   iy=iy+1;
   if ( iy == N ) iy = 0;
   for ( count=0;count<N;count++)
           sum = sum + value_buf_y[count];
   return (unsigned int)(sum/N);
}
//-----------------------------------------------------------------------------
void main(void)
{
unsigned int ZD;
unsigned int ccc;
init_devices();
  
ZD=511;
// PID Parameter Initialization
xPID.Kp = 4;
xPID.Ki = 0;
xPID.Kd = 30;
xPID.integrationError = 0;
xPID.prevError = 0;
xPID.targetValue = ZD;

yPID.Kp = 4;
yPID.Ki = 0;
yPID.Kd = 30;
yPID.integrationError = 0;
yPID.prevError = 0;
yPID.targetValue = ZD;


  
  while(1)  
  {
   xpos=filter_x();
   ypos=filter_y();
   
   if(xpos>ZD)
   {  
    xpos=xpos-ZD;  
PORTD|=(1<<0);  //CA=1
    xError = xPID.targetValue - xpos;
    xPWM   = calcPID(&xPID, xError);
    OCR1A  = xPWM;   
   }
   else  
   {  
    xpos=ZD-xpos;  
PORTD&=~(1<<0);   //CA=0  
xError = xpos;
    xPWM   = calcPID(&xPID, xError);
    OCR1A  = xPWM;
   }
      
   if(ypos>ZD)
   {
    ypos=ypos-ZD;  
PORTD|=(1<<1);  //CB=1  
    yError = yPID.targetValue - ypos;
    yPWM   = calcPID(&yPID, yError);
    OCR1B  = yPWM;   
   }
   else  
   {  
    ypos=ZD-ypos;  
PORTD&=~(1<<1);   //CB=0
    yError = ypos;
    yPWM   = calcPID(&yPID, yError);
    OCR1B  = yPWM;   
   }
  }
}

仿造没成功  线圈电阻大约多少啊 有反馈 硬件也不用太精确啊 郁闷

出0入0汤圆

发表于 2010-10-25 16:52:15 | 显示全部楼层
回复【79楼】liguang70217
-----------------------------------------------------------------------

谢谢楼主

出0入0汤圆

 楼主| 发表于 2010-10-25 13:15:29 | 显示全部楼层
上电就有输出,电磁铁不放上的话理论上霍尔无信号,先调节运放输出电压为参考电压的1/2值,线圈温热属正常,511不需要改。

出0入0汤圆

发表于 2010-10-25 12:38:24 | 显示全部楼层
一上电就有输出?霍尔高吗?电压不是中间值?线圈还热?511要改吗?

出0入0汤圆

发表于 2010-7-27 15:23:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-24 16:37:15 | 显示全部楼层
请教!LZ的源程序,其中unsigned int ccc; 是什么意思


//-----------------------------------------------------------------------------
void main(void)
{
unsigned int ZD;
unsigned int ccc;
init_devices();
  
ZD=511;
// PID Parameter Initialization
xPID.Kp = 4;
xPID.Ki = 0;
xPID.Kd = 30;
xPID.integrationError = 0;
xPID.prevError = 0;
xPID.targetValue = ZD;

yPID.Kp = 4;
yPID.Ki = 0;
yPID.Kd = 30;
yPID.integrationError = 0;
yPID.prevError = 0;
yPID.targetValue = ZD;


  
  while(1)  
  {

出0入0汤圆

发表于 2010-6-23 20:58:05 | 显示全部楼层
狠人啊

出0入0汤圆

发表于 2010-6-23 20:35:07 | 显示全部楼层
线圈不会热吗

出0入0汤圆

发表于 2010-6-23 20:11:21 | 显示全部楼层
好酷  我回来了

出0入618汤圆

发表于 2010-6-9 22:23:46 | 显示全部楼层
回复【71楼】chongcao
-----------------------------------------------------------------------

没有啊……

出0入0汤圆

发表于 2010-6-9 09:42:24 | 显示全部楼层
gzhuli 咕唧霖 同志,你有:elder60 60岁老头的联系方式吗?我有事情想请教他,一直没他的消息。

出0入0汤圆

发表于 2010-6-8 15:49:01 | 显示全部楼层
谢谢大师的指导!
由于有前期制作模拟电路的经验,对单片机的实验,想了半天才想明白其中的原理(没改程序)。但是只是对整个程序工作原理有大致了解,对其中的P、I、D参数还真不明白,不知道他们做何用?
我现在的实验,I 取何值比较合适?程序其他地方还动吗?

出0入618汤圆

发表于 2010-6-8 11:11:29 | 显示全部楼层
原来的程序是控制磁铁水平位置的,上拉式是控制垂直距离的,PID参数需要重新调整才能工作在最佳状态。
由于上拉式是单向的,没有一个中点位置,应该要把I参数也用上,以修正累积误差,否则时间长了累积误差不断增大,就不能悬浮了。

出0入0汤圆

发表于 2010-6-8 10:06:32 | 显示全部楼层
谢谢楼主的指导,我把M8做下推悬浮的程序直接用于上拉式悬浮,程序没改,用了一个通道,功率驱动用了一只场效应管,霍尔检测先放在下端(这种方法最简单,容易理解、调试),悬浮成功。
    实验发现,场效应管的输入电容效应还是比较明显的,把方波拉弯了,好在不影响工作。
    不知何故,稳定性没有模拟的好,原来实验的模拟电路,可以说一丝不动,放2个小时也没问题,单片机反而不是很理想,原以为会更好。
    提高悬距不知从何下手?
    提高功放供电电压?增加电磁铁的圈数?用更大更强的悬浮磁铁?

出0入618汤圆

发表于 2010-6-6 10:28:30 | 显示全部楼层
磁悬浮是一个闭环控制系统,电磁铁控制悬浮磁铁,霍尔检测磁铁位置反馈给控制电路,最终使霍尔输出和中点电压相等,所以其实1.65V并不需要绝对精准,系统能自动调节过来的。
4个电磁铁控制的是悬浮磁铁的水平位置,不能控制倾斜,所以有可能还要加适当的配重物,使悬浮磁铁保持稳定。

出0入0汤圆

发表于 2010-6-6 10:00:56 | 显示全部楼层
噢,大师在线呀!谢谢了,我那实验波形对吗?
理论上,如果1.65V准确就应该是一条线?既然有误差,是不是不必刻意追求1.65V的准确?
1.65V,调试很敏感,直接用10K调,太敏感,回头上下加10K电阻试试。 ---可行否?
把10K 可变电阻接到3.3v试试。
    通过实验我还发现,实际的情况与我原来的想象还是有出入的。原以为,上磁铁倾斜才会有霍尔反映的,实际是,上磁铁水平移动到一定距离霍尔才反映的,霍尔检测的主要是上磁铁的水平移动!

出0入618汤圆

发表于 2010-6-6 09:48:15 | 显示全部楼层
方波输出肯定有的,哪有1.65V一点不差的?

出0入0汤圆

发表于 2010-6-6 09:24:54 | 显示全部楼层
谢谢楼上的指导!
    LM324 m8电路,面包板已制作完毕,遗憾的是,下载源程序时,可能是并口下载线制作有问题,烧坏了台式机的并口。好在用笔记本下载通过。以后再做个,USB-ISP 下载线吧。
   1.65V,调试很敏感,直接用10K调,太敏感,回头上下加10K电阻试试。
   没有接电磁铁,用示波器观察某一组的波形,当1.65V正确时,能够得到设计的波形,且能够随着磁体-霍尔的相对位置的变化而变化,但是如果1.65V偏离太大,控制波形就不是理想设计的了。
   霍尔上端没有磁铁时,为什么PD0 PB1仍然有方波输出?
   根据示波器波形画出如下波形示意图:


(原文件名:实验波形动画.GIF)
     从中可以看出,上磁铁左--右移动时,PB1的波形“极性”发生了变化(有个界线),占空比也随磁铁的移动变化,与程序的原理相吻合。

出0入618汤圆

发表于 2010-6-5 16:09:52 | 显示全部楼层
回复【62楼】chongcao
-----------------------------------------------------------------------

是的。

出0入0汤圆

发表于 2010-6-4 17:08:35 | 显示全部楼层
回复【61楼】chongcao
-----------------------------------------------------------------------

似有悟,不知对否?

(原文件名:ZD.GIF)
  T1 T2 期间:PORTD=0<<PD1;//PD1=0  
              yError = 511-ypos;  
           OCR1B  = calcPID(&yPID, yError);
             可以理解为:          偏差愈大,占空比越高;
  T3 T4 期间:PORTD=1<<PD1;//PD1=1
           ypos=ypos-511;  
              yError = 511 - ypos;
              OCR1B  = calcPID(&yPID, yError);
              PWM波形极性没变,但是误差越大,占空比越小,此时起作用的是,PWM波形的低电平,“空”越宽,从而最终加到电磁铁上的波形极性是反转的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 06:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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