PDA

View Full Version : CKD - Arduino DC motor PID position controller DEMO Ver



Trang : [1] 2

CKD
09-12-2014, 08:40:19 AM
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 ạ.

5401

CKD
15-12-2014, 05:45:36 PM
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

5402

Vệ sinh bằng bộ dụng cụ này.
5403

Xong vẫn chưa có time test lại xem thế nào.. vì bận lo spam diễn đàn :D

CKD
17-12-2014, 11:37:34 PM
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.

Gamo
18-12-2014, 07:07:56 AM
Hoho, 8 bit mà bác làm PID được thì quá dữ :D

lekimhung
18-12-2014, 10:50:26 AM
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ế.

Gamo
18-12-2014, 10:56:02 AM
Em cũng thấy là hình như bác ấy quen tay, vân vân vê vê

CKD
18-12-2014, 11:20:18 AM
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

CKD
18-12-2014, 11:24:01 AM
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ê

Mấy bác thấy em thí nghiệm với cái motor mà lòng thì cứ nghĩ về cái chi chi. Buồn :mad:

Gamo
18-12-2014, 12:05:19 PM
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

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

Em có mấy con DC 200p/r, điện áp <5v, nhưng mà là step :cool:

LEDUC
18-12-2014, 01:37:53 PM
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 .

CKD
18-12-2014, 02:43:06 PM
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 .

Ok. Thanks bác LEDUC.
Mình sẽ liên hệ sau để nhận.

CKD
22-12-2014, 10:58:26 AM
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

Gamo
22-12-2014, 11:26:46 AM
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

CKD
22-12-2014, 11:37:40 AM
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

Gamo
22-12-2014, 11:48:34 AM
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?

CKD
22-12-2014, 12:07:21 PM
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.

Gamo
22-12-2014, 12:59:35 PM
É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?

nhatson
22-12-2014, 02:36:34 PM
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.

Uno xài atmeg328, con này ko có module đọc encoder AB, cụ đọc encoder theo pp nào ah?

b.r

nhatson
22-12-2014, 02:52:05 PM
É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?

encoder tiêu chuẩn em thấy dùng 26ls31/32, dùng trực tiếp 3.3V thì 26lsv31/32

CKD
22-12-2014, 03:57:49 PM
Uno xài atmeg328, con này ko có module đọc encoder AB, cụ đọc encoder theo pp nào ah?

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.


..
void doEncoder()
{
if (digitalRead(encoderPinA) != digitalRead(encoderPinB))
{
Input ++;
}
else
{
Input --;
}
}

nhatson
22-12-2014, 04:20:00 PM
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

nhatson
22-12-2014, 04:21:00 PM
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

Gamo
22-12-2014, 04:33:22 PM
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 ;)))

nhatson
22-12-2014, 04:35:07 PM
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/

CKD
22-12-2014, 04:53:20 PM
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.

CKD
22-12-2014, 05:01:35 PM
Cái này của 1 bác châu Âu làm.. hình như là Nga thì phải.
5388

CKD
22-12-2014, 05:06:37 PM
@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 ạ.

nhatson
22-12-2014, 05:12:06 PM
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.

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

Gamo
22-12-2014, 05:27:17 PM
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.

nhatson
22-12-2014, 05:57:19 PM
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.


em đang đổi qua stm32, ref manual có 1200 trang thaoi :)
nói chú chỉ tập trung mấy module mình cần khai thác thôi, máy cái ko dùng khi nào dùng thì đọc ah

ít tốn trí nảo thì dùng C2000 + vissim, mô hình hoá > biên dịch > nạp code> chạyyyyy:)

b.r

CKD
22-12-2014, 05:59:51 PM
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 (http://arduino.cc/en/pmwiki.php?n=Main/ArduinoBoardDue) với atSAM3x8E ARM Cortex-M3, 32bit, 84MHz.
5389
- LeafLabs Maple Rev3 (http://www.cutedigi.com/arduino/the-maple-stm32-arm-cortex-version-of-arduino.html) với STM32F103RB ARM Cortex-M3, 32bit, 72MHz.
5390
- http://en.wikipedia.org/wiki/List_of_Arduino_boards_and_compatible_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:

Gamo
22-12-2014, 07:08:19 PM
Hoho, đúng là nể ông thiệt á, vẫn chưa hiểu ông xoay xở làm sao với 8-bit :))

ghoang
23-12-2014, 12:23:06 PM
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

Nam CNC
23-12-2014, 12:59:06 PM
chuyên gia nào ??? Phúc Bồ hả ?

nhatson
23-12-2014, 01:04:53 PM
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

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

