|
附件里面有原理圖和源程序,可以參考一下,我已經實現了。
磁懸浮PCB設計方案: 電源模塊:暫定5v加24v組合 電流驅動模塊:貼片式L298P
0.png (64.05 KB, 下載次數: 119)
下載附件
2016-6-3 15:24 上傳
單片機選型:Atmega328p 運放:LM358 傳感器:UGN3503 電源轉換芯片:lm1117-5 線圈規格:800匝
0.png (69.89 KB, 下載次數: 125)
下載附件
2016-6-3 15:24 上傳
原理圖
Arduino code - //PINs setting
- int adjust1Pin = A0; //用來調節A的電位器
- int adjust2Pin = A1; //用來調節B的電位器
- int read1Pin = A2; //用來連接輸入A傳感器
- int read2Pin = A3; //用來連接輸入B傳感器
- int i1Pin = 6; //連接電機驅動板的I1接口
- int i2Pin = 7; //連接電機驅動板的I2接口
- int i3Pin = 9; //連接電機驅動板的I3接口
- int i4Pin = 8; //連接電機驅動板的I4接口
- int power1Pin = 4; //連接電機驅動板的EA接口
- int power2Pin = 3; //連接電機驅動板的EB接口
- double setKp = 0.55;
- double setKi = 0.55;
- double setKd = 22;
- //PID structure
- typedef struct {
- double target;
- double aver;
- double Kp;
- double Kd;
- int preError;
- int power;
- boolean flag;
- double v;
- } PID;
- PID Pid1, Pid2;
- void setup()
- {
- pinMode(i1Pin, OUTPUT); //I1和I2都是數字信號
- pinMode(i2Pin, OUTPUT); //通過設置I1和I2來控制電流方向
- pinMode(i3Pin, OUTPUT); //I1和I2都是數字信號
- pinMode(i4Pin, OUTPUT); //通過設置I1和I2來控制電流方向
- pinMode(power1Pin, OUTPUT); //按占空比方式輸出的模擬信號
- pinMode(power2Pin, OUTPUT); //按占空比方式輸出的模擬信號
- TCCR0B = 0x01; // Timer 0: PWM 5 & 6 @ 16 kHz
- TCCR1B = 0x01; // Timer 1: PWM 9 & 10 @ 32 kHz
- TCCR2B = 0x01; // Timer 2: PWM 3 & 11 @ 32 kHz
- Pid1.Kp = setKp;
- Pid1.preError = 0;
- Pid1.Kd = setKd1;
- Pid1.power = 0;
- Pid1.flag = true;
- Pid1.target = 300;
- Pid1.aver = 0;
- Pid1.v = 0;
- Pid2.Kp = setKp;
- Pid2.preError = 0;
- Pid2.Kd = setKd2;
- Pid2.power = 0;
- Pid2.flag = true;
- Pid2.target = 300;
- Pid2.aver = 0;
- Pid2.v = 0;
- }
- void loop()
- {
- //=======第一組電位器和傳感器========
- int readValue1 = 0;
- for(int i = 0; i < 4; i++) readValue1 += analogRead(read1Pin);
- readValue1 >>= 2;
- //readValue1 += (Pid1.flag ? 1 : -1) * Pid1.power / 17;
- int adjustValue1 = analogRead(adjust1Pin); //410 analogRead(adjust1Pin);
- Pid1.aver = Pid1.aver * 0.9995 + readValue1 * 0.0005;
- Pid1.target = Pid1.target + (Pid1.target - Pid1.aver) / 100.0;
- //=======第二組電位器和傳感器=======
- int readValue2 = 0;
- for(int i = 0; i < 4; i++) readValue2 += analogRead(read2Pin);
- readValue2 >>= 2;
- //readValue2 += (Pid2.flag ? 1 : -1) * Pid2.power / 6;
- int adjustValue2 = analogRead(adjust2Pin); //240 analogRead(adjust2Pin);
- Pid2.aver = Pid2.aver * 0.9995 + readValue2 * 0.0005;
- Pid2.target = Pid2.target + (Pid2.target - Pid2.aver) / 1000.0;
- //Calculate power values
- double v, error;
- error = readValue1 - Pid1.target;
- v = error - Pid1.preError;
- Pid1.v = (Pid1.v * 6 + v) / 7;
- Pid1.power = (int)error * Pid1.Kd + Pid1.v * Pid1.Kp;
- Pid1.flag = Pid1.power > 0;
- Pid1.power = abs(Pid1.power);
- if(Pid1.power>255) Pid1.power = 255;
- Pid1.preError = error;
- error = readValue2 - Pid2.target;
- v = error - Pid2.preError;
- Pid2.v = (Pid2.v * 6 + v) / 7;
- Pid2.power = (int)error * Pid2.Kd + Pid2.v * Pid2.Kp;
- Pid2.flag = Pid2.power < 0;
- Pid2.power = abs(Pid2.power);
- if(Pid2.power>255) Pid2.power = 255;
- Pid2.preError = error;
- //Write PMW to control the floa
- digitalWrite(i1Pin, Pid1.flag);
- digitalWrite(i2Pin, !Pid1.flag);
- analogWrite(power1Pin, Pid1.power);
- digitalWrite(i3Pin, Pid2.flag);
- digitalWrite(i4Pin, !Pid2.flag);
- analogWrite(power2Pin, Pid2.power);
- }
復制代碼
0.png (69.16 KB, 下載次數: 144)
下載附件
2016-6-3 15:25 上傳
所有資料下載:
磁懸浮.rar
(244.88 KB, 下載次數: 260)
2016-5-25 15:15 上傳
點擊文件名下載附件
包括原理圖和程序 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|