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 02-01-2009, 12:44 PM   #1
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   #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
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 02-01-2009, 08:41 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 làm động cơ chạy rồi, gửi được tốc độ lên máy tính, bây giờ em đang cần gửi tốc độ từ máy tính xuống và động cơ sẽ quay đúng số vòng như vậy? có gì em se hỏi anh tiếp.
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, 08:53 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 làm động cơ chạy rồi, gửi được tốc độ lên máy tính, bây giờ em đang cần gửi tốc độ từ máy tính xuống và động cơ sẽ quay đúng số vòng như vậy? có gì em se hỏi anh tiếp.
Dưới bài viết của các thành viên đều có nút "Cảm ơn" để bạn thể hiện lòng biết ơn với một bài viết có ích cho bạn. Diễn đàn cũng có quy định là nếu chỉ muốn cám ơn bài viết thì dùng nút này thay cho việc viết một bài cảm ơn không có nội dung.

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 03-01-2009, 12:53 AM   #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

Đây là đoạn code để PIC nhận dữ liệu từ máy tính (từ VB truyền xuống)
Code:
float Kps=0; 
float Kis=0; 
float Kds=0; 
unsigned char InData[]
void getvalue()
{
   char hs_vel[4];   // vận tốc là số có 4 chữ số
   int len_vel;
   char hs_kp[8];    // hệ số Kp là số có 8 chữ số
   int len_kp;
   char hs_ki[8];    // 8 chữ số
   int len_ki;
   char hs_kd[8];  // 8 chữ số
   int len_kd;
   unsigned char InData[28];  // tổng cộng chuỗi có 28 chữ số
   int i;
     for (i=0;i<28;i++)
      InData[i]=getc();
      
   for (len_vel=0;len_vel<4;len_vel++)
   {   
      hs_vel[len_vel]=InData[len_vel];
      //putc(hs_vel[len_vel]);
   }   
   for (len_kp=0;len_kp<8;len_kp++)
   {  
     hs_kp[len_kp]=InData[len_kp+4];
     //putc(hs_kp[len_kp]); 
   }
   for (len_ki=0;len_ki<8;len_ki++)
   {   
      hs_ki[len_ki]=InData[len_ki+12];
      //putc(hs_ki[len_ki]);
   }      
   for (len_kd=0;len_kd<8;len_kd++)
   {
      hs_kd[len_kd]=InData[len_kd+20];
      //putc(hs_kd[len_kd]);
   }      
   
   DesiredSpeed = atol(hs_vel); //vận tốc yêu cầu
   Kps = atof(hs_kp);
   Kis =  atof(hs_ki);
   Kds = atof(hs_kd);
}
Trong hàm main em gọi hàm getsvalue();
Nhưng khi biên dịch chương trình bị lỗi sau:
c:\program files\microchip\mplab c30\bin\bin\pic30-coff-ld.exe Error: A heap is required, but has not been specified
ClosedLoopSenBLDC.o(.text+0xbe): In function `main':
C:\Documents and Settings\NVTRI_HCMUT\Desktop\ClosedLoop\ClosedLoop SenBLDC.c:131: undefined reference to `getvaule'
Link step failed. // lỗi link step này là gi vậy
BUILD FAILED: Sat Jan 03 12:48:58 2009
Mong anh Nam và mọi người giúp đỡ.

thay đổi nội dung bởi: namqn, 03-01-2009 lúc 01:14 AM.
nvtri vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-01-2009, 01:05 AM   #6
nvtri
Nhập môn đệ tử
 
Tham gia ngày: Jun 2008
Bài gửi: 9
:
Giải thích code cho dsPIC

Trong đó module U2ART được khởi tạo như sau:
Code:
void InitUART(void)
{ 
 U2MODE = 0x8000;
 U2STA = 0x0000;
 U2BRG = ((FCY/16)/BAUD) - 1;   // set baud to 19200
 IEC1bits.U2RXIE = 1;         // enable RX interrupt
 RXPtr = &InData[0];      // con trỏ chỉ đến kí tự đầu tiên trong bộ đệm nhận
 Flags.CheckRX = 0;         // Xóa cờ rx and tx 
 Flags.SendTX = 0;
 U2STAbits.UTXEN = 1;           // Initiate transmission
}
void _ISR _U2TXInterrupt(void)
{
   IFS1bits.U2TXIF = 0;   // xóa cờ ngắt
}

void _ISR _U2RXInterrupt(void)
{
   IFS1bits.U2RXIF = 0;   //xóa cờ ngắt
   *RXPtr = U2RXREG;
   if (*RXPtr == CR)
      {Flags.CheckRX = 1;RXPtr = &InData[0];}
   else *RXPtr++;
}

thay đổi nội dung bởi: namqn, 03-01-2009 lúc 01:12 AM.
nvtri vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-09-2013, 03:19 AM   #7
untilyou_92
Nhập môn đệ tử
 
Tham gia ngày: Oct 2012
Bài gửi: 6
:
Trích:
Nguyên văn bởi nvtri View Post
Trong đó module U2ART được khởi tạo như sau:
Code:
void InitUART(void)
{ 
 U2MODE = 0x8000;
 U2STA = 0x0000;
 U2BRG = ((FCY/16)/BAUD) - 1;   // set baud to 19200
 IEC1bits.U2RXIE = 1;         // enable RX interrupt
 RXPtr = &InData[0];      // con trỏ chỉ đến kí tự đầu tiên trong bộ đệm nhận
 Flags.CheckRX = 0;         // Xóa cờ rx and tx 
 Flags.SendTX = 0;
 U2STAbits.UTXEN = 1;           // Initiate transmission
}
void _ISR _U2TXInterrupt(void)
{
   IFS1bits.U2TXIF = 0;   // xóa cờ ngắt
}

void _ISR _U2RXInterrupt(void)
{
   IFS1bits.U2RXIF = 0;   //xóa cờ ngắt
   *RXPtr = U2RXREG;
   if (*RXPtr == CR)
      {Flags.CheckRX = 1;RXPtr = &InData[0];}
   else *RXPtr++;
}
nvtri mình cũng đang làm đồ án về điều khiển động cơ BLCD giao tiếp PC bạn có thể gửi cho mình project của bạn đc k!! mail của mình nguyenvanthangk55@gmail.com thank bạn trước
untilyou_92 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-01-2009, 01:19 AM   #8
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
Đây là đoạn code để PIC nhận dữ liệu từ máy tính (từ VB truyền xuống)
...
Trong hàm main em gọi hàm getsvalue();
Nhưng khi biên dịch chương trình bị lỗi sau:
c:\program files\microchip\mplab c30\bin\bin\pic30-coff-ld.exe Error: A heap is required, but has not been specified
ClosedLoopSenBLDC.o(.text+0xbe): In function `main':
C:\Documents and Settings\NVTRI_HCMUT\Desktop\ClosedLoop\ClosedLoop SenBLDC.c:131: undefined reference to `getvaule'
Link step failed. // lỗi link step này là gi vậy
BUILD FAILED: Sat Jan 03 12:48:58 2009
Mong anh Nam và mọi người giúp đỡ.
Về lỗi liên quan đến heap, bạn xem post #18 của luồng sau: http://www.picvietnam.com/forum/showthread.php?p=2676

Theo tôi, trong main() bạn có gọi đến một hàm tên là getvaule(), vốn là một lỗi đánh máy (vì bạn chỉ định nghĩa hàm getvalue()), cho nên mới nhận được thông báo lỗi về tham chiếu chưa được định nghĩa.

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
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à 03:37 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