Code Mẫu, điều Khiển Motor Bằng PID - NgLeY
Có thể bạn quan tâm
Đến nội dung /* Controlling Motor using PID */ //Define the DEBUG functions to quickly enable debuging mode. #define DEBUG #ifdef DEBUG #define DEBUG_PRINT(x) Serial.println (x) #define PRINT(s,v) { Serial.print(F(s));Serial.print(":"); Serial.print(v);Serial.print("\t");} #define PRINTLN(s,v) { Serial.print(F(s));Serial.print(":"); Serial.println(v);} #else #define DEBUG_PRINT(x) #define PRINT(s,v) #define PRINTLN(s,v) #endif // Include libraries #include <MegunoLink.h> #include <CommandHandler.h> //for using command to control the Arduino #include <ArduinoTimer.h> //an easy way to implement timer #include <EEPROMStore.h> //to save the config, variable to EEPROMS, which will not be deteled when power off #include <Filter.h> #include <FastPID.h> #include <Encoder.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> //Define PIN #define encoderMotor1 3 // pin D3 #define encoderMotor2 2 // pin D2 #define IN1 6 #define IN2 5 //Define variables #define MAX_SPEED 255 //từ 0-255 #define MIN_SPEED 30 #define encoderPerRound 1300 bool output_signed = false, systemOn = false, TimerMode = false; int output_bits = 8, SetSpeed = 200, SetTime = 0, currentMotorSpeed, PIDOutput; long lastMotorPosition = 0, lastTimeCal = 0; float Kp = 0.1, Ki = 0.5, Kd = 0, Hz = 10; ArduinoTimer Timer1; //Timer for PID and Speed, increase or reduce this may cause error in speed calculation. ArduinoTimer Timer2; //Timer for user to set timer CommandHandler<> SerialCommandHandler; ExponentialFilter<long> SpeedFilter(10, 0); Encoder motorEncoder(encoderMotor1, encoderMotor2); FastPID myPID(Kp, Ki, Kd, Hz, output_bits, output_signed); void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(encoderMotor1, INPUT_PULLUP); pinMode(encoderMotor2, INPUT_PULLUP); SerialCommandHandler.AddCommand(F("speed"), Cmd_SetSpeed); SerialCommandHandler.AddCommand(F("run"), Cmd_OnOff); SerialCommandHandler.AddCommand(F("timeron"), Cmd_TimerStart); } void loop() { // put your main code here, to run repeatedly: if (systemOn) { if (Timer1.TimePassed_Milliseconds(50)) { currentMotorSpeed = MotorSpeedCalculate(); PIDOutput = myPID.step(SetSpeed, currentMotorSpeed); Motor(PIDOutput); PRINT("Speed", currentMotorSpeed); PRINTLN("PIDout", PIDOutput); SerialCommandHandler.Process(); } if ((Timer2.EllapsedSeconds() > SetTime) && (TimerMode)) { Timer2.Reset(); systemOn = false; TimerMode = false; } } else { SerialCommandHandler.Process(); currentMotorSpeed = MotorSpeedCalculate(); Motor(); //Motor stop } SerialCommandHandler.Process(); } /* Define CMD functions */ void Cmd_SetSpeed(CommandParameter &Parameters) { SetSpeed = constrain(Parameters.NextParameterAsInteger(), 0, 300); } void Cmd_SetTime(CommandParameter &Parameters) { SetTime = Parameters.NextParameterAsInteger(); } void Cmd_OnOff(CommandParameter &Parameters) { systemOn = !systemOn; } void Cmd_TimerStart(CommandParameter &Parameters) { Timer2.Reset(); SetTime = Parameters.NextParameterAsInteger(); systemOn = true; TimerMode = true; } /* Define Motor control code */ float MotorSpeedCalculate() { long currentMotorPosition = motorEncoder.read(); long currentTimeCal = millis(); int Speed = ((currentMotorPosition - lastMotorPosition) * 60000 / encoderPerRound ) / (currentTimeCal - lastTimeCal) ; SpeedFilter.Filter(Speed); lastMotorPosition = currentMotorPosition; lastTimeCal = currentTimeCal; return SpeedFilter.Current(); } void Motor() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); } void Motor(int speed) { // speed = constrain(speed, MIN_SPEED, MAX_SPEED);//đảm báo giá trị nằm trong một khoảng từ 0 - MAX_SPEED - http://arduino.vn/reference/constrain speed = MIN_SPEED + speed * (MAX_SPEED - MIN_SPEED) / 255; digitalWrite(IN1, LOW);// chân này không có PWM analogWrite(IN2, speed); }
Chia sẻ:
- Tweet
- In
Có liên quan
Đăng bởi ley995
A Vietnamese Biomedical Engineer - Like Green | Astronomy | Xem thêm bài viết
Điều hướng bài viết
Bài cũ hơn: Sử dụng thư viện Encoder để đọc dữ liệu encoder Bài tiếp theo: Hướng dẫn setup Cura Phiên bản >4 cho máy in Anet A6Bình luận về bài viết này Hủy trả lời
Trang web này sử dụng Akismet để lọc thư rác. Tìm hiểu cách xử lý bình luận của bạn.
Trang này sử dụng cookie. Tìm hiểu cách kiểm soát ở trong: Chính Sách Cookie- Bình luận
- Đăng lại
- Theo dõi Đã theo dõi
- NgLeY Theo dõi ngay
- Đã có tài khoản WordPress.com? Đăng nhập.
-
- NgLeY
- Tùy biến
- Theo dõi Đã theo dõi
- Đăng ký
- Đăng nhập
- URL rút gọn
- Báo cáo nội dung
- Xem toàn bộ bài viết
- Quản lý theo dõi
- Ẩn menu
Từ khóa » Thư Viện Pid Arduino
-
Arduino PID Library - Arduino Playground
-
PID_v2 - Arduino Reference
-
P.I.D - SPEED & POSITION CONTROL | Cộng đồng Arduino Việt Nam
-
Bộ điều Khiển PID - ứng Dụng Phần 2 - Xe Dò Line Dùng Thuật Toán PID
-
Thư Viện Arduino Tinh Chỉnh Tham Số PID - Arduino PID Autotune ...
-
PID - Arduino Library List
-
Arduino-PID-Library/PID_v1.h At Master - GitHub
-
Hướng Dẫn Thêm Mới Thư Viện Trong Arduino IDE (Cập Nhật 2022)
-
ARDUINO CHO NGƯỜI MỚI BẮT ĐẦU (Quyển Không Còn Là Căn Bản)
-
Tổng Hợp Tất Cả Thư Viện Arduino
-
Giải Thích đoạn Code điều Khiển động Cơ DC Sử Dụng PID Giúp Mình ...
-
Tổng Hợp Các Thư Viện Cho Arduino IDE - Điện Tử Việt