![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| 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 |
![]() |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
|
|
#1 |
|
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? |
|
|
|
|
|
#2 | |
|
Trưởng lão PIC bang
|
Trích:
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 |
|
|
|
|
|
|
#3 |
|
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;
}
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;
}
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. |
|
|
|
|
|
#4 |
|
Trưởng lão PIC bang
|
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 |
|
|
|
|
|
#5 |
|
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.
|
|
|
|
|
|
#6 | |
|
Trưởng lão PIC bang
|
Trích:
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 |
|
|
|
|
|
|
#7 |
|
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);
}
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. |
|
|
|
![]() |
|
|