itanium7000
23-12-2014, 01:13:23 PM
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 :)

ghoang
23-12-2014, 02:29:20 PM
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

Đú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?

ghoang
23-12-2014, 03:03:20 PM
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 :)

có nhiều cái tốt hơn nhưng em thì lại theo không kip nên xài cái gì mình biết thôi ah :)

nhatson
23-12-2014, 04:01:57 PM
digital chán roài thì đổi bộ môn về analog + logic gate ah

http://ftp.cnchungary.com/Varsanyi_Peter/A300_Servo_Controller/G3XX/G320__2003_03_26_old.jpg

http://ftp.cnchungary.com/Varsanyi_Peter/CNC%20vezerles%20-%20szervoval/Gecko%20Servo%20Drive/G340_Block_Diagram.jpg

nhatson
23-12-2014, 04:04:29 PM
Đú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?

500khz, em nghĩ là cần dùng đến chip 26ls31/ls32

CKD
23-12-2014, 05:20:32 PM
Mấy con của gecko dùng analog & logic thôi mà nghe mấy anh tây khen quá thể. Không biết có phải tuyệt chiêu PR không.
Do mấy con step driver đời cũ vẫn dùng analog & logic mà chạy cũng ngon, có thêm cái VR chỉnh cho motor chạy êm (nghi là chỉnh decay) thì dùng rồi có cảm nhận, còn mấy con dc servo này thì chưa nên không dám chém :o.

nhatson
23-12-2014, 05:23:52 PM
Mấy con của gecko dùng analog & logic thôi mà nghe mấy anh tây khen quá thể. Không biết có phải tuyệt chiêu PR không.
Do mấy con step driver đời cũ vẫn dùng analog & logic mà chạy cũng ngon, có thêm cái VR chỉnh cho motor chạy êm (nghi là chỉnh decay) thì dùng rồi có cảm nhận, còn mấy con dc servo này thì chưa nên không dám chém :o.

geckodrive dùng fast decay khi chạy, và slowdecay khi motor dừng đề giảm heating, nên ko có chỉnh decay
smooth trim của geckodrive là chỉnh wavefrom ah

dc servo geckodrive từ những năm 2000, là tiên phong servo giá rẻ ah, so với mấy loại digital đời mới phục vụ hobby cnc thì ko bằng nữa rồi ah
nhưng dù sao thì geckodrive servo được cái là dễ sủ dụng

b.r

CKD
24-12-2014, 12:25:43 AM
Tình hình là lâu nay quên báo cáo chi tiết.

Thuật toán PID được dùng trong dự án này hiện tại là thuật toán PID cơ bản.
5404

Ứng dụng được tạo trên nền Arduino UNO
- core điều khiển atmega328, 32K, 8bit, 16MHz.
- công suất dùng L298.
- điện áp làm việc (trong clip trên) 12V.
- encoder 1000 xung.
- đọc encoder bằng ngắt ngoài.
- thuật toán PID cơ bản (dùng thư viện của Arduino), thời gian giữa 2 lần tính PID là 20 mili giây.
- Điều khiển công suất bằng PWM, tần số 1kHz.

Kết luận tạm thời.
- PWM tần số thấp nên hiệu quả điều khiển chưa cao.
- thời gian giữa 2 lần tính PID còn lớn nên thời gian đáp ứng chưa nhanh.
- do đọc encoder bằng ngắt ngoài.. nên VXL mất nhiều thời gian xử lý, khi chạy tốc độ cao thì không còn thời gian để tính PID -> out :o. Trường hợp này dùng encoder độ phân giải thấp thì phù hợp với nghiên cứu hơn.

Việc thực hiện dự án trên nền Arduino UNO vì:
- Mục tiêu tập trung tìm hiểu PID, có nhiều ứng dụng như điều khiển tốc độ, nhiệt độ v.v... trong đó DC servo là gần gủi với CNC nên được chọn.
- Board arduno UNO đang có sẵn và hơn hết là tiện dụng vì không cần thiết bị nạp (dù đã có PICKIT & STK500 và vài mạch nạp khác). Arduino cũng có board dùng ARM tốc độ cao nhưng chi phí còn cao ;).
- Arduino Shield cũng có sẵn... không mất nhiều thời gian thiết kế và làm mạch.

Các thông tin cụ thể hơn về chương trình (code), các mạch giao tiếp bla bla sẽ được đề cập trong chủ đề khác, đầy đủ, chi tiết hơn khi có time.

Gamo
24-12-2014, 05:19:26 AM
Ủa, em nghĩ Arduino phải có built-in pwm chứ bác? 1khz => 90% là cha dùng pwm tự viết rồi đúng hem?:cool:

