PDA

View Full Version : Cách xác định tốc độ động cơ chính xác? Viết bằng Mplab.


uydanh
02-01-2008, 11:48 PM
Chào mọi người!
Mình xác định tốc độ động cơ DC như sau : đọc xung encoder phát ra cứ mỗi 1ms một lần, dùng timer0, từ số xung đó xác định tốc độ hiện tại của động cơ. Chương trình viết bằng mplab và chạy tốt nhưng có một nhược điểm lớn như sau:vì xung đọc về chỉ toàn là số nguyên (tất nhiên ko thể có phần thập phân) nên về bản chất của giải thuật trên cho ra một tốc độ động cơ ko thể nào chính xác được. Sai số sẽ rất lớn nếu hệ số nhân vào để quy đổi từ số xung ra tốc độ thực càng lớn.
Động cơ của mình ở tốc độ tối đa đếm được 6 xung/1ms (quy đổi 3336 vòng/phút). Ở các tốc độ thấp hơn thì số xung chỉ có thể là 5 ,4,3,2,1 hoặc 0 và tương ứng nếu thể hiện ra led 7 đoạn thì dù động cơ quay như thế nào đi nữa thì cũng chỉ có 7 giá trị tốc độ đó. Chưa kể đến việc nếu chạy ở tốc độ thấp, trong vòng 1ms mà chưa tạo ra hoàn thiện 1 xung thì kết quả là 0 vòng/phút.
Cho mình hỏi, có cách naò để việc đọc tốc độ chính xác hơn không ?( mà không phải tăng thời gian lấy mẫu).
Một câu hỏi thêm : việc thực hiện các phép nhân các số thập phân dùng asm như thế nào? (có chương trình con luôn thì tốt quá!)
Cảm ơn mọi người.

namqn
03-01-2008, 12:34 AM
Chào mọi người!
Mình xác định tốc độ động cơ DC như sau : đọc xung encoder phát ra cứ mỗi 1ms một lần, dùng timer0, từ số xung đó xác định tốc độ hiện tại của động cơ. Chương trình viết bằng mplab và chạy tốt nhưng có một nhược điểm lớn như sau:vì xung đọc về chỉ toàn là số nguyên (tất nhiên ko thể có phần thập phân) nên về bản chất của giải thuật trên cho ra một tốc độ động cơ ko thể nào chính xác được. Sai số sẽ rất lớn nếu hệ số nhân vào để quy đổi từ số xung ra tốc độ thực càng lớn.
Động cơ của mình ở tốc độ tối đa đếm được 6 xung/1ms (quy đổi 3336 vòng/phút). Ở các tốc độ thấp hơn thì số xung chỉ có thể là 5 ,4,3,2,1 hoặc 0 và tương ứng nếu thể hiện ra led 7 đoạn thì dù động cơ quay như thế nào đi nữa thì cũng chỉ có 7 giá trị tốc độ đó. Chưa kể đến việc nếu chạy ở tốc độ thấp, trong vòng 1ms mà chưa tạo ra hoàn thiện 1 xung thì kết quả là 0 vòng/phút.
Cho mình hỏi, có cách naò để việc đọc tốc độ chính xác hơn không ?( mà không phải tăng thời gian lấy mẫu).
Một câu hỏi thêm : việc thực hiện các phép nhân các số thập phân dùng asm như thế nào? (có chương trình con luôn thì tốt quá!)
Cảm ơn mọi người.
Tại sao phải lấy mẫu tốc độ mỗi ms? Cách đây 4 năm sinh viên của tôi cũng làm đề tài điều khiển tốc độ động cơ, đã lấy mẫu tốc độ mỗi 10 ms.

Theo thông tin bạn cho biết thì bạn chỉ nhận được khoảng hơn 100 xung/vòng quay. Bạn có thể chọn một trong những cách sau để cải thiện:

