| 
 | 
 
材料: 
霍尔传感器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)  
 
. 
 |   
 
 
 
 |