本人想用用ad转换做一个采样频率为1280hz的数据采集,采集128个点后对其进行处理,处理完后在进行下一次的采集;
由于对频率要求较高,所以我选择使用定时器中断,每次中断启动ad转换并将转换结果保存后退出中断等待下一次中断,但是对ad的初始化很迷惑,希望高手给指点一下,说说有哪里不对,程序如下:
#include "msp430x14x.h"
void ADCinit() //ADC初始化
{ int i;
P6SEL=0x01; //设置端口第二功能
ADC12CTL0&=~ENC ; //ENC设置为0从而修改ADC12寄存器
ADC12CTL0 = ADC12ON + REFON + REF2_5V+SHT0_0; //启动ADC12,使用内部参考电压,2.5V
ADC12CTL1 = SHP; //使用采样定时器
ADC12MCTL0 = SREF_1; //Vr+ = Vref+
for(i = 0; i < 0x3600; i++) //为参考源启动提供延迟17ms以上
{}
ADC12CTL0 |= ENC; //允许转换
return;
}
#pragma vector=TIMERA0_VECTOR //中断服务程序
__interrupt void Timer_A(void)
{
ADC12CTL0 |= ADC12SC; //启动转换
while((ADC12IFG&ADC12BUSY)==0); //等待转换完成
_NOP();
dataIN[count].image=ADC12MEM0/4095.0;
count++;
if(count==128)
{
TACTL=0x02C4; //当采集点数达到128时定时器变为停止模式
count=0;
}
}
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
BCSCTL1&=~XT2OFF; //XT2启动
BCSCTL2=SELS+DIVS1+DIVS0; // 选择XT2CLK作为SMCLK时钟,分频比为8
CCTL0=CCIE; // 使能定时器中断
CCR0=97; //采样频率为1280HZ
_EINT(); //使能全局中断
int i,j,k;
ADCinit();
for(;;)
{ TACTL=0X02D4; //定时器加计数模式,分频比为8,使用SMCLK时钟
for(i=1000;i>0;i--) //给采样充足时间
for(k=125;k>0;k--);
P4DIR=0xff;
P4OUT=0Xff;
for(j=100;j>0;j--)
for(k=125;k>0;k--);
P4OUT =0x0;
}
return 0;
}
此帖出自
小平头技术问答
一周热门 更多>