View Single Post
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