help !!!!lập trình tính tốc độ động cơ từ xung encoder sử dụng ngắt timer.

phaplebk09

Trứng gà
nhờ anh chị giúp zùm em với .Lập trình tính tốc độ động dùng pic

---
2DEATH:

Bài viết của em quá ngắn, lại còn viết không đúng tiếng Việt (đây là diễn đàn học thuật, khi mình đặt câu hỏi nhờ giúp đỡ nên viết nghiêm chỉnh, đàng hoàng, thì mới thể hiện được sự tôn trọng đối với người đọc câu hỏi này, và người có ý định trả lời giúp em).

Khi nhờ giúp 1 vấn đề gì, em nên trình bày rõ là em đã làm gì, tìm hiểu được gì, còn trục trặc phần nào thì mọi người mới có thể giúp em.
Bài viết như thế này sẽ có nhiều người đọc và sẽ cảm thấy là không thích trả lời, như vậy em sẽ không có được sự giúp đỡ của các bạn trên diễn đàn.
 

IceSandwich

Thành Viên PIF
Trên PIC có chân ngắt ngoài, bạn có thể dùng nó để đọc xung từ encoder rồi dùng timer để suy ra vận tốc của động cơ.

Nếu như dùng timer thì bạn có thể set timer0 chế độ counter rồi đếm xung encoder, chân còn lại encoder nối vô chân IO bất kì để biết chiều quay của động cơ. Sau đó dùng timer1 set khoảng thời gian định trước rồi đọc số xung do timer0 đếm được => vận tốc động cơ.

Nếu được bạn nghiên cứu thêm giải thuật PID thì sẽ hay hơn :)
 

supergoodfriends

Trứng gà
Tính Vận tốc động cơ

Vấn đề của bạn bao gồm 2 phần sau:
Thứ nhất: Đọc được xung từ encoder, biết được chiều quay của encoder.
Thứ hai: Tính toán vận tốc của động cơ dựa vào encoder đó.

1. Đọc xung từ encoder:
Ở đây mình dùng ví dụ bạn dùng encoder có 2 kênh đó là A,B (còn A,B là gì thì bạn chịu khó đọc ở link hocavr ở trên).

Kết nối phần cứng:
-1 chân ngắt ngoài của PIC nối vào kênh A (hoặc B).
-1 chân I/O của PIC nối vào kênh còn lại.(config cho nó là INPUT) -gọi là chân DIR (hướng)

Phần mềm:
-Kích hoạt chức năng ngắt ngoài của PIC trên chân đó.
-Trong chương trình xử lý ngắt: bạn kiểm tra xem chân DIR nó là 0 thì tăng biến đếm encoder lên 1, bằng 1 thì giảm biến đếm encoder xuống 1, hoặc ngược lại cũng được.
Code:
void interrupt_isr(void) 
{  
        Motor_EncoderDir = PIND.4;  //PIND.4 là đọc giá trị từ chân D.4     
        if(!Motor_EncoderDir) MotorEncoder++; 
        else MotorEncoder--;

//MotorEncoder: tổng số xung encoder đã đếm được
}
Trên là một ví dụ về xử lý ngắt ngoài.

Tiếp theo là phần tính toán vận tốc cho động cơ:

Ta dùng công thức: vận tốc = quãng đường/ thời gian.
vận tốc: vòng/s
quãng đường: số vòng quay được.
thời gian: thời gian lấy mẫu để tính vận tốc.

Mình sẽ giải quyết vấn đề thời gian trước.
Dùng một timer cho chạy khoảng 20ms thì xảy ra ngắt một lần (cách làm thế nào thì bạn xem các phần hướng dẫn khác có trong diễn đàn nhé).

Trong chuơng trình xử lý ngắt timer mình sẽ làm những việc sau:
-Tính quãng đường động cơ đã quay được.
-Tính vận tốc của động cơ. (vòng /s)
-Reset encoder.
Code:
void timer_isr()
{
Motor_Velocity    = ((float)MotorEncoder/X) / 20*1000;
      //MotorEncoder/X:quãng đường
     //X là số xung encoder, vs ti lệ dongco:encoder =1:1
    // tức là khi quay 1 vòng động cơ thì encoder cũng quay 1 vòng.
   // van toc = quang duong chia thoi gian, vi la 20ms nen nhân 1000 doi ra giay(s).

MotorEncoder = 0; //reset lại trước khi tính lần tiếp theo.
}
Thế là xong.
 
Top