trieutuan_vnu
08-05-2008, 04:48 PM
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:
=================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;
}
// TOÀN BỘ CHƯƠNG TRÌNH CỦA EM NHƯ FILE GỬI
// ĐỀ TÀI EM LÀM LÀ VỀ BỘ KHUYẾCH ĐẠI LOCK IN
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:
=================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;
}
// TOÀN BỘ CHƯƠNG TRÌNH CỦA EM NHƯ FILE GỬI
// ĐỀ TÀI EM LÀM LÀ VỀ BỘ KHUYẾCH ĐẠI LOCK IN