|
本帖最后由 melody520 于 2012-5-2 10:40 编辑
题外话:
知道阿莫论坛是在参加全国电子设计大赛时一个朋友说的,在这里找到了很多宝贵的质料,尤其是大神很多……
了解阿莫论坛是在之后的一段时间,如同阿莫倡导的“友好交流气氛,乐于开源共享”,我想说“神马都是浮云,共享才是王道”……让俺们在这里建立知识的世外桃源……
对于阿莫,我有一个小小的建议……我是很烦那些不经过思考就转载别人的论文或者观点(简称为观点吧),网上一搜一大把都是一样的,对的一样错的也一样,那么有用的东西就变得很少了……把正确的东西拿来传承,dust丢掉,让经典延续,像教科书一样……有问题找阿莫,不说一定解决您的问题,但总能给您一些启发……来了就不白来
对于相同帖子经行关联,这样时间久了就不怕乱,让后人找起来也方便……
言归正传:
问题:将采集的模拟量(工频,许继测试系统提供)经AD12变换后,通过FFT变换的到50Hz工频电压,但电压很不稳定,一直怀疑是不是AD12初始化设置有问题,请大神们指点。(前提:硬件没有问题,FFT程序没有问题)
先简单理一下思路:
XT2外接晶振20M,进行32点FFT变换,5路AD12 顺序采样,TA0用于启动AD12;以下是各部分的程序:
void UCS_Init(void)
{
P5SEL |= 0x0C; // XT2= 20M
UCSCTL6 &= ~ XT2OFF; // Set XT2 On
UCSCTL3 |= SELREF_2; // FLLref = REFO,DCODIV=1.045MHz,DCO 参考频率
UCSCTL4 |= SELA_2; // ACLK=REFO=32768Hz,SMCLK=DCO,MCLK=DCO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
SFRIFG1 &= ~OFIFG;
}while (SFRIFG1&OFIFG);
UCSCTL6 |= XT2DRIVE_2 ; // Decrease XT2 Drive according to
UCSCTL4 |= SELS_5 + SELM_5; // MCLK=SMCLK=DCO=XT2
UCSCTL5 |= DIVS_1 + DIVM_1; // ACLK=32.768 ,SMCLK=MCLK=XT2/2
}
void ADC12_Init(void)
{
P6SEL |= 0x03; // Enable A/D channel inputs
ADC12CTL0 &=~ ADC12ENC;
ADC12CTL0 |= ADC12ON+ADC12MSC+ADC12SHT0_8; // Turn on ADC12, extend sampling time
// to avoid overflow of results
ADC12CTL1 |= ADC12SHP+ADC12CONSEQ_1; // Use sampling timer, repeated sequence
ADC12CTL2 |= ADC12RES_2;
ADC12MCTL0 |= ADC12INCH_0 + ADC12SREF_2; // ref+=VeREF+, channel = A0
ADC12MCTL1 |= ADC12INCH_1 + ADC12SREF_2; // ref+=VeREF+, channel = A1
ADC12MCTL2 |= ADC12INCH_2 + ADC12SREF_2; // ref+=VeREF+, channel = A2
ADC12MCTL3 |= ADC12INCH_3 + ADC12SREF_2; // ref+=VeREF+, channel = A3
ADC12MCTL4 |= ADC12INCH_4 + ADC12SREF_2 + ADC12EOS; // ref+=VeREF+, channel = A4, end seq.
ADC12IE |= 0x10; // Enable ADC12IFG.4
ADC12CTL0 |= ADC12ENC; // Enable conversions
}
void Time0_A0_Init(void)
{
TA0CCTL0 |= CCIE; // TACCR0 interrupt enabled
TA0CCR0 = 625; //800Hz
TA0EX0 |= TAIDEX_4; //T/5
TA0CTL |= TASSEL_2 + TACLR + MC_1 + ID_2; //SCLK/2,upmode, clear TAR, TA enable interrupt
}
以上为初始化程序:频谱分辨率F=50/2=800/32; 进行32点FFT,采样频率Fs=800Hz;
以下为中断程序:
//每800Hz进行一次采样
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void) //ADC12
{
ADC12CTL0 |= ADC12SC; // Start convn - software trigger
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
static unsigned int FFT_Cnt;
if (FFT_Flag == 0)
{
Samples[0][FFT_Cnt] = ADC12MEM0; // Move A0 results, IFG is cleared
Samples[1][FFT_Cnt] = ADC12MEM1; // Move A1 results, IFG is cleared
Samples[2][FFT_Cnt] = ADC12MEM2; // Move A2 results, IFG is cleared
Samples[3][FFT_Cnt] = ADC12MEM3; // Move A3 results, IFG is cleared
Samples[4][FFT_Cnt] = ADC12MEM4; // Move A4 results, IFG is cleared
FFT_Cnt++;
if(FFT_Cnt == (FFT_N-1))
{
TA0CCR0 = 0; //关闭TA0定时中断
}
if (FFT_Cnt >= FFT_N) //完成32点采样后停止采样,进行FFT计算
{
FFT_Cnt = 0;
FFT_Flag = 1;
}
}
}
FFT运算在main中完成,之后重新开启定时,采样。之前用PIC做的设备挺好……但在MSP430F5438中就有问题了,看了几遍Datasheet,和官方Demo也没发现问题在哪,折磨了我一个星期,用仿真器仿真看得到的采样值也符合规律,就是FFT后的结果不是一个定值……让人很是不解,我怀疑AD12中是不是有啥鲜为人知的地方没注意……没办法,求援助啊……
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|