PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > MPASM

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

MPASM Lập trình bằng hợp ngữ là một việc làm vô cùng vất vả, tuy nhiên, để hiểu và làm việc với vi điều khiển, hợp ngữ trở thành một công cụ khá đắc lực ...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 02-01-2008, 11:48 PM   #1
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
Cách xác định tốc độ động cơ chính xác? Viết bằng Mplab.

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.
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-01-2008, 12:34 AM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi uydanh View Post
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,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263

thay đổi nội dung bởi: namqn, 03-01-2008 lúc 12:43 AM.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-01-2008, 01:39 AM   #3
uydanh
Đệ tử 4 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 79
:
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
uydanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-01-2008, 08:27 AM   #4
sandro_bk
Đệ tử 4 túi
 
sandro_bk's Avatar
 
Tham gia ngày: Jul 2007
Bài gửi: 66
:
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
sandro_bk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-07-2010, 02:48 AM   #5
stargreen1001
Nhập môn đệ tử
 
Tham gia ngày: Mar 2009
Bài gửi: 9
:
Talking

Trích:
Nguyên văn bởi uydanh View Post
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
stargreen1001 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 02:49 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam