PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

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

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 01-01-2009, 07:46 PM   #1
nvtri
Nhập môn đệ tử
 
Tham gia ngày: Jun 2008
Bài gửi: 9
:
Question Giải thích code cho dsPIC

Code:
unsigned char InData[] = {"000000"};
unsigned char OutData[] = {"Speed = 00000 rpm\r\n"};
void SendSpeed()
{
unsigned int k;
unsigned char c;
   
   k = SPEEDMULT/timer3avg;
   c = k/10000;
   if (c > 0)
      k = k - c*10000;
   OutData[OFFSET] = (c + 0x30);
   c = k/1000;
   if (c > 0)
      k = k - c*1000;
   OutData[OFFSET+1] = (c + 0x30);
   c = k/100;
   if (c > 0)
      k = k - c*100;
   OutData[OFFSET+2] = (c + 0x30);
   c = k/10;
   if (c > 0)
      k = k - c*10;
   OutData[OFFSET+3] = (c + 0x30);
   OutData[OFFSET+4] = (char)(k + 0x30);
   TXPtr = &OutData[0];
   SendMsg();
   Flags.CalSpeed = 0;
}
trong đó với SPEEDMULT là 4, timer3avg là giá trị đọc từ timer3
Mình chưa hiểu rõ đoạn code trên gửi giá trị vận tốc động cơ như thế nào, mong anh Nam và mọi người giải thích giúp mình ý nghĩa đoạn code này.

thay đổi nội dung bởi: namqn, 01-01-2009 lúc 08:17 PM.
nvtri vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-01-2009, 08:26 PM   #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
Giả sử k là tốc độ tính bằng rpm, đoạn code trên chỉ chuyển giá trị của k thành một chuỗi ký tự ASCII và đặt vào vị trí tương ứng ("00000") trong bộ đệm OutData[] để được truyền đi.

Vì k là một số 16-bit, nên nó chỉ mang giá trị tối đa là 65535, tức là có tối đa 5 chữ số thập phân. Đoạn code trên chỉ lần lượt tách các chữ số hàng chục ngàn, hàng ngàn, hàng trăm, hàng chục, và hàng đơn vị để đưa vào bộ đệm OutData[].

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-01-2009, 09:28 PM   #3
nvtri
Nhập môn đệ tử
 
Tham gia ngày: Jun 2008
Bài gửi: 9
:
Giải thích code cho dsPIC

Cảm ơn anh Nam, em đã hiểu cách gửi dữ liệu của đoạn code trên rồi, nhưng em còn thắc mắc một số vấn đề sau:
+)Thứ nhất: SPEEDMULT=60*(Fcy/256); // sẽ bằng 2343750 với Fcy=10 Mhz
k=SPEEDMULT/timer3avg;
Thì sao k có vận tốc là (vòng/phút), mong anh giải thích, cái này em xem trong code của microchip về điều khiển động cơ BLDC. (lúc nãy em post lộn SPEEDMULT=4).
+)Thứ nhì: Số 0x30 là bắt đầu của vùng nhớ nào?
nvtri vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-01-2009, 11:00 PM   #4
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 nvtri View Post
Cảm ơn anh Nam, em đã hiểu cách gửi dữ liệu của đoạn code trên rồi, nhưng em còn thắc mắc một số vấn đề sau:
+)Thứ nhất: SPEEDMULT=60*(Fcy/256); // sẽ bằng 2343750 với Fcy=10 Mhz
k=SPEEDMULT/timer3avg;
Thì sao k có vận tốc là (vòng/phút), mong anh giải thích, cái này em xem trong code của microchip về điều khiển động cơ BLDC. (lúc nãy em post lộn SPEEDMULT=4).
+)Thứ nhì: Số 0x30 là bắt đầu của vùng nhớ nào?
Thứ nhất: Tôi cũng không rõ vì sao k tính bằng vòng/phút, vì bạn không cho biết người ta tính timer3avg ra sao. Do đó, tôi chỉ giả sử rằng k tính bằng vòng/phút, dựa vào cách tổ chức thông điệp trong bộ đệm OutData[] (có cụm từ "rpm").

