
Em đang lập trình dsp30F4011 để thực hiện mạch này. Hiện em đang có một số vướng mắc này mong các anh chỉ giáo ạ:
- Em dung 3 cái ADC:
+ AN2 để phản hồi điện áp ra Vo (tần số trích mẫu 100Hz),
+ AN0 để phản hồi điện áp sau chỉnh lưu Vac (và tính điện áp trung bình của Vac),
+ AN1 để phản hồi dòng điện Iac qua cuộn cảm (tần số 2kHz).
Để thực hiện việc trên em dùng 3 cái Timer 1,2,3 để tạo 3 biến đếm tạo tần số trích mẫu cho 3 cái ADC.
Cứ mỗi lần một ADC thực hiện trích mẫu và chuyển đổi xong em gọi hàm tính toán, khâu PI.
Vấn đề của em giờ là em đã lập trình xong rùi mà khi tét thử mạch không chạy. Em đo đầu ra PWM không có xung ra.
Cùng cái mạch cứng của em em đã test thử chương trình trong vidu5 của anh Nam, chạy ngon lành.
Em đang rất băn khoăn, mong các anh giúp em xem qua xem chương trình của em có lỗi gì mà nó kô chịu chạy.
Chương trình của em đây:
//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 Fcy 2000000 //Tan so thuc thi lenh 20Mbps
#define Fpwm 20000 //Tan so PWM = 20 kHz
//Khai bao cac bien
unsigned int count0, count1, count2, n, duty;
float kp, ki, refer;
fractional Vo, Iac, Vavg, Vpi, sum, Iref, Vcom, Vac, measu;
tPID fooPID;
fractional abcCoefficient[3] __attribute__ ((section (".xbss, bss, xmemory")));
fractional controlHistory[3] __attribute__ ((section (".ybss, bss, ymemory")));
fractional kCoeffs[] = {0,0,0};
//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 Init_TMR1 (void);
void Init_TMR2 (void);
void Init_TMR3 (void);
void Init_PI (kp,ki,refer,measu);
int main (void){
Init_PORTS();
Init_MCPWM();
Init_TMR1();
Init_TMR2();
Init_TMR3();
while(1){
if (count2==4){
Init_AN2();
Init_PI(590.6,0.9277,1,Vac);
Vpi = fooPID.controlOutput;
}
if (count0==2){
Init_AN0();
sum = sum+ADCBUF0;
Iref = 2.428571429* Vpi * Vcom * Vac;
}
if (count1==2){
Init_AN1();
Init_PI(4.887,0.614,Iref,Iac); // V_refer = Iref
duty = (unsigned int)(Fract2Float(fooPID.controlOutput) * PTPER *2);
}
if (n==100){
Vavg = sum/n;
Vcom = 1/(Vavg*Vavg);
n=0;
}
}
}
//Chuong trinh con khoi tao module chuyen doi A/D, doc ngo vao AN0, phan hoi tin hieu Vac
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 = duty; //Dat duty = 50% cho chu ki dau tien
PTCON = 0x8000; //Kich hoat module PWM
}
//Chuong trinh con tao khoi PI
void Init_PI (kp,ki,refer,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(0);
PIDCoeffCalc(&kCoeffs[0], &fooPID); /*Derive the a,b, & c coefficients from the Kp, Ki & Kd */
fooPID.controlReference = Q15(refer) ; /*Set the Reference Input for your controller */
fooPID.measuredOutput = measu ;
PID(&fooPID);
}
//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;
}