Theo kinh nghiệm của các bác thì pwm thường nên trong khoảng bao nhiêu? Pwm tren 60khz có tốt ko?

nhatson
24-12-2014, 07:31:35 AM
Ủa, em nghĩ Arduino phải có built-in pwm chứ bác? 1khz => 90% là cha dùng pwm tự viết rồi đúng hem?:cool:

Theo kinh nghiệm của các bác thì pwm thường nên trong khoảng bao nhiêu? Pwm tren 60khz có tốt ko?

PWM tuỳ ứng dụng với motor 3000RPM <> 5000RPM
em nghĩ mức 15khz <> 20khz là vửa cân bằng được hiệu năng / tổn hao ( như vậy độ phân giải sẽ đạt 10bit <> 12bit)
PID loop 1khz > 2khz nếu có thể

CKD
24-12-2014, 09:37:33 AM
He he!
Báo cáo.
- PWM dùng timer bác ạ. 1kHz là mặc định.. bước đầu test để thử code nên không quan tâm nhiều vấn đề này. Maximum nó có thể là 31 hoặc 62kHz tùy vào dùng timer 8 hay 16bit ạ.
- Tần só tính PID cũng điều chỉnh được ;)

Sẽ thay đổi PWM frequency & PID requency rồi làm lại clip cho các bác nhé :D

Định là nghiên cứu và dùng luôn mô hình cascade PID để kiểm soát đồng thời position/speed hoặc position/speed/torque luôn. Nhưng chưa tìm được cách code sao cho nó hiệu quả và chiếm ít tài nguyên, ít đơn vị tính trên float để tăng tốc. Dây chính là nhược điểm của 8bit đúng không mấy bác :confused:. Nhưng mà mấy ông chú làm được.. mà mình không làm được là còn dở.. mà còn dở thì còn nghiên cứu & học :confused:, nếu thành công thì vui ;), nếu thất bại thì biết là ta còn nhiều hạn chế :cool:

Cũng nói thêm về việc đọc encoder, tính vị trí, tính tốc độ.
Trước khi tiến hành dã tìm hiểu qua các ứng dụng đọc encoder, cũng như các đánh giá về hiệu quả của các phương pháp. Thấy kết luận sơ bộ có thể tóm tắt thế này:
- Đọc bằng ngắt gì đó trong timer.. nôm na là đo thời gian giữa 2 lần ngắt, cái này hiệu quả cho đo tốc độ nhiều hơn. Chưa rành timer nên không chơi môn này.
- Đọc bằng ngắt ngoài và xử lý bằng code. Cách này được cho là đọc chính xác nhất, nhược điểm duy nhất là chiếm tài nguyên. Nếu đọc tần số lớn thì VXL nó nghỉ luôn, không thèm làm gì khác.
- Đọc bằng counter. Ưu là nó chạy độc lập với core vxl, nên không chiếm thời gian xủ lý chương trình. Chương trình cứ định kỳ đọc giá trị đếm và xử lý tuần tự, chỉ cần tần số đọc giá trị đủ lớn (trước khi counter bị tràn giá trị) là được. Nhước điểm là nếu chỉ dừng ở đây thì chưa xác định được chiều quay, muốn thì phải làm thêm ít việc nữa :(. Nhưng cách này được đánh giá là không chính xác khi tốc độ chậm hoặc thay đổi lớn.

Các ưu/nhược thế kia chưa ứng dụng hết nên không thể kết luận là trong mô hình position control thế này, cái nào cho ưu điểm hơn cái nào, nhất là cái cuối cùng.. có nhiều đánh giá là không chính xác.. nhưng cụ thể là thế nào thì chưa biết.
Vì mục đích dơn giản hóa tối đa cho thí nghiệm nên chọn phương pháp đọc encoder bằng ngắt ngoài.
- Ưu điểm.. đơn giản & chính xác nhất có thể. Xử lý và đếm encoder bằng code.
- Nhược điểm.. không phù hợp với encoder nhiều xung, với vận tốc lớn (tần số lấy mẫu lớn).

Trong mô hình nghiên cứu lý thuyết & thực nghiệm, CKD nghĩ là còn nhiều nhược điểm nhưng tạm có thể chấp nhận được. Mô hình hoàn hảo thì việc nâng cấp core xử lý là vô tư :D

nhatson
24-12-2014, 10:48:35 AM
He he!
Báo cáo.
- PWM dùng timer bác ạ. 1kHz là mặc định.. bước đầu test để thử code nên không quan tâm nhiều vấn đề này. Maximum nó có thể là 31 hoặc 62kHz tùy vào dùng timer 8 hay 16bit ạ.
- Tần só tính PID cũng điều chỉnh được ;)

