MSPF新编测周法测量信号频率
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
M S P430F5529测量频率
-----测周法信号变换电路
过零比较器,lm393输出上拉电阻,两电阻分压
程序
#include<>
#include""
#include""
//测周法,在捕获过程中,定时溢出不能被检测出,选择时钟频率为低频时能测出低频,频率高能测出频率高的部分
/*
*
*/
longlongstart=0;
//longlongintstop=0;
doublefre=;
unsignedchari=0;
unsignedcharover=0;
voidSetVcoreUp(unsignedintlevel)
{
//OpenPMMregistersforwrite
PMMCTL0_H=PMMPW_H;
//SetSVS/SVMhighsidenewlevel
SVSMHCTL=SVSHE+SVSHRVL0*level+SVMHE+SVSMHRRL0*level;
//SetSVMlowsidetonewlevel
SVSMLCTL=SVSLE+SVMLE+SVSMLRRL0*level;
//WaittillSVMissettled
while((PMMIFG&SVSMLDLYIFG)==0);
//Clearalreadysetflags
PMMIFG&=~(SVMLVLRIFG+SVMLIFG);
//SetVCoretonewlevel
PMMCTL0_L=PMMCOREV0*level;
//Waittillnewlevelreached
if((PMMIFG&SVMLIFG))
while((PMMIFG&SVMLVLRIFG)==0);
//SetSVS/SVMlowsidetonewlevel
SVSMLCTL=SVSLE+SVSLRVL0*level+SVMLE+SVSMLRRL0*level;
//LockPMMregistersforwriteaccess
PMMCTL0_H=0x00;
}
voidinit_clock()
{
SetVcoreUp(0x01);
SetVcoreUp(0x02);
SetVcoreUp(0x03);
UCSCTL3=SELREF_2;//SetDCOFLLreference=REFO
UCSCTL4|=SELA_2;//SetACLK=REFO
__bis_SR_register(SCG0);//DisabletheFLLcontrolloop
UCSCTL0=0x0000;//SetlowestpossibleDCOx,MODx
UCSCTL1=DCORSEL_7;//SelectDCOrange50MHzoperation UCSCTL2=FLLD_0+609;//SetDCOMultiplierfor25MHz
//(N+1)*FLLRef=Fdco
//(762+1)*32768=25MHz
//SetFLLDiv=fDCOCLK/2
__bic_SR_register(SCG0);//EnabletheFLLcontrolloop
__delay_cycles(782000);
do
{
UCSCTL7&=~(XT2OFFG+XT1LFOFFG+DCOFFG);
//ClearXT2,XT1,DCOfaultflags
SFRIFG1&=~OFIFG;//Clearfaultflags
}while(SFRIFG1&OFIFG);//Testoscillatorfaultflag
}
voidsend_char(charsc)
{
UCA0TXBUF=sc;
while(!(UCA0IFG&UCTXIFG));
}
voidsend_string(char*s)
{
while(*s!='\0')
{
send_char(*s++);
}
}
init_uart()
{
P3SEL|=BIT3+BIT4;//,4=USCI_A0TXD/RXD
UCA0CTL1|=UCSWRST;//**Putstatemachineinreset**
UCA0CTL1|=UCSSEL__SMCLK;//SMCLK
UCA0BR0=173;//1MHz115200(seeUser'sGuide)
UCA0BR1=0;//1MHz115200
UCA0MCTL|=UCBRS_5+UCBRF_0;//ModulationUCBRSx=1,UCBRFx=0
UCA0CTL1&=~UCSWRST;//**InitializeUSCIstatemachine**
UCA0IE|=UCRXIE;//EnableUSCI_A0RXinterrupt
send_string("CLS(0);\r\n");
}
intmain(void){
charbuf[60]="\0";
WDTCTL=WDTPW+WDTHOLD;//StopWDT
init_clock();
init_uart();
P1DIR&=~BIT2;//
P1SEL|=BIT2;//捕获输入
TA0CTL=TASSEL_2+ID__8+MC_2+TACLR+TAIE;//SMCLK,连续mode,clearTAR8分频下限可以测到8Hz。上限200K左右
TA0CCTL1=CM_1+SCS+CAP+CCIE;
__bis_SR_register(GIE);//EnterLPM0,enableinterrupts
while(1)
{
sprintf(buf,"DS16(0,60,'频率:%',4);\r\n",fre);
send_string(buf);
__delay_cycles(314574);
}
}
//下限频率15,上限200K左右
#pragmavector=TIMER0_A1_VECTOR
__interruptvoidTIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case0:break;//Nointerrupt
case2://CCR1
{
i++;
if(i==1)
{ over=0;
TA0CTL|=TACLR;
}
if(i>=51)
{
i=0;