# Máy, thiết bị và sản phẩm khác > Điện - Điện tử - Tự động hóa > Arduino >  CKD - Arduino DC motor PID position controller DEMO Ver

## CKD

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 ạ.

----------


## CKD

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  :Embarrassment: 



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


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

----------


## CKD

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  :Embarrassment: , nên có thể tạm gọi là nghiên cứu chứ không phải ngâm cứu  :Big Grin: .




Có thời gian sẽ tiếp tục cải tiến & test tiếp.

----------

anhcos, anhxco, Gamo, hungdn, lekimhung, nhatson, thuhanoi

----------


## Gamo

Hoho, 8 bit mà bác làm PID được thì quá dữ  :Big Grin:

----------


## lekimhung

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

Em cũng thấy là hình như bác ấy quen tay, vân vân vê vê

----------


## CKD

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  :Big Grin:

----------

Gamo

----------


## CKD

> 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

----------


## Gamo

> 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


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

----------


## LEDUC

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

> 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

Mới phát hiện ra ở VN có thể mua được con LM629... :Confused: 

_Features
32-bit position, velocity, and acceleration registersProgrammable digital PID filter with 16-bit coefficientsProgrammable derivative sampling interval8- or 12-bit DAC output data (LM628)8-bit sign-magnitude PWM output data (LM629)Internal trapezoidal velocity profile generatorVelocity, target position, and filter parameters may be changed during motionPosition and velocity modes of operationReal-time programmable host interrupts8-bit parallel asynchronous host interfaceQuadrature incremental encoder interface with index pulse inputAvailable 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

----------


## Gamo

Hix... bác mà phát hiện sớm hơn thì đỡ ghia  :Smile: )


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

----------

nhatson

----------


## CKD

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  :Smile: .

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á  :Embarrassment: .
- 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

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  :Smile: ). 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

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  :Wink: .. 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  :Frown:  vụ này cũng chưa có time để kiểm tra.

----------


## Gamo

Éc... em hận motion profile  :Smile: )
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  :Smile: ) 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

> 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 . 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

> É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

----------

Gamo

----------


## CKD

> 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

em nghĩ kiểu này ko ổn ah, nên dùng timer quét sẽ ổn hơn

----------


## nhatson

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

----------


## Gamo

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  :Wink: )
(Mat cong cai khac  :Wink: ))

----------

CKD, nhatson

----------


## nhatson

ARM cortex m3 + mikroe C/basic/pascal nhanh cấp kỳ  :Smile: 
http://www.mikroe.com/mikroc/arm/
http://www.mikroe.com/mikrobasic/arm/
http://www.mikroe.com/mikropascal/arm/

----------


## CKD

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

Cái này của 1 bác châu Âu làm.. hình như là Nga thì phải.

----------


## CKD

@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

> 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.
> ...


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

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  :Smile: )

Con STC 8051 chạy nhanh (1 cycle, 35Mhz), có ADC, có PWM, có đủ hết, chỉ có cái tội 8-bit  :Smile: ) 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

> 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  :Smile: 
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 :Smile: 

b.r

----------


## CKD

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  :Big Grin: 

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.

- LeafLabs Maple Rev3 với STM32F103RB ARM Cortex-M3, 32bit, 72MHz.

- 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  :Embarrassment: . 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ứ ạ  :Stick Out Tongue:   :Roll Eyes (Sarcastic):

----------

nhatson

----------


## Gamo

Hoho, đúng là nể ông thiệt á, vẫn chưa hiểu ông xoay xở làm sao với 8-bit  :Smile: )

----------


## ghoang

Em cũng ham món này lém, hiện tại em đã sưu tầm được vài loại Diy DC servo driver: DsPIC servo (open source trên CNCZONE), UHU (mua chip về DIY) và cái còn lại của 1 chuyên gia về DIY DC servo ở HCM, em test thì đánh giá thể này:
DsPIC servo: Chạy tốc độ không cao, tầm 30kHz cao hơi nữa là tracking error.
UHU controller: cái này có khá hơn theo lí thuyết là hơn 300000 khuyến cáo là 150kHz nhưng em chạy thực tế tầm 80~100khz là tracking error rồi. Khổ nỗi mấy con motor ngon của em toàn 2500 xung nên chạy tốc độ không cao được
Cuối cùng là driver của Chuyên gia: cái này tốt nhất và em muốn cải tiến DsPIC servo theo, 
Driver của Chuyên gia: manual nói là có thể chạy tốt với enc từ 50~5000ppr và em test thấy nó OK.
So sánh thấy có 1 cải tiến quan trọng là dùng 2 con VXL để tăng tốc độ xử lí, em đang băn khoăn là dùng cách nào để giao tiếp giữa 2 con VXL với tốc độ cao: dùng SPI, UART hay là CAN ah?
Mong các bác đóng góp cao kiến ah

