标题: 我的磁悬浮相关资料,基于arduino单片机,有原理图和源程序 [打印本页]

作者: chris泉    时间: 2016-5-25 15:16
标题: 我的磁悬浮相关资料,基于arduino单片机,有原理图和源程序
附件里面有原理图和源程序,可以参考一下,我已经实现了。

磁悬浮PCB设计方案:
  电源模块:暂定5v24v组合
  电流驱动模块:贴片式L298P
                           
单片机选型:Atmega328p
运放:LM358
传感器:UGN3503
电源转换芯片:lm1117-5
线圈规格:800


原理图
Arduino code
  1. //PINs setting
  2. int adjust1Pin = A0;    //用来调节A的电位器
  3. int adjust2Pin = A1;    //用来调节B的电位器
  4. int read1Pin = A2;      //用来连接输入A传感器
  5. int read2Pin = A3;      //用来连接输入B传感器
  6. int i1Pin = 6;        //连接电机驱动板的I1接口
  7. int i2Pin = 7;        //连接电机驱动板的I2接口
  8. int i3Pin = 9;        //连接电机驱动板的I3接口
  9. int i4Pin = 8;        //连接电机驱动板的I4接口
  10. int power1Pin = 4;     //连接电机驱动板的EA接口
  11. int power2Pin = 3;     //连接电机驱动板的EB接口

  12. double setKp = 0.55;
  13. double setKi = 0.55;
  14. double setKd = 22;

  15. //PID structure
  16. typedef struct {
  17.   double target;
  18.   double aver;
  19.   double Kp;
  20.   double Kd;
  21.   int preError;
  22.   int power;
  23.   boolean flag;
  24.   double v;
  25. } PID;

  26. PID Pid1, Pid2;

  27. void setup()
  28. {
  29.   pinMode(i1Pin, OUTPUT);     //I1和I2都是数字信号
  30.   pinMode(i2Pin, OUTPUT);     //通过设置I1和I2来控制电流方向
  31.   pinMode(i3Pin, OUTPUT);     //I1和I2都是数字信号
  32.   pinMode(i4Pin, OUTPUT);     //通过设置I1和I2来控制电流方向
  33.   pinMode(power1Pin, OUTPUT);  //按占空比方式输出的模拟信号
  34.   pinMode(power2Pin, OUTPUT);  //按占空比方式输出的模拟信号

  35.   TCCR0B = 0x01;   // Timer 0: PWM 5 &  6 @ 16 kHz
  36.   TCCR1B = 0x01;   // Timer 1: PWM 9 & 10 @ 32 kHz
  37.   TCCR2B = 0x01;   // Timer 2: PWM 3 & 11 @ 32 kHz
  38.   Pid1.Kp = setKp;
  39.   Pid1.preError = 0;
  40.   Pid1.Kd = setKd1;
  41.   Pid1.power = 0;
  42.   Pid1.flag = true;
  43.   Pid1.target = 300;
  44.   Pid1.aver = 0;
  45.   Pid1.v = 0;
  46.   Pid2.Kp = setKp;
  47.   Pid2.preError = 0;
  48.   Pid2.Kd = setKd2;
  49.   Pid2.power = 0;
  50.   Pid2.flag = true;
  51.   Pid2.target = 300;
  52.   Pid2.aver = 0;
  53.   Pid2.v = 0;

  54. }

  55. void loop()
  56. {

  57.   //=======第一组电位器和传感器========
  58.   int readValue1 = 0;
  59.   for(int i = 0; i < 4; i++) readValue1 += analogRead(read1Pin);
  60.   readValue1 >>= 2;
  61.   //readValue1 += (Pid1.flag ? 1 : -1) * Pid1.power / 17;
  62.   int adjustValue1 = analogRead(adjust1Pin); //410 analogRead(adjust1Pin);
  63.   Pid1.aver = Pid1.aver * 0.9995 + readValue1 * 0.0005;
  64.   Pid1.target = Pid1.target + (Pid1.target - Pid1.aver) / 100.0;

  65.   //=======第二组电位器和传感器=======
  66.   int readValue2 = 0;
  67.   for(int i = 0; i < 4; i++) readValue2 += analogRead(read2Pin);
  68.   readValue2 >>= 2;
  69.   //readValue2 += (Pid2.flag ? 1 : -1) * Pid2.power / 6;
  70.   int adjustValue2 = analogRead(adjust2Pin); //240 analogRead(adjust2Pin);
  71.   Pid2.aver = Pid2.aver * 0.9995 + readValue2 * 0.0005;
  72.   Pid2.target = Pid2.target + (Pid2.target - Pid2.aver) / 1000.0;

  73.   //Calculate power values
  74.   double v, error;
  75.   error = readValue1 - Pid1.target;
  76.   v = error - Pid1.preError;
  77.   Pid1.v = (Pid1.v * 6 + v) / 7;
  78.   Pid1.power = (int)error * Pid1.Kd + Pid1.v * Pid1.Kp;
  79.   Pid1.flag = Pid1.power > 0;
  80.   Pid1.power = abs(Pid1.power);
  81.   if(Pid1.power>255) Pid1.power = 255;
  82.   Pid1.preError = error;

  83.   error = readValue2 - Pid2.target;
  84.   v = error - Pid2.preError;
  85.   Pid2.v = (Pid2.v * 6 + v) / 7;
  86.   Pid2.power = (int)error * Pid2.Kd + Pid2.v * Pid2.Kp;
  87.   Pid2.flag = Pid2.power < 0;
  88.   Pid2.power = abs(Pid2.power);
  89.   if(Pid2.power>255) Pid2.power = 255;
  90.   Pid2.preError = error;

  91.   //Write PMW to control the floa
  92.   digitalWrite(i1Pin, Pid1.flag);
  93.   digitalWrite(i2Pin, !Pid1.flag);
  94.   analogWrite(power1Pin, Pid1.power);

  95.   digitalWrite(i3Pin, Pid2.flag);
  96.   digitalWrite(i4Pin, !Pid2.flag);
  97.   analogWrite(power2Pin, Pid2.power);

  98. }

