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

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 12-05-2009, 08:48 AM   #5
cuongthinh
Đệ tử 2 túi
 
Tham gia ngày: Jan 2007
Bài gửi: 34
:
Em lập trình cho mạch trên như sau:
Trích:

//Dung thach anh ngoai 10MHz

#include <p30f4011.h>
#include <dsp.h>
_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);
//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh
#define PWM_PORT PORTE //Cac tin hieu PWM nam o cong E
#define PWM_TRIS TRISE //Thanh ghi 3 trang thai cho cac tin hieu PWM
#define PWM_LAT LATE //Thanh ghi chot cac tin hieu PWM
#define Fcy 2000000 //Tan so thuc thi lenh 20Mbps
#define Fpwm 20000 //Tan so PWM = 20 kHz
//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_MCPWM(void);
void Init_AN0(void);
void Init_AN1(void);
void Init_AN2(void);
void PID_Init(float kp,float ki,float kd,float refer,fractional measu);
void Init_TMR1 (void);
void Init_TMR2 (void);
void Init_TMR3 (void);

//Khai bao cac bien
int count0, count1, count2, n;
fractional Vo, Iac, Vavg, Vpi, sum, Iref, Vcom, Vac;
tPID fooPID;

fractional abcCoefficient[3] __attribute__ ((section (".xbss, bss, xmemory")));
fractional controlHistory[3] __attribute__ ((section (".ybss, bss, ymemory")));
fractional kCoeffs[] = {0,0,0};

int main (void) {
Init_PORTS();
Init_MCPWM();
Init_TMR1();
Init_TMR2();
Init_TMR3();
if (count2==4){
Init_AN2();
PID_Init(27,0.04211,0,1,Vo); // V_refer = 1V
Vpi = fooPID.controlOutput;
}
if (count0==2){
Init_AN0();
sum = sum+ADCBUF0;
Iref = 0x1999 * Vpi * Vcom * Vac;
}
if (count1==2){
Init_AN1();
PID_Init(27,0.04211,0,Iref,Iac); // V_refer = Iref
PDC1 = (unsigned int)(Fract2Float(fooPID.controlOutput) * PTPER *2);
}
if (n==100){
Vavg = sum/n;
Vcom = 1/(Vavg*Vavg);
n=0;
}
while(1);
}

void Init_AN0(void) {
ADCON1 = 0; //Tat Module ADC
ADPCFG = 0xFFF8; //Cac chan khac la digital, chan AN0, AN1, AN2 la analog
ADCON1 = 0x02E0; //auto convert
//Dinh dang du lieu ra Q15
ADCON2 = 0;
ADCHS = 0; //Kenh 0 doc tin hieu giua AN2 va AVss
ADCSSL = 0; //Khong quet cac ngo vao
ADCON3 = 0x0103; //Dung 1 TAD cho lay mau, dung clock he thong,
//TAD = 2xTcy = 100 ns
_ADIF = 0; //Xoa co ngat ADC
_ADIE = 0; //Khong Cho phep ngat ADC
_ADON = 1; //Bat module ADC
while (_DONE == 0) Nop();
Vac = ADCBUF0;
}

//Chuong trinh con khoi tao module chuyen doi A/D, doc ngo vao AN1, phan hoi tin hieu Iac
//Tan so trich mau 2khz

void Init_AN1(void) {
ADCON1 = 0;
ADPCFG = 0xFFF8; //Cac chan khac la digital, chan AN0, AN1, AN2 la analog
ADCON1 = 0x02E0, //auto convert
//Dinh dang du lieu ra Q15
ADCON2 = 0;
ADCHS = 0x0001; //Kenh 0 doc tin hieu giua AN1 va AVss
ADCSSL = 0; //Khong quet cac ngo vao
ADCON3 = 0x0103; //Dung 1 TAD cho lay mau, dung clock he thong,
//TAD = 2xTcy = 100 ns
_ADIF = 0; //Xoa co ngat ADC
_ADIE = 1; //Khong cho phep ngat ADC
_ADON = 1; //Bat module ADC
_ASAM = 1; //Khoi dong che do tu dong lay mau
while (_DONE==0) Nop();
Iac = ADCBUF0;
}
//Chuong trinh con khoi tao module chuyen doi A/D, doc ngo vao AN2, Phan hoi Vo
//Tan so trich mau 10Hz
void Init_AN2(void) {
_ADON = 0;
ADPCFG = 0xFFF8; //Cac chan khac la digital, chan AN0, AN1, AN2 la analog
ADCON1 = 0x02E0; //Auto convert
//Dinh dang du lieu ra Q15
ADCON2 = 0;
ADCHS = 0x0002; //Kenh 0 doc tin hieu giua AN2 va AVss
ADCSSL = 0; //Khong quet cac ngo vao
ADCON3 = 0x0103; //Dung 1 TAD cho lay mau, dung clock he thong,
//TAD = 2xTcy = 100 ns
_ADIF = 0; //Xoa co ngat ADC
_ADIE = 0; //Khong cho phep ngat ADC
_ADON = 1; //Bat module ADC
_ASAM = 1; //Khoi dong che do tu dong lay mau
while(_DONE==0) Nop();
Vo = ADCBUF0;
}