Sẽ thay đổi PWM frequency & PID requency rồi làm lại clip cho các bác nhé :D

Định là nghiên cứu và dùng luôn mô hình cascade PID để kiểm soát đồng thời position/speed hoặc position/speed/torque luôn. Nhưng chưa tìm được cách code sao cho nó hiệu quả và chiếm ít tài nguyên, ít đơn vị tính trên float để tăng tốc. Dây chính là nhược điểm của 8bit đúng không mấy bác :confused:. Nhưng mà mấy ông chú làm được.. mà mình không làm được là còn dở.. mà còn dở thì còn nghiên cứu & học :confused:, nếu thành công thì vui ;), nếu thất bại thì biết là ta còn nhiều hạn chế :cool:

Cũng nói thêm về việc đọc encoder, tính vị trí, tính tốc độ.
Trước khi tiến hành dã tìm hiểu qua các ứng dụng đọc encoder, cũng như các đánh giá về hiệu quả của các phương pháp. Thấy kết luận sơ bộ có thể tóm tắt thế này:
- Đọc bằng ngắt gì đó trong timer.. nôm na là đo thời gian giữa 2 lần ngắt, cái này hiệu quả cho đo tốc độ nhiều hơn. Chưa rành timer nên không chơi môn này.
- Đọc bằng ngắt ngoài và xử lý bằng code. Cách này được cho là đọc chính xác nhất, nhược điểm duy nhất là chiếm tài nguyên. Nếu đọc tần số lớn thì VXL nó nghỉ luôn, không thèm làm gì khác.
- Đọc bằng counter. Ưu là nó chạy độc lập với core vxl, nên không chiếm thời gian xủ lý chương trình. Chương trình cứ định kỳ đọc giá trị đếm và xử lý tuần tự, chỉ cần tần số đọc giá trị đủ lớn (trước khi counter bị tràn giá trị) là được. Nhước điểm là nếu chỉ dừng ở đây thì chưa xác định được chiều quay, muốn thì phải làm thêm ít việc nữa :(. Nhưng cách này được đánh giá là không chính xác khi tốc độ chậm hoặc thay đổi lớn.

Các ưu/nhược thế kia chưa ứng dụng hết nên không thể kết luận là trong mô hình position control thế này, cái nào cho ưu điểm hơn cái nào, nhất là cái cuối cùng.. có nhiều đánh giá là không chính xác.. nhưng cụ thể là thế nào thì chưa biết.
Vì mục đích dơn giản hóa tối đa cho thí nghiệm nên chọn phương pháp đọc encoder bằng ngắt ngoài.
- Ưu điểm.. đơn giản & chính xác nhất có thể. Xử lý và đếm encoder bằng code.
- Nhược điểm.. không phù hợp với encoder nhiều xung, với vận tốc lớn (tần số lấy mẫu lớn).

Trong mô hình nghiên cứu lý thuyết & thực nghiệm, CKD nghĩ là còn nhiều nhược điểm nhưng tạm có thể chấp nhận được. Mô hình hoàn hảo thì việc nâng cấp core xử lý là vô tư :D

về việc dùng timer, để tạo ngắt ~ tạo ra 1 ngắt theo thời gian, quét trạng thái encoder a/b theo 1 chu kỳ thời gian, giống như việc quét bàn phím ah
timer ngắt này sẽ là main time cho việc phân bổ tính toán PID/truyền serial, cập nhật pwm, đọc counter vv


theo pp của cụ CKD, cụ định làm thế nào tạo 1khz tính toán PID ?

CKD
24-12-2014, 02:48:58 PM
- PWM 1kHz là mặc định của timer với hệ số chia là 64 (theo lý thuyết là 976.56Hz). Nếu hệ số chia là 1 thì nâng tối đa được 62,500Hz.
- Việc chi kỳ tính PID minimum là 20ms thì dùng hàm thời gian trong vòng lặp để bỏ không tính nếu thời gian đo được từ lần trước <20ms. Nếu > 20ms thì tính PID một lần. Ở đây minimum là 20ms là mình chọn đại, và gọi là minimum vì nếu encoder đọc với tần số quá cao thì vxl không còn thời gian để mà tính PID nữa. Chíp rùa mà đọc bằng ngắt thì dính cái khoảng này.

Theo ý của bác NS thì khi đó.. với chu kỳ quét đủ lớn thì ta có thể giải quyết mọi chuyện mà không phải bị gián đoạn bởi ngắt. Nhưng với chip chậm.. thì giải pháp này cần đươc cân đo kỹ hơn. Nhất là thời gian tối đa mà một chu kỳ tính PID cần (với cao thủ Assembly thì chắc nhìn code PID là đã tính được khi thực hiện bài toán mất bao nhiêu chu kỳ máy rồi). Từ đó tính được tần số lấy mẫu, tính được giới hạn số xung encoder cũng như tốc độ tối đa mà motor chạy không bị lỗi.

Nâng chu kỳ tính toán PID lên 1-2kHz thì chưa biết là con atmega328 với trình code cùi bắp của mình thì có lên đến mức đó được không? Để có time sẽ test thử xem một chu kỳ tính PID mất bao nhiêu thời gian thực. Chỉ tính PID, xuất xung mẫu ra ngoài rồi đo bằng frequency metter chắc là tạm tin được đúng thời gian thực :D

Với trình còi thì mới biết và làm được nhiêu đó. Mấy cái cao siêu hơn để có thể tối ưu hóa tới mức chu kỳ xung nhịp của vxl thì hiện botay.com. Chắc sẽ tìm hiểu nhiều hơn cái timer trong vxl ở các bài tập khác. Nhược điểm chậm và giới hạn số xung cũng như tần số đọc encoder tạm chấp nhận trong thí nghiệm này. Dù đó là bước đi lùi công nghệ :). Gần tết nên time có cũng cạn, khi có time thì tranh thủ nghiên cứu lý thuyết & code sơ sơ. Sau này nếu còn hứng thì chuyển lên ARM, đọc encoder bằng chip riêng v.v.... cho bằng với cụ Gamo.