----------

Gamo, nhatson

----------


## Nam CNC

chuyên gia nào ??? Phúc Bồ hả ?

----------


## nhatson

> Em cũng ham món này lém, hiện tại em đã sưu tầm được vài loại Diy DC servo driver: DsPIC servo (open source trên CNCZONE), UHU (mua chip về DIY) và cái còn lại của 1 chuyên gia về DIY DC servo ở HCM, em test thì đánh giá thể này:
> DsPIC servo: Chạy tốc độ không cao, tầm 30kHz cao hơi nữa là tracking error.
> UHU controller: cái này có khá hơn theo lí thuyết là hơn 300000 khuyến cáo là 150kHz nhưng em chạy thực tế tầm 80~100khz là tracking error rồi. Khổ nỗi mấy con motor ngon của em toàn 2500 xung nên chạy tốc độ không cao được
> Cuối cùng là driver của Chuyên gia: cái này tốt nhất và em muốn cải tiến DsPIC servo theo, 
> Driver của Chuyên gia: manual nói là có thể chạy tốt với enc từ 50~5000ppr và em test thấy nó OK.
> So sánh thấy có 1 cải tiến quan trọng là dùng 2 con VXL để tăng tốc độ xử lí, em đang băn khoăn là dùng cách nào để giao tiếp giữa 2 con VXL với tốc độ cao: dùng SPI, UART hay là CAN ah?
> Mong các bác đóng gó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

----------

Gamo

----------


## itanium7000

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  :Smile:

----------

Gamo

----------


## ghoang

> 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  :Big Grin: .
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  :Smile: )

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?

----------

Gamo

----------


## ghoang

> 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  :Smile:

----------


## nhatson

digital chán roài thì đổi bộ môn về analog + logic gate ah

----------


## nhatson

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

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  :Embarrassment: .

----------


## nhatson

> 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 .


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

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.


Ứ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  :Embarrassment: . 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

----------


## Gamo

Ủ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

> Ủ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?
> 
> 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

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  :Wink: 

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

Đị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  :Wink: , 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  :Frown: . 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ư  :Big Grin:

----------


## nhatson

> 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é 
> 
> Đị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 . 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 , 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ế 
> 
> ...


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

- 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  :Big Grin: 

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ệ  :Smile: . 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

Chậc chậc... bị cha CKD gài, cứ tuỏng chả ngố nên nhào vào ném đá  :Big Grin: 

Ủ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

> - 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 
> 
> 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

----------


## CKD

> Chậc chậc... bị cha CKD gài, cứ tuỏng chả ngố nên nhào vào ném đá 
> 
> Ủ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?


Em có gài gì bác đâu? Vụ này em cũng chỉ mới ngâm đây thôi, có cái là em chưa phọt hết những gì em đã biết vì thiếu tự tin. Em mà cái gì em chưa trải nghiệm thì không dám chém. Phần khác vì trên này cao thủ về vxl nhiều như nấm. Dân maketing như bác NS mà trùm vậy rồi thì mấy bác chuyên về vxl sẽ trùm cở nào. Lên chém bậy bạ bị cười cho hehe.

Nhờ cụ NS góp ý nên em mới mạnh dạn phọt thêm tí chút.

----------


## nhatson

> Em có gài gì bác đâu? Vụ này em cũng chỉ mới ngâm đây thôi, có cái là em chưa phọt hết những gì em đã biết vì thiếu tự tin. Em mà cái gì em chưa trải nghiệm thì không dám chém. Phần khác vì trên này cao thủ về vxl nhiều như nấm. Dân maketing như bác NS mà trùm vậy rồi thì mấy bác chuyên về vxl sẽ trùm cở nào. Lên chém bậy bạ bị cười cho hehe.
> 
> Nhờ cụ NS góp ý nên em mới mạnh dạn phọt thêm tí chút.