复制代码



所有资料下载:
磁悬浮.rar (244.88 KB, 下载次数: 260)


作者: 2100598336    时间: 2017-3-26 04:28
拿走了
作者: Hk9322    时间: 2017-4-14 14:19
太感謝了!!!!!!!!!!
作者: sdwjy1998    时间: 2017-12-2 15:20
正在学习中。感谢分享
作者: wylizheng    时间: 2018-2-14 08:23
新人报道。。。谢谢分享。。
作者: MagicCarlos    时间: 2018-4-25 22:11
感谢分享
作者: jeilly6100    时间: 2018-4-27 15:25
这个教程适合小白吗?网上老男孩的和各种各样的教程,不是因为时间过久东西缺失,就是东拼西凑的。。很无语。
作者: wmy19951029    时间: 2018-4-29 17:17
感谢楼主
作者: wuxishun    时间: 2018-5-10 00:00
学习中,还不会用
作者: 电子特工    时间: 2018-5-22 23:53
正想做一个
作者: zhkl99    时间: 2018-6-12 13:01
多谢,先看下
作者: wrlsohu    时间: 2018-6-27 09:33
程序编译不过,
作者: zhhufe    时间: 2018-7-5 16:16
学习学习     下载看看
作者: shadeb    时间: 2018-7-23 16:14
谢谢分享
作者: jidejide    时间: 2018-9-21 11:22
谢谢了
作者: zhanghoub    时间: 2019-1-27 10:47
可以改成51的就好了。

作者: 淘气的孝一    时间: 2019-1-27 19:37
好东西 可以没币··多回复吧!!!!
作者: 淘气的孝一    时间: 2019-1-31 11:12
好东西··存起来!
作者: sleepybug    时间: 2019-2-18 09:55
学过C语言是不是学这个会容易些?
作者: w6731040    时间: 2019-2-18 11:12

谢谢,学习了。
作者: kuraudo    时间: 2019-6-20 13:44
谢谢分享,主要来看看代码怎么写的
作者: AI.阳    时间: 2019-7-14 16:36
好东西好东西
作者: dj3365    时间: 2019-7-31 13:58
有教程吗,想学习一下
作者: jwjjwj123    时间: 2019-8-2 14:33
正在学习中。感谢分享
作者: dj3365191    时间: 2024-11-16 12:18
这个程序编译通不过,报错提示:
C:\Users\Administrator\AppData\Local\Temp\.arduinoIDE-unsaved20241016-34040-1i8gnm2.ep5hh\sketch_nov16a\sketch_nov16a.ino: In function 'void setup()':
C:\Users\Administrator\AppData\Local\Temp\.arduinoIDE-unsaved20241016-34040-1i8gnm2.ep5hh\sketch_nov16a\sketch_nov16a.ino:46:13: error: 'setKd1' was not declared in this scope
   Pid1.Kd = setKd1;
             ^~~~~~
C:\Users\Administrator\AppData\Local\Temp\.arduinoIDE-unsaved20241016-34040-1i8gnm2.ep5hh\sketch_nov16a\sketch_nov16a.ino:46:13: note: suggested alternative: 'setKd'
   Pid1.Kd = setKd1;
             ^~~~~~
             setKd
C:\Users\Administrator\AppData\Local\Temp\.arduinoIDE-unsaved20241016-34040-1i8gnm2.ep5hh\sketch_nov16a\sketch_nov16a.ino:54:13: error: 'setkd2' was not declared in this scope
   Pid2.Kd = setkd2;
             ^~~~~~
C:\Users\Administrator\AppData\Local\Temp\.arduinoIDE-unsaved20241016-34040-1i8gnm2.ep5hh\sketch_nov16a\sketch_nov16a.ino:54:13: note: suggested alternative: 'setKd'
   Pid2.Kd = setkd2;
             ^~~~~~
             setKd

exit status 1

Compilation error: 'setKd1' was not declared in this scope




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1