查看: 2049|回复: 0
打印 上一主题 下一主题

上拉式磁悬浮在实验室

[复制链接]
跳转到指定楼层
沙发
发表于 2015-4-9 19:29:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
材料:
霍尔传感器3503  1个;
MEGA16最小系统一块;
电磁铁 1个;
强磁铁  3个;
298驱动 1块;
12V  电源1个;
10欧姆10瓦水泥电阻 2个;

说明:
mega16的AD是10位的,但我只用了8位。
电磁铁内阻8欧姆左右。。。。。。我绕了很多圈但内阻还是偏小,应该是线太粗了的原因,建议大家用稍微细一点的漆包线。
298驱动是我们实验室一个师兄画的板子,加了文雅芯片,可以输出5V给单片机供电。
水泥电阻的作用是限流,两个并联的。

程序:
#ifndef ADC_H
#define ADC_H

#define        FILMASK                 3
#define        FILNUM                 4
#define        WARP(X)                X=((X+1)&FILMASK)
uchar FilterBuf[FILNUM];
uchar Dx=0;
uchar AdValue;
uchar Filter(uchar * value);
void delayms(uint i)
{
         uint j;
         while(i--)
         {
                  for(j=0;j<30;j++);//至少20才能让ADC比较正常
         }
}
void ADC_init()
{
        ADMUX=0X60;
        ADCSRA=0X87;
}
uint get_adc(uchar channel)
{
                uint a=0,b=0;
                uchar c;
            c=0x60+channel;
                ADMUX=c;
                delayms(1);
                while(!(c==ADMUX));
                ADCSRA|=0X40;
                while(!(ADCSRA&0X10));
                a=ADCL;
                b=ADCH;
                ADCH=0x00;
                ADCL=0x00;
                ADCSRA&=0Xef;
               
                return b;
}
/*---------------------------------------------------------------------------

---------------------------------------------------------------------------*/
void getdata()
{
          AdValue=get_adc(1);
          FilterBuf[WARP(Dx)]=AdValue;
          AdValue=Filter(FilterBuf);
}
uchar Filter(uchar * value)
{
          uchar i;
          uint   tt=0;
          for(i=0;i<FILNUM;i++)
          {
                           tt +=value;
          }
          return tt/FILNUM;
}
#endif


#include<iom16v.h>
#include<macros.h>
#include"12864.h"
#include"INIT.h"
#include"ADC.h"
#define uint unsigned int
#define uchar unsigned char
int ads,m;
int kp=3;ki=0,kd=37;
int temp=0;

int pid(int input)
{
          //输入范围:
          //输出范围:
          static int n1,n2,n3,res;
          //int res;
          n1=input-159;
          //n1=n1*n1;
          res=22+kp*n1*n1/153+(n1-n2)*kd;
          n3=n2;
          n2=n1;
         
          return res;
}

void main(void)
{        
  ADC_init();
  IO_init();
  LCD_init();
  PORTB&=~0x01;
  PORTB|=0x02;
  Delay_ms(200);
  display_map(QQ);
  Delay_ms(20000);
  LCD_Clr_All();
  while(1)
  {
  getdata();
  //LCD_Num_Str_Disp(6,2,AdValue);
  //if(temp>0) LCD_Num_Str_Disp(6,1,temp);
  //else LCD_Num_Str_Disp(6,1,-temp);
  DDRD|=0X30;
        
        TCCR1A=0X63;
        TCCR1B=0X1B;
        /*if(AD[1]>140)
        {
                 m=AD[1]-140;
        }
        else
        {
                 m=0;
        }*/
        OCR1A=99;
        
        temp=pid(AdValue);
        if(temp>99)temp=99;
        if(temp<0)temp=0;
        
        OCR1B=temp;
        
        //QF;
  }
}








.
[img=0,1]file:///C:\Users\leixiaofeng\Documents\Tencent Files\971203419\Image\C2C\@P[KDGY{8[XV}]0GICLDBB3.jpg[/img][img=0,1]file:///C:\Users\leixiaofeng\Documents\Tencent Files\971203419\Image\C2C\@P[KDGY{8[XV}]0GICLDBB3.jpg[/img][img=0,1]file:///C:\Users\leixiaofeng\Documents\Tencent Files\971203419\Image\C2C\@P[KDGY{8[XV}]0GICLDBB3.jpg[/img]
(原文件名:psb.jpg)

.
(原文件名:psb (1).jpg)

.
(原文件名:psb (2).jpg)

.
(原文件名:psb (3).jpg)

.
(原文件名:psb (4).jpg)

感谢DO实验室的各位大哥们的帮助。
悬浮得不是很稳,还望坛里的大虾们批评指正。


最近在网上看到的一个外国的磁悬浮套件,模拟上拉的,特别惊奇他只用了几个原件
.
网上看到的外国的一个磁悬浮套件 (原文件名:Assembled Board.jpg)

.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入中科因仑

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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