em tám vì ủng hộ pan AMRM cortex / C2000 hơn, vì nó sẽ có giá trị sử dụng cao hơn
còn với 8bit , vẫn có thể làm tốt, có điều cần thêm harware để chạy tốt

cụ sắm board arm, em tặng cụ board 2 cầu h, trước em làm cho step nhưng đổi mẫu còn dư bo trắng  :Smile: 

b.r

----------


## Gamo

Hoho, cha CKD sướng nhé. Coi như là có bộ ARM & h-bridge miễn phí.

Đùa thôi, em cũng ủng hộ việc pác mà rảnh thì chuyển sang ARM đi, xài Arduino mất mặt anh em quá  :Big Grin:

----------


## CKD

Hehe. CKD cám ơn sự quan tâm của mấy bác.
Hôm nay nô ên mà cũng có mấy bác online, đúng là mọt máy tính  :Embarrassment: 

Hôm nào ở sg e sẽ liên hệ máy bác để nhận quà.

----------


## Gamo

Hehe, mới đi Noel với girl về hả  :Big Grin: ? Leo lên đây tám vì phải ở nhà chơi Noel với girl, nhưng mà là con  :Big Grin:

----------


## nhatson

http://support.motioneng.com/Downloa...ng/default.htm
PID vs PIV
servo turning

----------

CKD, Gamo

----------


## CKD

Báo cáo:
- Một chu kỳ lệnh đếm encoder mất 6us
- Một chu kỳ lệnh tính PID mất 90us.

Về lý thuyết khi dùng ngắt (interrupt)
Nếu encoder là 1000ppr thì vận tốc maximum mà vlx đếm không sai (bỏ khã năng nhiểu) là <10000rpm. Nên việc đếm encoder là không phải lo  :Big Grin: .
Tuy nhiên.. cuộc chơi không chỉ có vậy, ngoài việc đếm encoder thì còn phải tính PID... An toàn nhất là thời gian giữa 2 lần đếm encoder phải bao gồm luôn thời gian tính PID. Khi đó tổng thời gian cần là 96us. Vẫn với encoder 1000ppr thì vận tốc max đạt được là <625rpm.

* 1000ppr -- < 625  rpm
*  500ppr -- < 1250 rpm
*  250ppr -- < 2500 rpm

Nhìn vào thấy quá chậm  :Big Grin: . Tại sao chậm.. từ đầu bác Nhất Sơn & Gamo đã chỉ rỏ.
- Tốc độ của vxl chậm, mà phần lớn các phép toán dều tính trên fload (4byte) nên mất nhiều thời gian xử lý và tính toán.
- Arduino dùng atmega328, không tích hợp module đếm encoder nên mất thêm thời gian xử lý đếm encoder.
- Dùng ngắt (interrupt) nên thời gian đếm encoder được ưu tiên, do đó càng mất nhiều thời gian khi vận tốc motor lớn. Theo tính toán ở trên thì với encoder 1000ppr, nếu motor chạy >625rpm thì vxl sẽ chỉ tập trung vào xử lý đếm encoder, lơ là việc tính PID, vận tốc tiếp tục tăng nhanh sẽ bỏ qua luôn việc tính PID.

Chuyển qua đọc encoder bằng counter thì tốc độ & độ kiểm soát có thể được cải thiện  :Big Grin: .. lại cần time, nên cứ từ từ  :Confused: .

Em tối ưu được mô hình điều khiển chạy trên chip rùa.. mà Ok thì.. nâng lên ARM thì chắc phải chạy xé gió bác Gamo nhỉ  :Big Grin: 

Bác Nhất Sơn có thể góp ý giúp.. vụ đo dòng trên motor (hoặc trên cuộn dây) với ạ. Nếu dùng chính vxl và kênh AD có sẵn thì có thể đo được ko?

----------


## nhatson

> Báo cáo:
> - Một chu kỳ lệnh đếm encoder mất 6us
> - Một chu kỳ lệnh tính PID mất 90us.
> 
> Về lý thuyết khi dùng ngắt (interrupt)
> Nếu encoder là 1000ppr thì vận tốc maximum mà vlx đếm không sai (bỏ khã năng nhiểu) là <10000rpm. Nên việc đếm encoder là không phải lo .
> Tuy nhiên.. cuộc chơi không chỉ có vậy, ngoài việc đếm encoder thì còn phải tính PID... An toàn nhất là thời gian giữa 2 lần đếm encoder phải bao gồm luôn thời gian tính PID. Khi đó tổng thời gian cần là 96us. Vẫn với encoder 1000ppr thì vận tốc max đạt được là <625rpm.
> 
> * 1000ppr -- < 625  rpm
> ...