//Chuong trinh con khoi tao cac PORT
void Init_PORTS( void )
{
LATB = 0x0000; // Xoa cong B
TRISB = 0x0007; // RB0 to RB2 are input ports

LATC = 0x0000; // Xoa cong C
TRISC = 0x0000; // Cong C la ngo ra

LATD = 0x0000; // Xoa cong D
TRISD = 0xD70F; // Cong D la ngo ra

LATE = 0x0000; // Xoa cong E
TRISE = 0x0001; // RE0 la ngo ra

LATF = 0x0000; // Xoa cong F
TRISF = 0x0000; // Cong F la ngo ra
}
//Chuong trinh con khoi tao Timer o muc xung 20 Mips
//Timer1 dieu khien trich mau cho AN0 (phan hoi Vac voi tan so 10kHz)
void Init_TMR1(void) {
TMR1 = 0; //Xoa so dem trong TMR1
PR1 = 1000; //Nguong tran la 0.05ms (cu 2 xung thi trich mau mot lan)
_T1IF = 0; //Xoa co ngat cua Timer 1
T1CON = 0x8000; //Dung fcy lam clock, prescale = 1:1, bat Timer 1
_T1IE = 1; //Cho phep ngat Timer 1
}
//Timer2 dieu khien trich mau AN1 (Phan hoi Iac voi tan so 2kHz)
void Init_TMR2(void) {
TMR2 = 0; //Xoa so dem trong TMR2
PR2 = 5000; //Nguong tran la 0.25ms (2 xung trich mau mot lan )
_T2IF = 0; //Xoa co ngat cua Timer 2
T2CON = 0x8000; //Dung fcy lam clock, prescale = 1:1, bat Timer 2
_T2IE = 1; //Cho phep ngat Timer 2
}
//Timer3 dieu khien trich mau AN2 (Phan hoi Iac voi tan so 100Hz)
void Init_TMR3(void) {
TMR3 = 0; //Xoa so dem trong TMR3
PR3 = 50000; //Nguong tran la 2,5ms (4 xung trich mau mot lan)
_T3IF = 0; //Xoa co ngat cua Timer 3
T3CON = 0x8000; //Dung fcy lam clock, prescale = 1:1, bat Timer 3
_T3IE = 1; //Cho phep ngat Timer 3
}

//Chuong trinh con khoi tao module PWM
void Init_MCPWM(void) {
PTPER = Fcy/Fpwm - 1; //Dat thanh ghi chu ky voi tan so PWM = 20 kHz
SEVTCMP = PTPER;
PWMCON1 = 0x070F; //Chi dung cac chan PxL, mot cach doc lap
OVDCON = 0xFF00; //Khong dung overdrive
PDC1 = 1000; //Dat duty = 50% cho chu ki dau tien
PTCON = 0x8000; //Kich hoat module PWM
}

//Chuong trinh con khoi tao khoi PI
void PID_Init(float kp,float ki,float kd,float refer, fractional measu)
{
fooPID.abcCoefficients = &abcCoefficient[0]; /*Set up pointer to derived coefficients */
fooPID.controlHistory = &controlHistory[0]; /*Set up pointer to controller history samples */
PIDInit(&fooPID); /*Clear the controler history and the controller output */
kCoeffs[0] = Q15(kp);
kCoeffs[1] = Q15(ki);
kCoeffs[2] = Q15(kd);
PIDCoeffCalc(&kCoeffs[0], &fooPID); /*Derive the a,b, & c coefficients from the Kp, Ki & Kd */
fooPID.controlReference = Q15(refer) ;
fooPID.measuredOutput = measu ;
PID(&fooPID); // Thuc hien tinh toan
}

//Chuong trinh xu ly ngat Timer 1
void _ISR _T1Interrupt(void) {
_T1IF = 0; //Xoa co ngat
if (count0==3) count0=1;
else count0 = count0 + 1;
}

//Chuong trinh xu ly ngat Timer 2
void _ISR _T2Interrupt(void) {
_T2IF = 0; //Xoa co ngat
if (count1==3) count1=1;
else count1 = count1 + 1;
}

//Chuong trinh xu ly ngat Timer 3
void _ISR _T3Interrupt(void)
{
_T3IF = 0; //Xoa co ngat
if (count2==5) count2=1;
else count2 = count2 + 1;
}
Em dùng 3 timer để tạo tần số gọi chương trình ADC. Khi em dịch chương trình thấy báo lỗi như sau
Trích:
main.o(.text+0x70): In function `main':
E:\PFC Toan\Chuong trinh\main.c:56: undefined reference to `Fract2Float'
main.o(.text+0x224): In function `PID_Init':
E:\PFC Toan\Chuong trinh\main.c:182: undefined reference to `PIDInit'
main.o(.text+0x2d2):E:\PFC Toan\Chuong trinh\main.c:186: undefined reference to `PIDCoeffCalc'
main.o(.text+0x314):E:\PFC Toan\Chuong trinh\main.c:189: undefined reference to `PID'
Link step failed.
Em kô hiểu tại sao lại báo lỗi phần hàm PID như thế, tại sao lại kô sử dung được `Fract2Float'.
Cách anh làm ơn giúp em với
File Kèm Theo
File Type: rar main.rar (2.1 KB, 14 lần tải)

thay đổi nội dung bởi: cuongthinh, 12-05-2009 lúc 08:59 AM.
cuongthinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


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:02 PM.


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