该电路的目的是测量两个脉冲上升沿之间的时间、所需精度为4nS。
电路和编程:
电路:通过 PJ.4和 PJ.5从外部连接到11.0592 MHz 晶体
设置如下:
空 initClock()
{
//配置 XT1
PJSEL |= BIT4+BIT5; //端口选择 XT1
UCSCTL6 &=~(XT1OFF); // XT1打开
UCSCTL6 |= XTS + XCAP_3; //内部负载电容
//循环直到 XT1故障标志被清除
操作
{
UCSCTL7 &=~XT1LFOFFG; //清除 XT1故障标志
} while (UCSCTL7&XT1LFOFFG); //测试 XT1故障标志
UCSCTL3 |= SELREF_2; //设置 DCO FLL 基准= REFO
UCSCTL4 |= SELA_0; //设置 ACLK = XT1CLK
//将 DCO 初始化为2.45MHz
_bis_SR_register (SCG0); //禁用 FLL 控制循环
UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5; //针对 DCO 设置 RSELx = 4.9MHz
UCSCTL2 = FLLD_0 + 300; //将 DCO 乘法器设置为2.45MHz
//(N + 1)* FLLRef = Fdco
//(74 + 1)* 32768 = 2.45MHz
//设置 FLL Div = fDCOCLK/2
_BIC_SR_register (SCG0); //启用 FLL 控制环路
// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 2.45MHz / 32、768Hz = 76563 = DCO 稳定的 MCLK 周期
//_delay_cycles (76563);
_DELAY_CYCLES (50000);//
//循环直到 XT1和 DCO 故障标志被清除
操作
{
UCSCTL7 &=~(XT1LFOFFG + XT1HFOFFG + DCOFFG);
//清除 XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
}
串行端口设置如下:
空 UARTConfig()
{
//UART 配置
P1SEL |= BIT1+BIT2;
UCA0CTLW0 |= UCSSEL_1; // CLK = ACLK
//波特率计算
// 11059200/(9600)= 1152 (L:0x80 H:0x04
UCA0BR0 = 0x80;
UCA0BR1=0x04;
UCA0MCTL |= UCBRS_3;
//过采样
UCA0CTL1 &=~UCSWRST; //**初始化 USCI 状态机**
UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断
}
TD0CCR0设置如下:
空 initTD1()
{
//将 TD0CCR0配置为进行输入捕捉
TD0CTL2 &=~TDCAPM1; //通道1;单次捕捉模式
TD0CCTL1 = CAP + CM_1 + CCIE + SCS + CCIS_0;
// TD0CCR1捕获模式;CCI1A;BothTD0CCR1
//上升沿和下降沿;中断使能
TD0CTL0 |= TDSSEL_SMCLK + MC_2 + MC_0 + TDCLR; // SMCLK、控制模式;启动时间 SMCLK,
//将 TD1.1配置为输出 PWM 信号
//周期= 82/32kHz = 2.5ms ~ 400Hz 频率
TD1CCR0 = 1000; //周期寄存器
TD1CCR1 = 500; // TD1.1 25%占空比
TD1CCTL1 |= OUTMOD_7; // TD1CCR1、复位/置位
TD1CTL0 = TDSSEL_1 + MC_1 + TDCLR; // ACLK、upmode、清除 TDR
}
中断程序 如下:
switch (__evo_in_range (TD0IV、0x1E))
{
情况 0x0:中断; //向量 0: 无中断
情况 0x2: //向量 2: TDCCR1 CCIFG
if (!Count)
{
TD0CTL0 |= TDSSEL_SMCLK + MC_2 + TDCLR;
//FEdge1 = TD0CCR1; //第一个下降沿
//REdge1 = TD0CL1; //第一个上升沿
count++;
}
其他
{
TD0CTL0 |= TDSSEL_SMCLK + MC_0 + TDCLR;
REdge2 = TD0CL1; //第二个上升沿
FEdge2 = TD0CCR1; //虚拟读取
计数= 0x0;
//_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE); //返回 main 时退出 LPM0
}
中断;
情况0x4:中断; //向量 4: TDCCR2 CCIFG
情况0x6:中断; //向量 6: TDCCR3 CCIFG
情况0x8:中断; //向量 8: TDCCR4 CCIFG
情况0xA:中断; //向量10: TDCCR5 CCIFG
情况0xC:中断; //向量12: TDCCR5 CCIFG
情况0xE:中断; //向量14: -
情况0x10:break; //向量16: TDIFG
情况0x12:break; //向量18: TDHINT TDHFLIFG
情况0x14:break; //向量20: TDHINT TDHFHIFG
情况0x16:break; //向量22: TDHINT TDHLKIFG
情况0x18:break; //向量24: TDHINT TDHUNLKIFG
情况0x1A:break; //向量26: -
情况0x1C:break; //向量28: -
情况0x1E:break; //向量28: -
默认值: break;
}
请注意:TD1是用于测试的生成脉冲。
问题:
程序可以测量脉冲间隔时间、上面的程序 TD1模拟11.05kHz (周期:90.49us)、TD0测量值为407 (90.49/407 = 0.22us)、但最后两个位正在跳动。
根据手册、芯片的分辨率可以达到4nS、客户希望知道如何设置以提高测量分辨率。
谢谢!
此致、
樱桃周