额...又来麻烦大家了。前段时间写了个测量方波频率的代码。昨天取实验室用函数发生器试了一下,能测得的频率范围大概为122hz到110khz。122hz好说,和计算出来可测得最低频率的结果一致。(f=1/(1/8000000*65536)),但是这个最高频率怎么才110khz啊???(频率大于110k测出的数据就只有6,7万,这明显没对)我用的可是8m的时钟源。
现在我能想的就是分频了。我记得430只能对主时钟进行分频,不知道可不可以对外来的信号就行分频,如果不行,我设想用74hc4040或者cd4518(刚刚才买的哈哈哈哈)。还忘大家给下建议。谢谢大家啊!
#include <msp430.h>e
int j=0,i,l;
long int k,f,new_cap=0,old_cap=0,cap_diff=0;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1OUT=0;
if (CALBC1_8MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_8MHZ; // Set DCO to 8MHz
DCOCTL = CALDCO_8MHZ;
for(i=0;i<20000;i++);//等晶振稳定震荡
P1DIR=0x10;//P1.4输出SMCLK
P1SEL=0X12;//P1.4输出SMCLK信号,为第二功能。P1.1引脚作输入接受捕获信号,为第二功能。
P2DIR |= BIT1;
P2SEL |= BIT1;
TA1CCR0 = 82-1; // Period Register
TA1CCR1 = 21; // TA1.1 25% dutycycle
TA1CCTL1 |= OUTMOD_7; // TA1CCR1, Reset/Set
TA1CTL = TASSEL_1 + MC_1 + TACLR;
CCTL0=CM_1+CCIS_0+SCS+CAP+CCIE;//上升沿捕获+P1.1捕捉CCI0A 输入+同步+捕获模式+开始中断
TACTL=TASSEL_2+MC_2;//SMCLK时钟+连续模式
_BIS_SR(LPM0_bits+GIE);
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT^=0x40;//led翻转
j++;
if(j%2>=1)
old_cap=TACCR0;//第一次捕获上升沿时,定时器的值
if(j%2==0)
{
new_cap=TACCR0;//第二次捕获上升沿时,定时器的值
if(new_cap<old_cap)
cap_diff=65536+new_cap-old_cap;//两次相减得到一个周期内定时器的计数
else
cap_diff=new_cap-old_cap;//两次相减得到一个周期内定时器的计数
f=8000000/cap_diff*0.99;//根据测试结果430g2553得到的信号比实际信号差不多大0.01
__bic_SR_register_on_exit(LPM0_bits + GIE);
}
}
此帖出自
小平头技术问答
但是这个8m的时钟源为什么连个200khz都测不准??不是很懂啊
如何精确定时1s
一周热门 更多>