Đệ 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
thay đổi nội dung bởi: cuongthinh, 12-05-2009 lúc 08:59 AM.
|