Mô hình thử nghiệm Arduino DC motor PID position controller
Cảm ơn quà tặng của bác Gamo, phục vụ tinh thần ngâm rồi cứu.. í lộn nghiên cứu.
Em sẽ cố.. để nó không phải cứu bác ạ.
Đính kèm 5401
Printable View
Mô hình thử nghiệm Arduino DC motor PID position controller
Cảm ơn quà tặng của bác Gamo, phục vụ tinh thần ngâm rồi cứu.. í lộn nghiên cứu.
Em sẽ cố.. để nó không phải cứu bác ạ.
Đính kèm 5401
Hôm nay test test thì thấy cái encoder nó không chuẩn lắm.. tháo ra thì thấy hơi bẩn. Lôi dụng cụ ra vệ sinh cái đĩa rồi chộp lại, quên mất là phải làm thêm 1 cái ảnh lúc chưa vệ sinh để so sánh :o
Đính kèm 5402
Vệ sinh bằng bộ dụng cụ này.
Đính kèm 5403
Xong vẫn chưa có time test lại xem thế nào.. vì bận lo spam diễn đàn :D
Sau gần 4h hì hục đọc & code liên tục thì nhìn lại thấy sáng rồi (3h sáng), chốt lại thì motor đã quay. Rị mọ thử turnning hoài mà không mấy khã quan. Chán đi ngủ, sáng ra gần 9h thì ku em alo đánh thức, xong đi mãi tới chiều. Có sự động viên và thúc giục của bác Gamo cố quay cái clip, tới lui một hồi, cuối cùng nó cũng chiệu chạy thế này.
Còn tồn động mấy vấn đề..
- Xử lý chậm, nên chạy nhanh là out.
- Dùng 12V để điều khiển motor áp danh định bao nhiêu V không biết (của bác Gamo tặng) nên điều khiển PWM nó không chạy như ý.
- PID thì tạm tạm, xử lý như ý. Nhưng kết quả tệ vì phần công suất đánh giá không phù hợp, nên turning chạy lúc vầy lúc khác.
Kết luận: phần nào hiểu được PID mà vài thứ linh tinh khác :o, nên có thể tạm gọi là nghiên cứu chứ không phải ngâm cứu :D.
https://www.youtube.com/watch?v=zbClaIXyo_8
Có thời gian sẽ tiếp tục cải tiến & test tiếp.
Hoho, 8 bit mà bác làm PID được thì quá dữ :D
Nhìn tay bác mà muốn cười, sờ cái motor mà cứ như sờ con gái, sợ bị ăn đòn hay sao mà cứ lưỡng lự thế.
Em cũng thấy là hình như bác ấy quen tay, vân vân vê vê
CKD - Arduino DC PID position controller
- Arduino UNO (atmega328 - 16mHz).
- L298 H bridge (2A, 36V).
- encoder buffer 74HC14 (schmitt trigger inverter).
- encoder 1000p/r
- DC motor
https://www.youtube.com/watch?v=vkivs0KgXzg
Dự là tìm thêm con DC điện áp thấp với cái encoder 200-500 p/r thôi :D
Thấy bác CKD hứng thú, và chịu khó update kiến thức quá . Mình tặng bác 1 em DC Servo . encoder 500 xung , điện áp 24 hoặc 36 tùy ý bác .
Mới phát hiện ra ở VN có thể mua được con LM629...:confused:
Features
- 32-bit position, velocity, and acceleration registers
- Programmable digital PID filter with 16-bit coefficients
- Programmable derivative sampling interval
- 8- or 12-bit DAC output data (LM628)
- 8-bit sign-magnitude PWM output data (LM629)
- Internal trapezoidal velocity profile generator
- Velocity, target position, and filter parameters may be changed during motion
- Position and velocity modes of operation
- Real-time programmable host interrupts
- 8-bit parallel asynchronous host interface
- Quadrature incremental encoder interface with index pulse input
- Available in a 28-pin dual in-line package or a 24-pin surface mount package (LM629 only)
Giá tại TME cũng không chát lắm 95K/pcs
Hix... bác mà phát hiện sớm hơn thì đỡ ghia :))
Em góp tí cho xôm tụ, vụ vân vân vê vê :x :x, DC servo 24v chạy 9v mà cũng "cứng" phết
http://youtu.be/ayLmRdWEXIk
Cái mô hình hôm rồi em nóng vội. Chỉ quăng cái PID vào điều khiển position luôn nên nó có nhiều cái kém và khó kiểm soát :).
Có time em sẽ làm lại step by step xem có cải thiện được ko. Nếu không thì chắc em chán.. mà em chán thì em cho nó ngâm luôn quá :o.
- PWM control (chỉnh lại tần số cho nó phù hợp với motor). Có thể phát triển thành analog control.
- Torque control (hay nói cách khác là điều khiển dòng -> constant current - ổn dòng).
- Speed hay velocity control (điều khiển tốc độ).
Sau đó mới ghép lại thành chuổi thế này - position -> speed -> torque -> PWM không biết có đúng chưa nhỉ.
Mà nếu ở khâu Torque và Speed đều có P, hoặc PI, hoặc PID thì khi lồng ghép lại thành chuổi thì có phải chỉnh P/I/D cho các khâu này không nhỉ?. Nó sẽ ảnh hưởng cả hệ thống như thế nào?. Bác Gamo có bí mật nào không, bật mí cho em với
Hoho, mô hình của bác hôm trước có bị gì hả? Hình như bác chưa tune nó nên hội tụ lâu thôi hoặc do con Arduino của bác quá rùa :)). Cũng có thể là do chú L298 phản ứng chậm nữa.
Em cũng tính chơi analog control, trùm Nhật Sơn nhảy vào can => giờ quay lại PWM.
Theo tai lieu em doc thi moi inner loop phai set thong so rieng cua no.
Hôm trước em quẳng một lố tính năng vào: motion profile, PIV. Sau thấy tuning oải quá => dẹp hết, quay lại PID cơ bản. Đang tính vụ kiểm soát torque nữa mà con lười trong em đang thức dậy :X
Em dự kiến là dùng Mach3 thì để nó kiểm soát tốc độ qua pulse, nhưng lý thuyết là dzậy, thực tế có ổn ko ta?
motion profile có phải là giản đồ vận tốc không bác Gamo?
Thấy cái servo xịn nào nó cũng có tham số gia tốc hết. Mà muốn gắn vào cái PID thì phải làm thế nào.. cái này mới nghĩ tới nhưng chưa hiện thực được, nên cụ thể không biết.
- analog control vẫn là PWM đó bác. Ý em là analog -> ADC -> PWM -> motor. Là mô hình kiểm tra. Khi dùng thì cứ PWM - Motor thôi.
Cái mô hình của em thì chưa xác định rỏ nguyên nhân. Em có test trên 2 con motor.
- con của anh có vẻ moment khá tốt, encoder sau khi vệ sinh cũng good, nhưng lực từ nó mạnh nên khi dừng.. lực từ tự quay motor về vị trí cân bằng từ.. nên nó không ổn định. Tự bản thân nó.. khi error = 0, PWM = 0.. thì motor tự quay theo từ trường stator :mad:. Vậy là PID lại nhảy vào sửa ;).. rồi lố nên nó cứ hunting.
- con của em thì nó chạy chậm rất smooth, chạy và dừng đúng, ít hunting, turning Ok. Nhưng mỗi tội khi chạy nhanh thì PID nó khùng luôn. Chắc do encoder nó khùng vì xuất hiện lỗi khi đếm. Con Arduino UNO thì em đánh giá nó vẫn đủ tốc độ làm việc vì nó liên tục report thông tin về máy tính qua dường UART, nhưng pid thì nó liệt :( vụ này cũng chưa có time để kiểm tra.
Éc... em hận motion profile :))
Vụ đó kinh nghiệm em test là mình phải có tuning riêng cho thằng V & A. Oải lắm. Chạy 1000 step thì mới thấy có tác dụng chứ chạy 1 step/pulse thì nó làm cho hunting. Muốn ko bị hunt thì phải tính velocity band => giá chót cũng 10 thông số nữa :)) Còn ko thì dùng PID cho cả Velocity & Acceleration cũng được.
Vụ encoder bị nhiễu cũng lằng nhằng ghê, ko biết loại encoder có bộ đệm thì có bị nhiễu ko bác?
Dùng ngắt ngoài bác ạ. Để hạn chế số lần đọc nên chỉ dùng ngắt cho kênh A, xử lý khi tín hiệu chuyển từ 0->1.
Dùng ngắt để đọc cạnh lên kênh A, gọi hàm doEncoder.
Hàm so sánh trạng thái kênh A & B để so sánh chiều quay, tính ra vị trí.
A <> B -> count + 1; (CW)
A == B -> count - 1; (CCW)
Code trên arduino.
Mã:..
void doEncoder()
{
if (digitalRead(encoderPinA) != digitalRead(encoderPinB))
{
Input ++;
}
else
{
Input --;
}
}
em nghĩ kiểu này ko ổn ah, nên dùng timer quét sẽ ổn hơn
http://www.elm-chan.org/works/smc/zblock4.png
to cụ gamo, lão tiền bối của DC servo, cái này mới gọi là bậc thày, chia sẽ từ những ngày thông tin còn hạn chế, sử dụng linh kiện ở mức thấp nhất
http://www.elm-chan.org/works/smc/report_e.html
http://www.elm-chan.org/works/smc/zblock3.png
Oi, iu bac Nhat Son thia :x :x :x Sao em kiem nhieu ma ko ra tai lieu chi tiet the nay ;x
CKD: bac choi ARM ko, em tang bac 1 board? Cam doan la do mat cong hon khi doc encoder ;))
(Mat cong cai khac ;)))
ARM cortex m3 + mikroe C/basic/pascal nhanh cấp kỳ :)
http://www.mikroe.com/mikroc/arm/
http://www.mikroe.com/mikrobasic/arm/
http://www.mikroe.com/mikropascal/arm/
Cái ELM-Chan với cái UHU nó gần giống nhau.
Rất nhiều ver đã được các bác bên tây âu thực hiện, cấu hình thấp nhất là Atmega8 chạy 16MHz.
Theo đánh giá của tụi ấy thì.. ứng dụng khá tốt. Và có rất nhiều bác DIY xong lắp lên CNC chạy quay clip mà thấy kinh hồn.
@nhatson
Theo bác không ổn là thế nào?.
Theo hiểu biết nông cạn thì có nhiều cách đọc encoder trực tiếp trên VXL.
- Cách bèo nhèo mà ai cũng biết là đọc thông qua đường input thông thường.
- Kế tiếp là qua ngắt ngoài như mình làm.
- Kế nữa là qua counter.
Ưu & nhược thì..
với cách 1 thì dể suy nghĩ, và dùng cái pin input nào cũng Ok. Nhưng nhanh là out ngay vì phụ thuộc vào thời gian lặp của chương trình.
với cách 2 thì không bỏ xung nào (trừ trường hợp nhanh quá). Nhưng nếu tốc độ quá nhanh thì chiếm quá nhiều thời gian để đọc encoder. Không còn thời gian để xử lý PID hoặc làm việc gì khác.
với cách 3 nghĩ là tối ưu hơn cả. Nhưng việc count+ hay count- chưa có nhiều kinh nghiệm sử dụng nên chưa dám dùng. Thường thì với cách này nên xử lý tín hiệu A/B thành pulse/dir rồi đọc thì thuận tiện hơn. Việc xử lý này dùng ic số thông thường cũng được, dùng ic chuyên dùng cũng được.
Do đó nếu dùng cách 2 thì với encoder số xung ít cho hiệu quả hơn, motor chạy tốc độ vừa phải là xử lý kịp.
Theo sư cụ ELM-Chan thì.. idle time còn tới 62% cơ mà. Và với encoder 400ppr (1600cpr) thì motor có thể chạy Max tới 3900rpm.
Cái này của 1 bác châu Âu làm.. hình như là Nga thì phải.
Đính kèm 5388
@Gamo
Gì chứ vụ cho hay tặng là em đều nhận hết bác ạ. Em là em sợ phụ lòng những người quan tâm đến mình. Nên cám ơn bác trước.
Nhưng em xin khất thời gian ạ. Em thích thử nghiệm từ những cái lỡm trước rồi mới tiến từ từ. Có thể cái lỡm nó làm khó mình hơn, nhưng như thế trải nghiệm được nhiều thứ hơn ạ. Khi nào rỗi em xin qua anh thọ giáo và nhận quà ARM sau ạ.
báo cáo cụ dùng ngắt thì bị dính vấn để jitter của encoder + khi motor hunting , MCU sẽ chạy ctrinh đọc encoder liên lục
dùng timer quét sẽ tránh khỏi tình trạng trên,
em cũng ủng hộ a/b > pluse/dir hoạc cw/ccw, nhưng vậy mạch sẽ phức tạp vì cần logic ngoài, hoặc dùng cpld sẽ tiện hơn
nhưng túm lại ELM có cách đây > 15 năm lúc đó 32bit motor control đắt đỏ, giò thì có khởi đầu em nghĩ vẫn nên dúng người đúng việc
b.r
Hehe, nguyên nhân em dụ bác dùng ARM là vì em vốn là tín đồ STC 8051, sau khi xài ARM rồi ko bao giờ quay đầu nhìn lại :))
Con STC 8051 chạy nhanh (1 cycle, 35Mhz), có ADC, có PWM, có đủ hết, chỉ có cái tội 8-bit :)) Khi em đọc encoder phải dùng long => chậm, ram ít nên phải optimize => tốn trí não. Chuyển qua xài ARM thì rất nhiều khó khăn biến mất. Chỉ có cái tội là thằng ARM cho customize nhiều quá nên mới đụng vào đa số mọi người chắc chạy hết vì thấy phức tạp quá so với 8-bit.
Hehe. Đúng là thế bác ạ.
Mình làm trên nền arduino tại vì mình có sẵn đồ, mua mấy cái shield cũng sẵn và dễ, không cần phải vẽ hay làm mạch. Và mấy cái board arduino đó cũng làm được nhiều trò. Cộng với suy nghĩ làm để vui và hiểu thêm các vấn đề khác nên không quá câu nệ việc hiệu quả sử dụng sau này. Cứ cái nào thấy có sẵn là bụp bụp :D
Mà arduino nó cũng đã phát triển các board dùng 32bit rồi. Như
- Arduino Due với atSAM3x8E ARM Cortex-M3, 32bit, 84MHz.
Đính kèm 5389
- LeafLabs Maple Rev3 với STM32F103RB ARM Cortex-M3, 32bit, 72MHz.
Đính kèm 5390
- http://en.wikipedia.org/wiki/List_of...atible_systems
Cho nên chắc rồi cũng sẽ nâng cấp lên ARM sớm thôi ạ.
Nhiều khi thấy mình làm vớ vẫn cũng phí time và xiền bác ạ. Nhưng bù lại khi làm được và hiểu được thì cũng vui thật. Khi đó thì lại có cái để mà chém gió với các bác nữa :o. Mà làm mấy cái này.. cũng do bác nào đó hay khích.. nói có sách, mách có chứng.. Mà tính mình thì hay nói và thích nói nhiều, nên mình làm được thì sau này chém gió mới có cái mà dẫn chứng đấy ạ. Mượn từ google hoài cũng không được hehe.
Với nữa là bác Gamo làm bằng chip 32bit mà cũng từ từ.. mình làm 8bit mà chạy được thì.. bác ấy mới nể chứ ạ :p :rolleyes:
Hoho, đúng là nể ông thiệt á, vẫn chưa hiểu ông xoay xở làm sao với 8-bit :))
Em cũng ham món này lém, hiện tại em đã sưu tầm được vài loại Diy DC servo driver: DsPIC servo (open source trên CNCZONE), UHU (mua chip về DIY) và cái còn lại của 1 chuyên gia về DIY DC servo ở HCM, em test thì đánh giá thể này:
DsPIC servo: Chạy tốc độ không cao, tầm 30kHz cao hơi nữa là tracking error.
UHU controller: cái này có khá hơn theo lí thuyết là hơn 300000 khuyến cáo là 150kHz nhưng em chạy thực tế tầm 80~100khz là tracking error rồi. Khổ nỗi mấy con motor ngon của em toàn 2500 xung nên chạy tốc độ không cao được
Cuối cùng là driver của Chuyên gia: cái này tốt nhất và em muốn cải tiến DsPIC servo theo,
Driver của Chuyên gia: manual nói là có thể chạy tốt với enc từ 50~5000ppr và em test thấy nó OK.
So sánh thấy có 1 cải tiến quan trọng là dùng 2 con VXL để tăng tốc độ xử lí, em đang băn khoăn là dùng cách nào để giao tiếp giữa 2 con VXL với tốc độ cao: dùng SPI, UART hay là CAN ah?
Mong các bác đóng góp cao kiến ah
chuyên gia nào ??? Phúc Bồ hả ?
nếu là của anh phucnd thì dùng 2 con, em nghĩ la lí do là trước đây MCU ko có moudle QIE , nên đọc encoder là vấn đề , dùng 2 MCU hoặc CPLD sẽ giải quyết được
DSPIC dòng 33 hoặc mấy con ARM7 có QIE và đủ nhanh để chạy trên 1 MCU
giao tiếp MCU ~ MCU em nghĩ i2c tốc độ ~ 4mhz hoặc SPI >10mhz >hiệu quả hơn
b.r
Em không biết bác dùng mấy con PIC thì có cái gì tốc độ cao không nhưng nếu STM32 thì có FSMC tốc độ từ 30Mhz đến 60Mhz. Đặc biệt STM32F429/439 còn có FMC tốc độ 90Mhz. Mấy cái FSMC/FMC chuyên để giao tiếp RAM, LCD, FPGA nên tốc độ cao lắm :)
Đúng là driver của bác Phúc ah, module đọc enc trên DsPIC là QEI (Quadrature Encoder Interface) không phải QIE :D.
Theo em tính toán với encoder là 2500 cài đặt QEI nhân xung là 4, động cơ quay 3000rpm = 50rps -> tần số encoder = 500Khz. Em đặt PID loop (bằng ngắt timer) 100us thì vẫn bảo đảm đọc tốt encoder nhưng khi chạy thì có vấn đề, tiếc là em không theo đuổi nó nữa nên đến giờ vẫn chưa có gì tiến triển (làm không được nên nản :))
UHU chip nói có enhanced PID nhưng không biết nó là cái gì? Có khác PID thường không nữa?
digital chán roài thì đổi bộ môn về analog + logic gate ah
http://ftp.cnchungary.com/Varsanyi_P..._03_26_old.jpg
http://ftp.cnchungary.com/Varsanyi_P...ck_Diagram.jpg