Thứ hai: 0x30 là mã ASCII của ký tự '0'. Nếu bạn tính ra giá trị của chữ số thập phân là x, thì x + 0x30 sẽ chuyển nó thành ký tự tương ứng với giá trị của x. Ví dụ, x = 5 thì x + 0x30 sẽ cho bạn ký tự '5', có thể hiển thị được trên các màn hình sử dụng mã ASCII.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-01-2009, 12:44 PM   #5
nvtri
Nhập môn đệ tử
 
Tham gia ngày: Jun 2008
Bài gửi: 9
:
Giải thích code cho dsPIC

Cảm ơn anh Nam và mong anh tiếp tục đọc chủ đề của em
Cách tính giá trị timer3avg như sau:
Code:
 #define INDEX 1
 #define POLEPAIRS   5   // động cơ BLDC có 5 cặp cực
 unsigned int HallValue;
 unsigned int timer3value;
 unsigned int timer3avg;
 unsigned char polecount; // dùng để đếm số cặp cực
 
   if (HallValue == INDEX)  // has the same position been sensed?
      if (polecount++ == POLEPAIRS)   //has one mech rev elasped?
      {                        // yes then read timer 3
      timer3value = TMR3;
      TMR3 = 0;
      timer3avg = ((timer3avg + timer3value) >> 1);
      polecount = 1;
      }
Em khai báo chỉ số INDEX là 1 để chỉ vị trí đầu tiên của cảm biến Hall, lệnh if thứ hai là để xem động cơ quay được 1 vòng hay chưa (đếm đủ 5 cặp cực tương ứng cho 1 vòng). Sau đó đọc giá trị của Timer3. Tóm lại, đoạn code trên là đọc giá trị Timer3 sau mỗi lần động cơ quay được một vòng.
Trong đó, với module Timer3 em khởi tạo như sau:
Code:
void InitTMR3(void)
{
   T3CON = 0x0030;         // internal Tcy/256 clock
   TMR3 = 0;
   PR3 = 0xFFFF;
}
Tần số thực thi lệnh Fcy = 10 Mhz
Cho em hỏi thêm: Với cấu hình thanh ghi T3CON = 0x0030 thì thanh ghi TMR3 tăng lên một đơn vị sẽ tốn 256 chu kì lệnh?

thay đổi nội dung bởi: namqn, 02-01-2009 lúc 05:41 PM.
nvtri vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-01-2009, 05:49 PM   #6
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
Như vậy, Timer 3 sẽ đo thời gian của một vòng quay của trục động cơ. Gọi count_TMR3 là số đếm của Timer 3 tương ứng với một vòng quay. Tốc độ của động cơ được tính như sau:

Tốc độ = 1/(count_TMR3*256*Tcy) (vòng/giây) = 60/(count_TMR3*256*Tcy) (vòng/phút)

Với Tcy là thời gian của một chu kỳ thực thi lệnh (Tcy = 1/Fcy), và Timer 3 chỉ tăng một đơn vị sau mỗi 256 Tcy vì bạn thiết lập T3CON = 0x0030.

Như vậy,

Tốc độ = 60/(count_TMR3*256/Fcy) = (60*Fcy/256)/(count_TMR3) (vòng/phút)

Với Fcy = 10 MHz = 10^7,

Tốc độ = 2343750/(count_TMR3) (vòng/phút)

Đây là công thức đã được dùng trong đoạn code mẫu của AN957.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-01-2009, 10:44 PM   #7
love_ac
Đệ tử 4 túi
 
Tham gia ngày: Apr 2008
Nơi Cư Ngụ: Hanoi
Bài gửi: 78
:
--về điều khiển BLDC thì mình chưa làm nên sẽ vẫn nhờ anh Nam giúp cho câu thứ nhất
--Còn câu thứ hai của bạn thì :0x30 không phải là nói đến vùng nhớ,mà nó chỉ là sự hiệu chỉnh thành mã ASCII thôi.Bạn không hiểu mã ascii à.
love_ac vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-06-2011, 10:48 AM   #8
denhutech
Nhập môn đệ tử
 
Tham gia ngày: Jan 2010
Bài gửi: 1
:
ban nvtri hien minh dang lam do an tot nghep ve dong co BLDC ma chua goi toc do len duoc ban cho minh xin doan code cua ban dc ko.thank mail cua minh tiengchuong_tinh89@yahoo.com
denhutech 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à 11:06 AM.


Đượ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