|
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 |
08-05-2008, 04:48 PM | #1 |
Đệ tử 1 túi
Tham gia ngày: Sep 2006
Bài gửi: 14
: |
Anh Nam Cho Em Hỏi Một Vấn Đề Lớn, Chắc Chỉ Có Anh Mới Trả Lời Được
Cám ơn anh trước.
Em tạo một tín hiệu sin bằng việc đặt tra theo bảng sau; sinTable[] = {5,6,7,8,9,9,10,10,10,10,10,9,9,8,7,6,5,4,3,2,1,1, 0,0,0,0,0,1,1,2,3,4}; và dưới đây là một tín hiệu hình sin có biên độ và tần số giống như trên nhưng dịch di 90 độ sinTable_s90[] = {10,10,10,9,9,8,7,6,5,4,3,2,1,1,0,0,0,0,0,1,1,2,3, 4,5,6,7,8,9,9,10,10}; bây giờ em có một tín hiệu được chuyển đổi ADC (có tần số bằng tần số của hai tín hiệu trên) => vậy bây giờ em muốn có hai tín hiệu mới :I = sin_table x input_sig và Q = sin_table_s90 x input_sig. và sau đó cho hai tín hiệu qua bộ lọc FIR(bộ lọc được hỗ trợ ngay trong con dspic) để được tín hiệu I,Q cuối cùng thì em phải làm cách nào, em làm rồi mà nó chạy không đúng Chương trình của em: Code:
=================ISR_Timer #include "p30f4011.h" #include "common.h" #include "dsp.h" void Init_Timers( void ); void Init_Timers( void ) { TMR1 = 0; //Xoa so dem trong TMR1 PR1 = 200; //TMR1 tran moi ms _T1IF = 0; //Xoa co ngat cua Timer 1 T1CON = 0x0020; //Dung fcy lam clock, prescale = 1:64, tat Timer 1 _T1IE = 1; //Cho phep ngat Timer 1 T2CON = 0; // chon he so chia la 1, tat timer 2 IFS0bits.T2IF = 0; // Xoa co ngat IPC1bits.T2IP = 5; // Uu tien ngat PR2 = SAMPCOUNT; // chu ky lay mau TMR2 = 0; // Xoa so dem trong timer 2 IEC0bits.T2IE = 1; // Cho phep ngat khi tran // set up TMR3 to generate signals for the ADC convert // tan so lay mau 320kHz TMR3 = 0x0000; //chon he so chia la 1, tat timer 3 PR3 = SAMPCOUNT; // chu ky lay mau IFS0bits.T3IF = 0; IEC0bits.T3IE = 0; // delay turning the output timer on until the main loop T2CONbits.TON = 0; } ==========================main #include <p30f4011.h> #include <stdio.h> #include "common.h" #include "dsp.h" #include "lcd8bit.h" #include "delay.h" #include "string.h" _FOSC(CSW_FSCM_OFF & XT_PLL16); _FWDT(WDT_OFF); _FBORPOR(PBOR_OFF & MCLR_EN); _FGS(CODE_PROT_OFF); extern FIRStruct lowpassexample_psvFilter; /*Contains filter structures for FIR-LPF*/ fractional i_Ptr_sig[NUMSAMP]; fractional ref_input_sig[NUMSAMP]; fractional ref_input_s90_sig[NUMSAMP]; fractional input_I_signal[NUMSAMP]; fractional input_Q_signal[NUMSAMP]; fractional output_I_signal[NUMSAMP]; fractional output_Q_signal[NUMSAMP]; //fractional output_REF_signal[NUMSAMP]; //fractional output_REF2_signal[NUMSAMP]; fractional* ref_input_s90; fractional* ref_input; fractional* i_Ptr; fractional* o1_Ptr; fractional* o2_Ptr; fractional* i1_Ptr; fractional* i2_Ptr; volatile fractional fin; volatile fractional fqn; unsigned int doFilterFlag; int main(void) { float fI,fQ,adc,in; float mag,phi; char sBuff[40]; fractional tI,tQ; TRISE = 0xFFF0; ref_input =& ref_input_sig[0]; ref_input_s90 =& ref_input_s90_sig[0]; i_Ptr =& i_Ptr_sig[0]; input_I_signal[0] = (i_Ptr_sig[0])*(ref_input_sig[0]); input_Q_signal[0] = (i_Ptr_sig[0])*(ref_input_s90_sig[0]); // i1_Ptr =&input_I_signal[0]; // i2_Ptr =&input_Q_signal[0]; o1_Ptr =&output_I_signal[0]; o2_Ptr =&output_Q_signal[0]; // ref_input =&output_REF_signal[0]; // ref_input_s90 =&output_REF2_signal[0]; // i_Ptr =&input[0]; FIRDelayInit(&lowpassexample_psvFilter); Init_Timers(); Init_ADC(); TMR1 = 0; TMR2 = 0; TMR3 = 0; T1CONbits.TON = 1; T2CONbits.TON = 1; T3CONbits.TON = 1; while(!doFilterFlag); while (1) { if (doFilterFlag) { o1_Ptr = FIR(NUMSAMP,&output_I_signal[0],&input_I_signal[0],&lowpassexample_psvFilter); o2_Ptr = FIR(NUMSAMP,&output_Q_signal[0],&input_Q_signal[0],&lowpassexample_psvFilter); fin = output_I_signal[0]; fqn = output_Q_signal[0]; tI = fin; tQ = fqn; fI = Fract2Float(tI); fQ = Fract2Float(tQ); in= *i1_Ptr; adc= i_Ptr_sig[0]; mag=sqrt(fI*fI+fQ*fQ); phi=atan2(fQ,fI)*180.0f/PI; Init_LCD(); lcd_cmd(lcd_homeL1); sprintf(sBuff," Mag = %8.5f ",mag); // sprintf(sBuff," Iout = %8.5f ",in); puts_lcd(sBuff,strlen(sBuff)); lcd_cmd(lcd_homeL2); sprintf(sBuff," Phi = %8.3f ",phi); // sprintf(sBuff," ADC =%8.3f ",adc); puts_lcd(sBuff,strlen(sBuff)); doFilterFlag = 0; } } return 0; } // ĐỀ TÀI EM LÀM LÀ VỀ BỘ KHUYẾCH ĐẠI LOCK IN thay đổi nội dung bởi: falleaf, 08-05-2008 lúc 05:34 PM. |
|
|