Điều khiển động cơ DC (DC motor) là một ứng dụng thuộc dạng cơ bản nhất của điều khiển tự động vì DC Motor là cơ cấu chấp hành (actuator) được dùng nhiều nhất trong các hệ thống tự động (ví dụ cánh tay robot, các robot). Bộ điều khiển dùng cho việc điều khiển động cơ là closed-loop, thông qua bài này ta có thể tổng hợp nhiều vấn đề về ứng dụng Arduino bao gồm nhận dữ liệu từ dùng, điều khiển motor, mạch công suất cho motor, đọc cảm biến encoder và đặc biệt là giải thuật điều khiển PID. Nói chung là thông qua bài này ta có thể hiểu rõ hơn về các vấn đề của giải thuật PID như việc sử dụng các phần P, phần D hay phần I tùy thuộc vào nhu cầu đáp ứng của từng người dùng về độ chính xác; hoặc về vấn đề chọn các hệ số kp, kd, ki làm sao cho vận tốc và vị trí của động cơ mà ta điều khiển phải dao động xung quanh vận tốc và vị trí đã xét với error nhỏ
TỔNG QUAN
Điều khiển động cơ DC là một ứng dụng cơ bản trong điều khiển tự động, với DC Motor là cơ cấu chấp hành phổ biến trong các hệ thống tự động như robot Bộ điều khiển cho động cơ thường sử dụng closed-loop, cho phép tổng hợp nhiều vấn đề liên quan đến ứng dụng Arduino, bao gồm nhận dữ liệu, điều khiển motor, mạch công suất, đọc cảm biến encoder, và đặc biệt là giải thuật điều khiển PID Bài viết này giúp người đọc hiểu rõ hơn về các yếu tố của giải thuật PID, như việc điều chỉnh các phần P, I, D tùy theo nhu cầu về độ chính xác, cũng như cách chọn các hệ số kp, kd, ki để đảm bảo vận tốc và vị trí của động cơ dao động xung quanh giá trị mong muốn với sai số nhỏ.
GIẢI THUẬT ĐIỀU KHIỂN PID
Giới thiệu chung về PID
PID là một hệ thống điều khiển bao gồm ba thành phần chính: điều khiển tỉ lệ, điều khiển tích phân và điều khiển vi phân Hệ thống này có khả năng điều chỉnh sai số một cách tối ưu, giúp tăng tốc độ phản hồi, giảm thiểu độ vọt lố và hạn chế dao động trong quá trình điều khiển.
Bộ điều khiển PID, viết tắt của "tỉ lệ, tích phân và vi phân", là một kỹ thuật điều khiển quá trình hiệu quả, giúp giảm thiểu tín hiệu sai số thông qua các tác động tỉ lệ, tích phân và vi phân Kỹ thuật này hoạt động theo cơ chế hồi tiếp vòng kín và được ứng dụng rộng rãi trong các hệ thống điện, tự động hóa và điện tử, mang lại hiệu suất cao trong việc điều chỉnh và kiểm soát quá trình.
Thuật toán PID
Phần này chỉ mô tả dạng song song hoặc không tương tác của bộ điều khiển PID
Sơ đồ điều khiển PID được xác định bởi ba thành phần chính, bao gồm: tỷ lệ, tích phân và vi phân Tổng hợp của ba thành phần này tạo thành biến điều khiển (MV), giúp điều chỉnh hiệu quả các quá trình trong hệ thống.
Pout ;Iout ; Dout là các thành phần đầu ra từ ba khâu của bộ điều khiển PID, được xác định như dưới đây
Khâu tỉ lệ, hay còn gọi là độ lợi, ảnh hưởng đến giá trị đầu ra theo tỷ lệ với giá trị sai số hiện tại Để điều chỉnh đáp ứng tỉ lệ, sai số này được nhân với một hằng số Kp, được biết đến như độ lợi tỉ lệ.
Khâu tỉ lệ được cho bởi:
Độ lợi của khâu tỉ lệ lớn giúp tăng cường phản ứng đầu ra với sai số đầu vào nhỏ, nhưng nếu quá cao sẽ dẫn đến sự không ổn định của hệ thống Ngược lại, độ lợi nhỏ khiến bộ điều khiển kém nhạy và phản ứng chậm, trong khi độ lợi quá thấp có thể làm giảm hiệu quả điều khiển trước các nhiễu trong hệ thống.
Phân phối của khâu tích phân, hay còn gọi là reset, tỷ lệ thuận với biên độ sai số và khoảng thời gian xảy ra sai số Tổng sai số tức thời theo thời gian (tích phân sai số) cung cấp tích lũy bù đã được hiệu chỉnh trước đó Sai số tích lũy sau đó được nhân với độ lợi tích phân và cộng với tín hiệu đầu ra của bộ điều khiển, xác định biên độ phân phối của khâu tích phân trên tất cả tác động điều chỉnh.
Thừa số tích phân được cho bởi:
Khâu tích phân, khi kết hợp với khâu tỉ lệ, có khả năng tăng tốc độ chuyển động của quá trình đến điểm đặt và loại bỏ sai số ổn định với tỷ lệ phụ thuộc vào bộ điều khiển Tuy nhiên, do khâu tích phân phản ánh sai số tích lũy trong quá khứ, nó có thể dẫn đến hiện tượng giá trị hiện tại vượt quá giá trị đặt, gây ra độ lệch Việc điều chỉnh độ lợi tích phân và độ ổn định của bộ điều khiển cần được nghiên cứu kỹ lưỡng để đảm bảo hiệu quả hoạt động.
Tốc độ thay đổi của sai số trong quá trình được tính toán bằng cách xác định độ dốc của sai số theo thời gian, tức là đạo hàm bậc một theo thời gian Sau đó, tốc độ này được nhân với độ lợi tỉ lệ Biên độ của phân phối khâu vi phân, thường được gọi là tốc độ, trên tất cả các hành vi điều khiển bị giới hạn bởi độ lợi vi phân.
Thừa số vi phân được cho bởi:
Khâu vi phân trong bộ điều khiển giúp làm chậm tốc độ thay đổi của đầu ra, từ đó hỗ trợ đạt điểm đặt của bộ điều khiển Nó được sử dụng để giảm biên độ vọt lố do thành phần tích phân gây ra và tăng cường độ ổn định cho bộ điều khiển hỗn hợp Tuy nhiên, việc vi phân tín hiệu có thể khuếch đại nhiễu, làm cho khâu này trở nên nhạy cảm với nhiễu trong sai số, dẫn đến khả năng không ổn định nếu nhiễu và độ lợi vi phân quá lớn Do đó, thường sử dụng một xấp xỉ của bộ vi sai với băng thông giới hạn để cải thiện hiệu suất.
Giải thuật điều khiển PID
Để hiểu bản chất của thuật toán PID, chúng ta sẽ xem xét ví dụ điều khiển vị trí của một chiếc xe di chuyển trên đường thẳng Giả sử chiếc xe được trang bị một động cơ DC, động cơ này tạo ra lực F để đẩy xe tiến hoặc lùi trên đoạn đường thẳng.
Hình 2 4 Ví dụ điều khiển xe trên đường thẳng
Lực F do động cơ tạo ra được sử dụng để điều khiển xe từ vị trí A đến vị trí O Mục tiêu là điều chỉnh lực F một cách tự động để đảm bảo xe di chuyển chính xác, phản hồi nhanh và ổn định với độ vọt nhỏ.
Khi xe đang ở vị trí xa so với điểm mong muốn (điểm O), tức là sai số lớn, cần áp dụng lực F mạnh để nhanh chóng đưa xe đến vị trí O Ý tưởng này có thể được diễn đạt qua mối quan hệ tuyến tính.
Hệ số P (Kp) là một hằng số dương dùng để điều khiển sai số e, đại diện cho khoảng cách từ điểm O đến vị trí hiện tại của xe Mục tiêu điều khiển là giảm sai số e về 0 nhanh nhất có thể Khi Kp lớn, lực F cũng sẽ lớn, giúp xe nhanh chóng tiến về điểm O Tuy nhiên, nếu F quá lớn, gia tốc của xe sẽ tăng lên, có thể gây ra vấn đề khi đưa xe đến vị trí mong muốn.
Khi e = 0, lực quán tính của xe sẽ đẩy xe vượt qua điểm O (e ≠ 0), dẫn đến sai số gọi là overshot Lúc này, sai số e trở thành số âm, và lực F xuất hiện với chiều ngược lại để kéo xe về điểm O Tuy nhiên, do hệ số Kp lớn, lực F đủ mạnh để kéo xe vượt qua điểm O Quá trình này lặp đi lặp lại, khiến xe dao động quanh điểm O Trong một số trường hợp, xe có thể dao động ngày càng xa điểm O, và bộ điều khiển được coi là không ổn định.
Để giảm thiểu hiện tượng overshoot của xe, một giải pháp hiệu quả là sử dụng thành phần "thắng" trong bộ điều khiển Khi xe ở xa điểm O, bộ điều khiển sẽ tạo ra lực F lớn, nhưng khi gần đến điểm O, thành phần "thắng" giúp giảm tốc độ xe Tốc độ thay đổi của sai số e có thể được tính bằng đạo hàm theo thời gian, cho thấy rằng khi xe di chuyển từ điểm A về O, đạo hàm của sai số e tăng nhưng ngược chiều với lực F Việc áp dụng đạo hàm như một thành phần "thắng" có thể giảm overshoot, và thành phần này chính là D (Derivative) trong bộ điều khiển PID Khi kết hợp thành phần D vào bộ điều khiển P hiện tại, chúng ta sẽ có bộ điều khiển PD.
Trong hệ thống điều khiển, (de/dt) biểu thị vận tốc thay đổi của sai số e, trong khi Kd là hằng số không âm, được gọi là hệ số D (Derivative gain) Khi thành phần D có giá trị lớn hơn thành phần P và lực F thay đổi chiều, xe có thể giảm tốc mạnh ở điểm O Nếu thành phần D quá lớn so với P hoặc P nhỏ, xe có thể dừng lại trước khi đạt điểm O do thành phần D trở về 0, khiến lực F = Kp*e cũng trở nên nhỏ, không đủ để vượt qua lực ma sát tĩnh Tình huống này dẫn đến steady state error (sai số trạng thái tĩnh), khi sai số e vẫn chưa bằng 0 Để khắc phục steady state error, người ta thường thêm vào bộ điều khiển một thành phần có chức năng “cộng dồn” sai số.
Khi thành phần D không còn tác dụng, thành phần điều khiển mới sẽ "công dồn" sai số theo thời gian, dẫn đến việc lực F tăng dần Đến một thời điểm nhất định, lực F sẽ đủ lớn để vượt qua ma sát tĩnh và đẩy xe tiến về điểm O Thành phần "cộng dồn" này chính là thành phần I (Integral – tích phân) trong bộ điều khiển PID Tích phân một đại lượng theo thời gian chính là tổng của đại lượng đó, và đến lúc này, bộ điều khiển đã hoàn chỉnh với đầy đủ ba thành phần PID.
F = Kp*e + Kd*(de/dt) + Ki*∫edt
Chức năng của từng phần trong bộ điều khiển PID đã được làm rõ, cho phép tùy chỉnh thành bộ điều khiển P, PI hoặc PD tùy theo mục đích và đối tượng điều khiển Người thiết kế bộ điều khiển PID cần chọn hệ số Kp, Kd và Ki để đảm bảo hoạt động hiệu quả và ổn định, quá trình này được gọi là PID gain tuning Việc lựa chọn này không hề đơn giản vì phụ thuộc vào nhiều yếu tố khác nhau Các bước cơ bản để chọn các hệ số PID bao gồm việc phân tích và điều chỉnh các tham số để đạt được hiệu suất tối ưu.
Chọn Kp trước: thử bộ điều khiển P với đối tượng thật (hoặc mô phỏng), điều chỉnh Kp sao cho thời gian đáp ứng đủ nhanh, chấp nhận overshot nhỏ
Thêm thành phần D để loại overshot, tăng Kd từ từ, thử nghiệm và chọn giá trị thích hợp Steady state error có thể sẽ xuất hiện
Để giảm lỗi trạng thái ổn định (steady state error), cần thêm thành phần I vào hệ thống Việc tăng giá trị Ki từ nhỏ đến lớn sẽ giúp giảm steady state error mà không làm xuất hiện lại hiện tượng overshoot.
THỰC HÀNH ĐIỀU KHIỂN TỐC ĐỘ VÀ VỊ TRÍ ĐÔNG CƠ DC
Các linh kiện trên mô hình
3.1.1 Encoder Để điều khiển số vòng quay hay vận tốc động cơ thì chúng ta nhất thiết phải đọc được góc quay của motor Một số phương pháp có thể được dùng để xác định góc quay của motor bao gồm tachometer (bộ điều khiển tốc độ quay), dùng biến trở xoay hoặc dùng encoder Trong đó 2 phương pháp đầu tiên là phương pháp analog và dùng optiacal encoder (encoder quang) thuộc nhóm digital Hệ thống optical encoder bao gồm một nguồn phát quang (thường là hồng ngoại), một cảm biến quang, một đĩa có chia rãnh Optical encoder lại được chia thành 2 loại: encoder tuyệt đối (absolute optical encoder) và encoder tương đối (incremental optical encoder) Trong đa số các motor DC, loại encoder tương đối được sử dụng nhiều hơn
Encoder thường có ba kênh: kênh A, kênh B và kênh I (Index) Kênh I tạo ra một "xung" mỗi vòng quay của motor thông qua một lỗ nhỏ trên đĩa quay, nơi hồng ngoại từ nguồn phát xuyên qua lỗ và kích hoạt cảm biến quang Kênh A hoạt động tương tự nhưng tạo ra N "xung" mỗi vòng, với N là số rãnh trên đĩa, được gọi là độ phân giải (resolution) của encoder Độ phân giải của encoder ảnh hưởng đến độ chính xác trong việc điều khiển tốc độ động cơ Kênh B nằm trên cùng đường tròn với kênh A nhưng lệch một chút, giúp cung cấp thêm thông tin cho quá trình điều khiển.
B cùng tần số với kênh A nhưng bị lệch pha 90⁰ Bằng cách phối hợp kênh A và B, ta sẽ biết được chiều quay của động cơ
Hình 3 2 Xung của kênh A và kênh B
Hình 2.2 mô tả sự bố trí của hai cảm biến kênh A và B lệch pha Khi motor quay theo chiều kim đồng hồ, tín hiệu kênh A chuyển từ mức cao sang thấp trong khi kênh B ở mức thấp Ngược lại, khi motor quay ngược chiều kim đồng hồ, kênh A sẽ ở mức thấp trong khi kênh B ở mức cao Nhờ vào sự phối hợp giữa hai kênh A và B, chúng ta có thể xác định được cả góc quay lẫn chiều quay của động cơ Trong dự án này, chúng tôi sử dụng ngắt ngoài để đọc encoder, kết nối kênh A với một ngắt ngoài (INT0 hoặc INT1 trên Arduino) và kênh B với chân bất kỳ Mỗi khi ngắt ngoài xảy ra, trình phục vụ ngắt sẽ kiểm tra mức của kênh B để điều chỉnh biến đếm xung Việc tính toán cẩn thận là cần thiết, đặc biệt khi encoder có độ phân giải 2000 xung/vòng và motor hoạt động với tốc độ nhất định.
Tần số của kênh A đạt 200KHz khi thực hiện 100 vòng/s, tương đương với việc ngắt ngoài xảy ra mỗi 5 micro giây Tần số ngắt này quá cao cho vi điều khiển AVR, khiến nó chỉ có khả năng tập trung vào việc đếm xung mà không đủ thời gian để thực hiện các tác vụ khác.
Driver L298N là thiết bị tích hợp sẵn các mạch kích, mạch cầu H bao gồm IC L298
2 mạch cầu H trong gói 15 chân (Multiwatt 15), IC ổn áp 5V 78M05 và một số thiết bị
Điện áp đầu vào cho motor dao động từ 6-35V, với 12V cần tháo jumper nếu sử dụng nguồn cao hơn, vì jumper cung cấp nguồn cho IC ổn áp tạo ra 5V; nếu sử dụng nguồn 12V, IC có thể bị cháy Mỗi cầu H có thể cung cấp dòng tối đa lên đến 2A cho mỗi motor, rất phù hợp cho các ứng dụng động cơ DC và loa nhỏ, vừa Điện áp tín hiệu điều khiển nằm trong khoảng 5-7V và dòng điều khiển từ 0-36mA, cho phép sử dụng Arduino để điều khiển một cách dễ dàng, vì dòng của Arduino có thể đạt tới 40mA.
Mô hình thật và cấu trúc bên trong chip L298
Hình 3 5 Mạch bên trong của chip L298
Với hai mạch cầu H, chúng ta có khả năng điều khiển hai đối tượng khác nhau Chân VS cung cấp nguồn cho cả hai mạch, trong khi hai đường current sensing A và B được nối sẵn với GND trong chip Động cơ được kết nối với các chân OUT1, OUT2 (hoặc OUT3, OUT4 cho mạch cầu bên phải) Chân En (EnA và EnB) cho phép mạch cầu hoạt động; khi chân En được kéo lên mức cao, mạch cầu sẽ sẵn sàng hoạt động Các đường kích của mỗi mạch cầu kết hợp với nhau nhưng có mức điện áp ngược nhau nhờ cổng Logic NOT, giúp tránh hiện tượng trùng dẫn giữa hai transistor.
Mỗi cầu H có hai đường kích, gọi là In1 và In2 (hoặc In3, In4), để điều khiển động cơ, cần kéo một trong hai đường kích lên cao, ví dụ In1=1, In2=0 Khi đảo mức kích của hai đường In, động cơ sẽ đảo chiều quay Chip không chỉ điều khiển chiều quay mà còn điều chỉnh tốc độ động cơ thông qua xung PWM, các đường In được kết nối với các cổng Logic tích hợp sẵn trong driver Thông thường, để điều khiển vận tốc và chiều quay, sẽ có ba chân điều khiển: PWM cho tốc độ, DIR cho chiều quay và En để cho phép mạch hoạt động Điện áp cho phần logic (5V) được cấp từ đường Vss và GND chung cho cả logic và động cơ Để điều khiển tốc độ trên driver L298N, cần tháo hai jumper Enable A, B ra, vì khi nối lại hai chân này với 5V, động cơ sẽ hoạt động ở mức tối đa.
3.1.3 Động cơ DC Động cơ DC Servo giảm tốc GA25 thường được sử dụng trong các ứng dụng cần xác định tốc độ, vị trí, chiều quay của động cơ DC: Robot mê cung, robot xe hai bánh tự cân bằng, Động cơ DC Servo thực tế là động cơ DC thường có gắn thêm phần Encoder để có thể trả xung về vi điều khiển giúp xác định vị trí, vận tốc, Về cách điều khiển thì động cơ DC Servo sử dụng Driver như động cơ DC thường để điều khiển công suất động cơ, tốc độ và đảo chiều: L298, L293, , chỉ có điểm khác biệt là có thêm phần encoder để có thể hồi tiếp (feedback) xung về Vi điều khiển, từ đó vi điều khiển tác động lại động cơ qua mạch công suất sử dụng các thuật toán điều khiển như PID, để điều khiển tốc độ, vị trí,
Hình 3 6 Động Cơ Giảm Tốc Có Encoder GA25-370 12V 130rpm
Tốc độ sau hộp giảm tốc: 130rpm
Dòng điện không tải : 50mA
Đường kính động cơ: 24.4mm
Chiều dài động cơ (không tính trục và hộp số): 30.8mm
Trục ra là loại trục vát
Sơ đồ lắp mạch
Hình 3 7 Sơ đồ lắp mạch
Điều khiển tốc độ động cơ
Hình 3 8 Mô hình điều khiển
Input : số xung trong 1 khoảng thời gian
Output : Tốc độ trục ĐC
Hình 3 9 Lưu đồ giải thuật
Khi động cơ hoạt động, encoder cung cấp 2 xung vuông lệch pha, cho phép Arduino tính toán số xung trong một khoảng thời gian nhất định, từ đó xác định tốc độ động cơ Arduino sử dụng thuật toán PID để điều chỉnh số xung cần đếm dựa trên giá trị biến trở nhận được Điều khiển độ rộng xung xuất ra từ Arduino tác động vào L298N để điều khiển động cơ Cần lưu ý rằng theo tài liệu của L298N, có độ trễ tại các cạnh xung điều khiển, vì vậy cần cân nhắc tần số PWM của Arduino và tần số hoạt động ổn định của động cơ để đảm bảo hiệu suất tối ưu.
Khoảng thời gian đếm xung phụ thuộc vào dải tốc độ hoạt động ổn định của động cơ và độ mịn của tín hiệu encoder, tức số xung trên một vòng quay Khi sử dụng nguồn pin cho hệ thống, cần lưu ý rằng theo thời gian, pin sẽ giảm dần, dẫn đến sự thay đổi điện áp điều khiển động cơ, ảnh hưởng đến việc lựa chọn các hệ số Kp, Kd, Ki trong thuật toán PID.
Dựa trên các thông số như điện trở cảm ứng Ra, độ từ cảm La, mô men quán tính Jm, hệ số ma sát trượt Dm, hệ số mô men Kt và hệ số điện áp cảm ứng Kb, ta có thể xây dựng hàm truyền cho bộ điều khiển động cơ.
Mô phỏng điều khiển tốc độ của motor bằng Simulink với các khối constant, PID controller, Transfer function, scope, Add, Integrator và ta nối các khối như hình 3.10
Hình 3 11: Mô phỏng điều khiển tốc độ bằng Simulink 3.2.3 Code điều khiển tốc độ động cơ DC có giảm tốc GA25-370
#include uint32_t demXung,lastDemXung; int32_t P,I,D,Err,lastErr; uint8_t soXung,soXungMM,output; float kp,kd,ki; void setup() {
TIMSK1=1; sei(); attachInterrupt(0,readEncoder,RISING);
20 void loop() { if(PIND&0b10000000){ kp=0.5775,kd=0.077,ki=1.9; // Ku=1.75,Tu=0.4s
}else{ kp=0,kd=0,ki=0;I=0;output=0;
} soXungMM = map(analogRead(A0),0,1023,5,42); float rpm = soXung/0.05/495; float rpmMM = soXungMM/0.05/495;
} void readEncoder(){ if(PIND&0b01000000)demXung++;
TCNT1 = 53036; soXung = demXung-lastDemXung; //5 >42 lastDemXung = demXung;
I += ki*Err*0.05; output += P+D+I; output = constrain(output,0,255); analogWrite(3,output); lastErr = Err;
3.2.4 Code điều khiển tốc độ động cơ DC không giảm tốc (1 vòng 334 xung)
#include uint32_t demXung,lastDemXung; int32_t P,I,D,Err,lastErr; uint16_t soXung,soXungMM,output; float kp,kd,ki; void setup() {
TIMSK1=1; sei(); attachInterrupt(0,readEncoder,RISING);
22 kp=0.15,kd=0.0025,ki=0.05; // Ku=0.59,Tu=0.1111 kp=0.2,kd=0.0025,ki=0.05
}else{ kp=0,kd=0,ki=0;I=0;output=0;
} soXungMM = map(analogRead(A0),0,1023,150,300); uint16_t rpm= soXung/0.01/334; uint16_t rpmMM =soXungMM/0.01/334;
} void readEncoder(){ if(PIND&0b01000000)demXung++;
TCNT1 = 45536; soXung = demXung - lastDemXung; lastDemXung = demXung;
I += ki*0.01*Err; output += P+D+I; output = constrain(output,0,255); analogWrite(3,output); lastErr = Err;
3.2.5 Kết quả của điều khiển động cơ DC
Động cơ giảm tốc GA25-370 130rpm được điều khiển tốc độ trong dải thấp, như thể hiện trong Hình 3.9 Trục tung biểu thị vận tốc (vòng/s) do tín hiệu từ encoder gửi về dưới dạng xung, trong khi trục hoành là thời gian Đường màu xanh đại diện cho tốc độ điều chỉnh qua biên trở, và đường màu đỏ là tốc độ động cơ phản hồi nhờ thuật toán điều khiển PID Các hệ số kp, kd, ki được chọn để tối ưu hóa thời gian đáp ứng và giảm thiểu sai số Dạng xung của đường màu đỏ phụ thuộc vào thời gian mẫu 50ms, đảm bảo rằng nếu thời gian mẫu quá nhỏ sẽ dẫn đến ít xung và khó điều khiển, trong khi nếu quá lớn sẽ làm chậm phản hồi.
Hình 3.13 minh họa việc điều khiển tốc độ của động cơ không giảm tốc với độ phân giải cao Động cơ hoạt động ổn định hơn khi được điều khiển ở dải tốc độ cao Đồ thị thể hiện tốc độ (vòng/s) trên trục tung và thời gian (s) trên trục hoành, với đường màu đỏ biểu thị tốc độ được đặt qua biến trở, trong khi đường màu xanh là tốc độ đáp ứng của động cơ Sử dụng thuật toán PID với các hệ số kp, kd, ki đã chọn, ta nhận thấy đáp ứng của động cơ khá ổn định Tuy nhiên, khi thay đổi tốc độ liên tục, sai số error sẽ gia tăng, làm giảm hiệu quả điều khiển Do đó, khi giữ tốc độ động cơ không đổi, động cơ sẽ tăng tốc để đạt được mức tốc độ đã thiết lập trước đó.
Điều khiển vị trí động cơ DC
Hình 3.14 Mô hình điều khiển
Input : Số lượng xung cần đặt
Output : Vị trí trục ĐC
Khi động cơ hoạt động, encoder cung cấp hai xung vuông lệch pha, cho phép Arduino xác định vị trí trục động cơ so với mốc ban đầu thông qua việc đếm số xung Quá trình này sử dụng thuật toán PID để điều chỉnh số xung đếm, giúp động cơ quay theo chiều mong muốn Arduino điều khiển độ rộng xung xuất ra cho L298N và tín hiệu digital để điều chỉnh chiều quay của động cơ Cần lưu ý rằng L298N có độ trễ ở các cạnh xung điều khiển, do đó, tần số PWM của Arduino cần phải tương thích với tần số hoạt động ổn định của động cơ.
Số lượng xung và sai số điều khiển phụ thuộc vào độ phân giải của tín hiệu encoder, tức là số xung trên mỗi vòng quay Khi sử dụng nguồn pin cho hệ thống, cần lưu ý rằng theo thời gian, pin sẽ giảm điện áp, điều này có thể ảnh hưởng đến việc lựa chọn các hệ số Kp, Kd, Ki trong thuật toán PID.
Dựa vào các thông số điện trở cảm ứng Ra, độ từ cảm La, mô men quán tính của motor Jm, hệ số ma sát trượt Dm, hệ số mô men Kt và hệ số điện áp cảm ứng Kb, ta có thể xây dựng hàm truyền cho bộ điều khiển động cơ.
Mô phỏng điều khiển tốc độ của motor bằng Simulink với các khối constant, PID controller, Transfer function, scope, Add, và ta nối các khối như hình 3.12
Hình 3 16: Mô hình mô phỏng vị trí động cơ DC
Sau chọn các hệ số Kp, Kd, Ki bằng PID turner thì ta ra được đồ thị như hình 3.15
Hình 3 17: Đồ thị điều khiển vị trí trên mô phỏng
3.3.3 Code điều khiển vị trí động cơ
#include int16_t demXung,xungMM,Err,lastErr,output; int32_t P,I,D; float kp,kd,ki; void setup() {
TIMSK1=1; sei(); attachInterrupt(0,readEncoder,RISING);
} void loop() { if(digitalRead(7)){ kp=2;ki=0.7;kd=0.0855;//Ku; Tu=0.1282 ki=1.5;kd=0.063
} xungMM = map(analogRead(A0),0,1020,0,300); float goc = (float)demXung*360/495; float gocMM = (float)xungMM*360/495;
PORTD=(output>0)?0b10010000:0b10100000; analogWrite(3,abs(output)); lastErr = Err;
3.3.4 Kết quả của việc điều khiển vị trí động cơ DC
Hình 3 18 Đồ thị biểu diễn điều khiển vị trí động cơ DC
Đồ thị mô tả vị trí cưa động cơ với trục đứng thể hiện vị trí (đơn vị: độ) và trục ngang thể hiện thời gian (đơn vị: 10ms) Đường màu đỏ biểu thị vị trí đã được thiết lập, trong khi đường màu xanh thể hiện phản ứng của động cơ Khi thay đổi vị trí, đường phản ứng có xu hướng vọt lên một chút trước khi trở lại gần đường đã thiết lập, với sai số chấp nhận được là ± 1.45 độ Mặc dù sai số này nằm trong ngưỡng chấp nhận, thời gian phản ứng của hệ thống vẫn còn khá chậm.