- Gắn encoder có độ phân giải cao hơn
- Sử dụng cả 2 kênh A, B để tăng độ phân giải xung lên 4 lần (tham khảo trên diễn đàn này, http://www.picvietnam.com/forum//showthread.php?t=1265, post #5)
- Với tốc độ thấp thì chuyển sang đo thời gian cần thiết của mỗi vòng quay

Bạn tham khảo www.piclist.com về các thuật toán số học cho hợp ngữ.

Thân,

uydanh
03-01-2008, 01:39 AM
Cảm ơn anh Nam.Anh nói đúng, cái encoder của em chỉ có 100xung/vòng. Để em tham khảo hết luồng bên kia rồi rút ra cách thực hiện cho mình. Có gì vướng mắc lại hỏi tiếp. Hihi

sandro_bk
03-01-2008, 08:27 AM
chào bạn,mình nghĩ bạn nên dùng pic18fXX31,nó có module đọc encoder 16 bit,encoder nên dùng loại xung càng nhiều càng tốt,mình nghĩ nếu đặt thời gian đọc encoder lớn thì đọc encoder đỡ sai số nhưng lại vướng chổ nếu hiệu chỉnh PID thì thời gian lấy mẩu lớn như vậy ko đảm bảo
theo mình bạn nên đọc encoder kiểu mảng,ví dụ bạn đặt thời gian đọc encoder là 10ms thì bạn chia thành 10 lần đọc mỗi lần 1ms,cứ sau 1ms đọc số xung,ghi vào mảng,tính tổng mảng đó,tới lần đọc thứ 11 thì quay lại ghi vào ô thứ nhất,bạn lại tính tổng mảng đó,như vậy cứ sau 1ms bạn lại có giá trị mới,như vậy nếu hiệu chỉnh tốc độ có thể nhanh hơn

stargreen1001
07-07-2010, 02:48 AM
Chào mọi người!
Mình xác định tốc độ động cơ DC như sau : đọc xung encoder phát ra cứ mỗi 1ms một lần, dùng timer0, từ số xung đó xác định tốc độ hiện tại của động cơ. Chương trình viết bằng mplab và chạy tốt nhưng có một nhược điểm lớn như sau:vì xung đọc về chỉ toàn là số nguyên (tất nhiên ko thể có phần thập phân) nên về bản chất của giải thuật trên cho ra một tốc độ động cơ ko thể nào chính xác được. Sai số sẽ rất lớn nếu hệ số nhân vào để quy đổi từ số xung ra tốc độ thực càng lớn.
Động cơ của mình ở tốc độ tối đa đếm được 6 xung/1ms (quy đổi 3336 vòng/phút). Ở các tốc độ thấp hơn thì số xung chỉ có thể là 5 ,4,3,2,1 hoặc 0 và tương ứng nếu thể hiện ra led 7 đoạn thì dù động cơ quay như thế nào đi nữa thì cũng chỉ có 7 giá trị tốc độ đó. Chưa kể đến việc nếu chạy ở tốc độ thấp, trong vòng 1ms mà chưa tạo ra hoàn thiện 1 xung thì kết quả là 0 vòng/phút.
Cho mình hỏi, có cách naò để việc đọc tốc độ chính xác hơn không ?( mà không phải tăng thời gian lấy mẫu).
Một câu hỏi thêm : việc thực hiện các phép nhân các số thập phân dùng asm như thế nào? (có chương trình con luôn thì tốt quá!)
Cảm ơn mọi người.

mình cũng đang kẹt cái chỗ này, mình đã thử dùng nhiều phương án, nhưng sai số rất lớn:
các phương án của mình đã làm thử là : đo số xung trong một thời gian lấy mẫu (bị sai số), tính thời gian giữa hai xung cạnh lên, tính thời gian giữa một vòng quay( cái này thì khi quay chậm thì cập nhật chậm, quay nhanh thì cập nhật nhanh) nhưng mà cái nào cũng có sai số hết, giờ mình cũng khônng biết làm sao nữa, có cao nhân nào chỉ mình cách giải thuật cho chính xác không???, encoder của mình có 100xung/vòng, là loại tương đối (1 vòng lỗ, ko có lỗ xác định một vòng quay luôn) động cơ mình dùng là loại động cơ dc nhỏ, mình cũng có ý định dùng thuật toán pid để điều khiển tốc độ, ai giúp mình cái, thank nhiều nhiều