Gamo
24-12-2014, 04:52:03 PM
Chậc chậc... bị cha CKD gài, cứ tuỏng chả ngố nên nhào vào ném đá :D

Ủa, như vậy để biến driver của mình thành driver cỡ Gecko đời đầu thì mình cần làm những gì nữa? Nếu để dùng trong công nghiệp thì phải như thế nào?

nhatson
24-12-2014, 05:31:50 PM
- PWM 1kHz là mặc định của timer với hệ số chia là 64 (theo lý thuyết là 976.56Hz). Nếu hệ số chia là 1 thì nâng tối đa được 62,500Hz.
- Việc chi kỳ tính PID minimum là 20ms thì dùng hàm thời gian trong vòng lặp để bỏ không tính nếu thời gian đo được từ lần trước <20ms. Nếu > 20ms thì tính PID một lần. Ở đây minimum là 20ms là mình chọn đại, và gọi là minimum vì nếu encoder đọc với tần số quá cao thì vxl không còn thời gian để mà tính PID nữa. Chíp rùa mà đọc bằng ngắt thì dính cái khoảng này.

Theo ý của bác NS thì khi đó.. với chu kỳ quét đủ lớn thì ta có thể giải quyết mọi chuyện mà không phải bị gián đoạn bởi ngắt. Nhưng với chip chậm.. thì giải pháp này cần đươc cân đo kỹ hơn. Nhất là thời gian tối đa mà một chu kỳ tính PID cần (với cao thủ Assembly thì chắc nhìn code PID là đã tính được khi thực hiện bài toán mất bao nhiêu chu kỳ máy rồi). Từ đó tính được tần số lấy mẫu, tính được giới hạn số xung encoder cũng như tốc độ tối đa mà motor chạy không bị lỗi.

Nâng chu kỳ tính toán PID lên 1-2kHz thì chưa biết là con atmega328 với trình code cùi bắp của mình thì có lên đến mức đó được không? Để có time sẽ test thử xem một chu kỳ tính PID mất bao nhiêu thời gian thực. Chỉ tính PID, xuất xung mẫu ra ngoài rồi đo bằng frequency metter chắc là tạm tin được đúng thời gian thực :D

Với trình còi thì mới biết và làm được nhiêu đó. Mấy cái cao siêu hơn để có thể tối ưu hóa tới mức chu kỳ xung nhịp của vxl thì hiện botay.com. Chắc sẽ tìm hiểu nhiều hơn cái timer trong vxl ở các bài tập khác. Nhược điểm chậm và giới hạn số xung cũng như tần số đọc encoder tạm chấp nhận trong thí nghiệm này. Dù đó là bước đi lùi công nghệ :). Gần tết nên time có cũng cạn, khi có time thì tranh thủ nghiên cứu lý thuyết & code sơ sơ. Sau này nếu còn hứng thì chuyển lên ARM, đọc encoder bằng chip riêng v.v.... cho bằng với cụ Gamo.

cu CKD cứ thử, co 1 con digital OSC để test xem 1 vòng lệnh mất bao nhiêu uS thì hay