![]() |
|
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 |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
Cứu em phần lập trình Mạch PFC!
![]() Em đang làm mạch này mà lập trình mãi nó vẫn không chạy cho. Một tuần nữa em phải bảo vệ tốt nghiệp về cái này rồi mà kô tìm ra lỗi ở đâu! Mong các cao thủ giúp em với? Chân PWM ra của em đã có xung ra nhưng kô đúng theo ý muốn em cũng kô hiểu tại sao nữa, hic Chương trình của em đây: Code:
#include <p30f4011.h> #include <dsp.h> #include <math.h> _FOSC(CSW_FSCM_OFF & FRC_PLL16); _FWDT(WDT_OFF); _FBORPOR(PBOR_OFF & MCLR_EN); _FGS(CODE_PROT_OFF); //------------------------------------------------------------------------------ //Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh) #define Fcy 32000000 //Tan so thuc thi lenh #define Fpwm 40000 //Tan so PWM = 40 kHz #define vOutmax Q15(0.9) #define vOutmin Q15(0.1) #define iOutmax Q15(0.9) #define iOutmin Q15(0.1) //Cac prototype cho cac chuong trinh con void Init_PORTS(void); void Init_MCPWM(void); void Init_ADC10(void); void CalciPI( fractional iInRef, fractional iInMeas); void CalcvPI( fractional vInRef, fractional vInMeas); void InitiPI(void); void InitvPI(void); //Cac bien toan cuc fractional Vo,Vac,Iac,Vcom,vPI,Iref,Vavg; fractional iSum, iExc, iErr; fractional vSum, vExc, vErr; fractional iU, iOut, vU, vOut; int n,m,k; unsigned int duty; //------------------------------------------------------------------------------ //Chuong trinh chinh int main(void) { void InitvPI(); void InitvPI(); Init_PORTS(); //Khoi tao cac cong I/O Init_MCPWM(); //Khoi tao module PWM Init_ADC10(); while(1) Nop(); } //Chuong trinh con khoi tao cac cong I/O, de xuat cac tin hieu PWM, va doc tin //hieu dieu chinh cua bien tro tai AN0 void Init_PORTS(void) { LATE = 0; //Xoa thanh ghi chot cac tin hieu PWM TRISE = 0; //Tin hieu PWM nam tai RE0 TRISB = 0x0007; //RB0 den RB2 la ngo vao, cac chan RB khac la ngo ra } //Chuong trinh con khoi tao module chuyen doi A/D // AN0 phan hoi Vac, AN1 phan hoi Iac, AN2 phan hoi Vo void Init_ADC10(void) { ADPCFG = 0b1111111111111000; // RB0,RB1,RB2 = analog input ADCON1 = 0b0000001001101100; // SIMSAM bit = 1 implies ... // simultaneous sampling // ASAM = 1 for auto sample after convert // SSRC = 011 for PWM trigger // integer output ADCSSL=0x0007; // Lan luot quét ANO, AN1, AN2 kéet qua lan luot luu vao ADCBUF0->2 ADCON3 = 0x0302; // Auto Sampling 3 Tad, Tad = internal 2 Tcy ADCON2 = 0b0000010000001000; // CHPS= 00 Convert CHO // SMPI = 0010 for interrupt after 3 converts // CSCNA=1 scan input ADCHS=0; _ADIF = 0; //Xoa co ngat ADC _ADIE = 1; //Cho phep ngat ADC _ASAM = 1; //Khoi dong che do tu dong lay mau ADCON1bits.ADON = 1; // turn ADC ON } //Chuong trinh con khoi tao module PWM void Init_MCPWM(void) { PTPER = Fcy/Fpwm-1; //Dat thanh ghi chu ky voi tan so PWM = 40 kHz SEVTCMP = PTPER; PWMCON1 = 0x070F; //Chi dung cac chan PxL, mot cach doc lap OVDCON = 0xFF00; //Khong dung overdrive PDC1 = 200; //Khoi tao PWM1, 2, va 3 la 25% PWMCON2 = 0x0F00; //Postscale = 1:10 PTCON = 0x8000; //Kich hoat module PWM } void CalciPI( fractional iInRef, fractional iInMeas) { iErr = iInRef - iInMeas; iU = iSum + Q15(8.174) * iErr; //kpz = 8.174 = 0.00025 fraction if( iU > iOutmax ) iOut = iOutmax; else { if( iU < iOutmin ) iOut = iOutmin; else iOut = iU ; } iSum = iSum + Q15(4.266)*iErr; //kiz = 4.266 = 0.00013 fraction } void CalcvPI( fractional vInRef, fractional vInMeas) { vErr = vInRef - vInMeas; vU = vSum + Q15(49.36) * vErr; //kpz = 49.36 = 0.0015 fraction if( vU > vOutmax ) vOut = vOutmax; else { if( vU < vOutmin ) vOut = vOutmin; else vOut = vU ; } vSum = vSum + Q15(48.0)*vErr; //kiz = 48 = 0.001465 fraction } void InitvPI(void) { vSum = 0; vOut = 0; } void InitiPI(void) { iSum = 0; iOut = 0; n = 0; k = 0; } //Trinh phuc vu ngat cho ADC void __attribute__((__interrupt__ , auto_psv)) _ADCInterrupt(void) { Vac = ADCBUF0; //4kHz Vavg = Vavg + Vac; if (k=40) { Vcom = Q15(1)/(Vavg*Vavg); k = 0; } else (k++); if (n=40) Vo = ADCBUF2; // tao bien dem de duoc Vac voi tan so 100Hz (ADC trich mau voi tan so 4kHz) else (n++) ; CalcvPI(Q15(1),Vo); // V_refer = 1V , Tinh toan khau PI ap vPI = vOut; // Tin hieu ra khau PI ap Iref = vPI*Vcom*Vac*Q15(2.4); //Voi km=2.4 Iac = ADCBUF1; // Iac voi tan so 4kHz (ADC trich mau voi tan so 4kHz) CalciPI(Iref,Iac); // Tinh toan Pi dong // dai luon tham chieu la Iref // Tin hieu phan hoi la Iac PDC1 = (unsigned int)((iOut*32768)*2*PTPER); ;// Update thanh ghi chu ki nhiem vu _ADIF = 0; } thay đổi nội dung bởi: namqn, 02-06-2009 lúc 07:13 PM. Lý do: định dạng code |
![]() |
![]() |
![]() |
#2 | |
Đệ tử 5 túi
Tham gia ngày: Sep 2007
Bài gửi: 94
: |
Trích:
Về phần code của bạn, bạn nên đọc lại phần ADC , bạn chọn AN0-AN2 như vậy là không đúng, để thực hiện việc quét kênh bạn phải chọn các kênh CH0,CH1,CH2,CH3, như vậy bạn đã chưa chọn các kênh cho tín hiệu, tôi khuyên bạn nên xem application note về PFC sau: http://www.microchip.com/stellent/id...pnote=en531747 Nó thực sự có ích với bạn đó, từ cách tính hàm PI, không phải ngẫu nhiên mà họ lại viết bằng ASM, họ viết như vậy để tiết kiệm thời gian tính toán lại , code ASM không có gì khó hiẻu cả,trong hàm PFC.s và hàm PI.s hầu như bạn không phải thay đổi gì cả, bạn nên đọc phần nhúng ASM va C như thế nào là được, cốt nhất là bạn phải hiểu bản chất của vấn đề. Tôi đã làm PFC này rồi và lấy nguyên 2 file PFC.s và PI.s và chỉnh sửa lại code một chút cho đúng phần cứng kết quả chạy khá ổn. |
|
![]() |
![]() |
![]() |
#3 |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
Mạch cứng của em đây:
![]() ![]() Em đã đọc code mẫu của nó rồi, vấn đề là em chưa hiẻu đc bộ thông số này: .equ pfcMaxDuty, 320 ; Saturate the maximum duty cycle value .equ voltMinRef, 200 ; Corresponds to 40V reference .equ pfcVoltKp, 30000 ; Kp for voltage compensator .equ pfcVoltKi, 1600 ; Ki for voltage compensator .equ pfcVoltKc, 107 ; Kc for voltage compensator .equ pfcVoltOutMax, 32767 ; Maximum Value for VPI output .equ pfcVoltOutMin, 0 ; Minimum Value for VPI output .equ VdcRef, 28736 ; Vdc Output Reference corresponds to 400 volt .equ pfcCurrKp, 1200 ; Kp for current compensator .equ pfcCurrKi, 7000 ; Ki for current compensator .equ pfcCurrKc, 50 ; Kc for current compensator .equ pfcCurrOutMax, 32767 ; Maximum Value for IPI output .equ pfcCurrOutMin, 800 ; Minimum Value for IPI output .equ MinimumVavg,3000 ; Minimum Value of Vavg .equ DutyScalingFactor, 100 ; Scaling Factor for PWM Duty Cycle .equ AdcConvFactor, 0x8000 ; Factor for scaling the ADC Results .equ SoftStartIncrement, 10 ;Softstart count to slowly rise the DC Bus Voltage .equ Km1, 2 ; Scaling constant .equ Km2, 1 ; Scaling constant Trong đó có nhiều thông số em hiểu nhưng có nhiều cái thì chịu thay đổi nội dung bởi: cuongthinh, 03-06-2009 lúc 08:18 AM. |
![]() |
![]() |
![]() |
#4 |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
He, hỏi xin thì ngại quá nhưng nếu anh tungnh ra tay hải hà có thể cho em tham khảo phần code của anh đc kô? 4 ngày nữa em phải bảo vệ rồi mà chưa có mạch, gấp lắm rồi!
|
![]() |
![]() |
![]() |
#5 | ||
Đệ tử 5 túi
Tham gia ngày: Sep 2007
Bài gửi: 94
: |
Trích:
Trích:
Bạn đọc code của tôi rồi chỉnh sủa cho đúng, những cái gì không cần thiết như bàn phím, LCD bạn có thể bỏ.Chúc bạn tai qua nạn khỏi. |
||
![]() |
![]() |
![]() |
#6 |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
Em cảm ơn anh nhé. Có j em chưa hiểu em hỏi anh trả lời giúp em nhé. Sau vụ này Anh bố trí dành cho em một buổi anh em mình đi uống cafe anh nhé.
Em đọc qua code của anh rồi, Có phải anh dùng + AN2 để phàn hồi dòng Iac + AN3 để phản hồi áp sau chỉnh lưu Vac + AN4 để phản hồi áp ra Các ngắt ngoài anh dùng làm gì thế ạ? Anh có thể cho em phần kết nối mạch cứng của anh để em dễ đối chiếu với cái của em đc kô ạ? chỉ cần phần chính thôi, các phần như bàn phím, LCD hay uart thì kô cần ạ. các hệ số phản hồi anh lấy bằng bao nhiêu? Điện áp vào cực đại tại các chân ADC của anh là bao nhiêu a? thay đổi nội dung bởi: cuongthinh, 04-06-2009 lúc 05:12 PM. |
![]() |
![]() |
![]() |
#7 |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
Anh tungnh ơi, Em về đọc file của anh có nhiều thông số khó hiểu quá. Em chỉ làm mạch PFC với điện áp đầu vào là 12V thôi. Anh làm rồi có kinh nghiệm chỉnh sửa rồi truyền lại cho em ít. Em ngồi cả ngà chỉnh mấy cái Kp, Ki mà mạch vần chưa ổn định được. Giúp em với. Anh chỉ cho em cần chỉnh những thông số nào nhé
|
![]() |
![]() |
![]() |
#8 | |
Đệ tử 5 túi
Tham gia ngày: Sep 2007
Bài gửi: 94
: |
Trích:
Ngắt ngoài dùng ứng dụng bàn phím. Việc chỉnh hệ số kp,ki gian lan lắm. Tùy thuộc vào thông số phần cứng nữa. Tôi dùng phím( LCD hiển thị), để tăng giảm các thông số như kp,ki,v_reference,vv....Dùng 1 động cơ nối vào đầu ra đê test dòng.Dùng dao động kí để quan sát xung PWM. Để biết khi nào thì ổn thì bạn phải chắc lý thuyết. Ví không trực tiếp bảo bạn được nên cũng khó đó, chúc bạn may mắn. |
|
![]() |
![]() |
![]() |
#9 |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
Vâng em cảm ơn anh. Em cũng dùng dao đông kí nhưng em dùng để quan sát dòng điện đầu vào. có mấy thông số này em chưa hiểu, cách tính nó thế nào:
int VdcR_c = 300,kpV_c = 100,kiV_c = 10,kpI_c = 10,kiI_c = 10,pfcMaxDuty_c = 10; .equ voltMinRef, 200; Corresponds to 40V reference .equ pfcCurrOutMax, 32767 ; Maximum Value for IPI output .equ pfcCurrOutMin, 800 ; Minimum Value for IPI output .equ MinimumVavg,3000 ; Minimum Value of Vavg .equ DutyScalingFactor, 100 ; Scaling Factor for PWM Duty Cycle .equ AdcConvFactor, 0x8000 ; Factor for scaling the ADC Results .equ PI_qdSumL,0 .equ PI_qdSumH,2 .equ PI_qKp,4 .equ PI_qKi,6 .equ PI_qKc,8 .equ PI_qOutMax,10 .equ PI_qOutMin,12 .equ PI_qInRef,14 .equ PI_qInMeas,16 .equ PI_qOut,18 .equ NKo,4 Điện áp của em có 12V thôi, kô biết có phải sửa các thông số trên kô (mạch của anh là 220V phải kô ạ?) thay đổi nội dung bởi: cuongthinh, 05-06-2009 lúc 08:08 AM. |
![]() |
![]() |
![]() |
#10 |
Đệ tử 2 túi
Tham gia ngày: Jan 2007
Bài gửi: 34
: |
He, mạch của em chạy ngon rồi. em dùng lại hai file PFC.s và PI.s của nó. Chương trình của anh tungnh cho em em đã thử nhưng kô hiểu sao kô có xung ra. Dù sao cũng cảm ơn anh nhiều lắm. Em mới học lập trình cho dsPIC con gà lắm, post bài lên diễn đàn có mỗi anh tungnh nhiệt tình giúp đỡ. Bây giờ Em lại có cách khác để thực hiện hai khâu PI, dùng C hẳn hoi mà chương trình chạy vẫn nhanh.
|
![]() |
![]() |
![]() |
#11 | |
Nhập môn đệ tử
Tham gia ngày: Apr 2009
Bài gửi: 9
: |
Trích:
|
|
![]() |
![]() |
![]() |
#12 |
Đệ tử 7 túi
Tham gia ngày: Aug 2007
Bài gửi: 213
: |
Anh cuongthinh cho xin phần code của anh có được không ?Cả phần mô phỏng nữa đi.
Email của em:ngththien@gmail.com Cảm ơn anh nhiều !!!! |
![]() |
![]() |
![]() |
#13 | |
Đệ tử 5 túi
Tham gia ngày: Sep 2007
Bài gửi: 94
: |
Trích:
thay đổi nội dung bởi: tungnh, 09-06-2009 lúc 04:48 PM. |
|
![]() |
![]() |
![]() |
|
|