encoder 1 là dùng thêm cpld hoặc ic chuyên dụng để đếm, tốc độ cụ CKD tính ra hay là dùng OSC kiểm tra, kinh nghiệm thấy là count lệnh lúc nào cũng nhanh hơn so với đo thực tế
và có cho là thực tế đi chăng nữa thì cũng sẽ lấy giá trị 1/2 thôi ah

còn adc em nhớ là của mega cở 100k , em là ko đủ nhanh
bảo vệ quá dòng em nghĩ cụ có thể dùng opam/comparator để bảo vệ

b.r

----------


## nhatson

ah, mà sao cụ CKD cứ phải aduino thế ah?
motor thì gấu nhất là C2000 của TI, sau đó là ARM cortex, mấy chú của freesacle/renesas cũng gấu nhưng kong thông dụng cho qua

----------


## Gamo

Hoho, mấy bác tính kinh quá em ko theo kịp.

Em chỉ có kinh nghiệm là xài bộ đếm encoder của ARM thì giống Fire And Forget, rất khoẻ. Còn dùng ARM nó sướng là mình chỉ lo logic thôi, ko phải lo mấy chuyện lặt vặt là tràn số, dùng byte hay int hay long long cho nó hiệu quả, dùng mảng không được quá 2kb (con STC 8051 cũ của em memory của nó chỉ có 2048 bytes thôi).  :Smile: )

Với lại ở góc độ cao cấp hơn thì có trò khác nữa:
- Qua một số tài liệu em đọc thì pp PIV cũ, người ta tính sẵn motion profile trước. Khi chạy thì chỉ bám theo motion profile đã tạo thôi. Nhưng mà như vậy thì ko linh hoạt vì trong quá trình chạy chưa chắc motor chạy đúng các profile đã định. Do đó, một trong các xu hướng bây giờ là tính on the fly, tức là căn cứ vào tình hình motor hiện tại mà người ta điều chỉnh vận tốc & acceleration ngay tức thì cho phù hợp để khi motor tới đích là dừng luôn, giảm vụ lắc lư qua lại. 
- Ý tưởng thì quá đơn giản, lúc đầu mới làm em cũng tính rứa. Làm xong em mới hiểu là đơn giản vậy mà các driver đời cũ ko làm chuyện đó  :Smile: ) Nguyên nhân đơn giản là nó tính không kịp. Đặc biệt là nếu bác chơi S-Curve nữa thì mấy con MCU đời cũ chắc khóc  :Smile: )




Hix, mà btw, các bác có biết chỗ nào bán cái chuôi cho spindle Chị Na & loại giắc 4 chấu âm tường ko? Em ra Nhật Tảo thì chỉ có loại giắc 3 chấu âm tường, còn chuôi spindle ở Nhật Tảo thì vừa nhưng hơi nhỏ nên lòi ra hơi mất thẩm mỹ.

----------


## Gamo

Mà anh em mình tán dóc mấy bữa nay, chưa ai dám dùng thật sự. Hay là bác CKD làm 1 bộ CNC mini test thử driver đi  :Smile: )

----------


## CKD

@nhatson
Thật tình với bác.. là em muốn làm để sau còn tổng hợp lại, làm vài bài phổ cập vxl cho nó vui. Chính thế mà em chọn Arduino để với người tập tọe thì dễ dùng hơn. Mấy cái ARM nghĩ là tiếp cận không khó, có thể nói vài cái nó còn dễ dùng hơn vì có một số phần cứng đã tích hợp sẵn mà những con già cỗi không có.

Để làm được vụ DC servo kiểu này thì phải biết mấy thứ cơ bản như:
- Khai báo & sử dụng các chức năng In/Out.
- Khai báo & sử dụng các chức năng Analog (in ADC, out PWM).
- Khai báo & sử dụng UART để dùng PC config các param.
- Khai báo & sử dụng timer.
- Tính toán PID cũng là bài tập hay vì nó thể hiện được giải pháp tính tích phân & vi phân gần đúng dạng hàm rời rạc.
- Bla bla..

Về mặt giải thuật thì em nghĩ.. với chíp còi thì phần giải thuật cần phải tinh gọn & chặc chẻ hiệu quả hơn.. nên nếu nói mang tính học thuật thì nghĩ mấy con atmega già vẫn đáp ứng được.

Tùm lum tà la.. nên thôi cứ atmega có sẵn mà chơi. Nếu lên ARM thì cũng lên Arduino DUE (nó cũng chơi nhân cortex m3 rồi). Vì vài lý do, cái board nó làm có sẵn UART, lập trình trên Arduino IDE cũng tạm tạm, buồn tình dùng mấy trình biên tập & biên dịch khác như AVRStudio mà em biết dùng  :Embarrassment: . Board nó làm theo tiêu chuẩn, nên muốn quậy cái nào thì mua cái shield cắm vào (đã mua một mớ quá trời shield). Mấy cái lý do lý trấu này là vì trình làm PCB cực lởm.. nên tự làm mạch prototype cảm thấy không khả thi. Mà prototype thì nếu có board mẫu sẵn đi mua cho lành  :Big Grin: .

----------


## CKD

@Gamo
Em kiểm soát tốc độ bằng điện áp & dòng thì motor sẽ giảm moment khi có tải. Nhưng khi đó thì test đã đời thấy Ok, thời gian đáp ứng, dừng đúng vị trí, overshoot thì chỉ quan sát bằng mắt.. chưa đo đạt nên khong dám phán.

Em đã xử luôn cái mô hình PID kiểm soát cả position & speed để tránh trường hợp motor quá tốc độ dẫn tới chíp bị đơ (do chỉ tranh thủ tính vị trí)  :Wink: . Nhưng nó chưa chạy một cách trơn tru. Nếu cách này turning Ok thì moto vẫn khỏe khi chạy chậm, không quá tốc độ định mức khi chạy nhanh.

Tạm thời cái này mà chơi với motor DC nhiều cực, tốc độ thấp, moment lớn.. thì chắc cũng ổn tí xíu. Lắp vào CNC test cho mọi người xem chơi thì chắc.. còn lâu mới đủ tự tin hehe.

@NhatSon
Quên mất. Cái thời gian đó được tính bằng 2 cách.
1. Dùng hàm thời gian để đo thời gian của 1, 10, 100 chu kỳ tính toán của hàm rồi tính lại thời gian trung bình của 1 lần tính toán.
2. Lồng ghép vào việc tính toán, xuất tín hiện ra ngoài rồi đo tần số (frequency metter) từ đó tính ra thời gian làm việc thực tế của hàm.
Sau đó mới so sánh rồi chọn lại thông số  :Big Grin: .
Cái tính toán phía trên chỉ thuần là lý thuyết, khi thực hiện phải có hệ số an toàn nữa à  :Big Grin: .

Mọi phép đo đều có được từ UART, VOM có chức năng đo tần số, do bằng cái OSC cùi của Jyetech. Ở mức độ thực nghiệm cho vui thì nghĩ độ chính xác có thể chấp nhận được.

----------


## Gamo

Ôi ôi, bác cứ chuyển qua ARM đi, ai bắt bác đi làm board bao vờ  :Smile: ) Đương nhiên bác thích thì em tặng bác 10 chục con bằng đầu đũa, em đang để ở nhà tự kỷ vì ko biết làm sao mà hàn  :Smile: )

Bữa nào em qua bác chỉ em mấy vụ sắt thép tí, với tặng bác board ARM có sẵn USB, USART, on the fly debugging, IDE thì siêu dễ chỉ cần tick tick tick, có hàng mẫu sẵn hết, ADC siêu nhanh (<1us, con Arduino của bác & con 8051 của em khoảng 100us/sample). Bác tặng lại em con CNC khủng của bác là được  :Cool:

----------


## CKD

Làm cái clip cho nó nóng lại chủ đề  :Smile: 
-- Pulse generator: Mach3
-- BOB: Bitsensor.com BOB Mach3 USB
-- Driver: Arduino DC PID closed loop controller
-- DC motor PITTMAN 24V 500cpr, running at 12V DC.

----------

Gamo, mpvmanh, Nam CNC, nhatson

----------


## nhatson

> 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 
> 
> 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
> ...


cái bo màu đỏ ờ sì gòn có bán ko anh CKD ơi

----------


## Gamo

Xanh xanh đỏ đỏ, đẹp chai dễ sợ :x :x :x

----------


## CKD

Board đỏ không có  :Smile:

----------

