This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5172:使用 TD 测得的脉冲

Guru**** 2380860 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1046681/msp430f5172-measured-pulses-with-td

器件型号:MSP430F5172

该电路的目的是测量两个脉冲上升沿之间的时间、所需精度为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、客户希望知道如何设置以提高测量分辨率。

谢谢!

此致、

樱桃周

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1)似乎您正在从 DCO 运行 SMCLK (UCSCTL4:SELS 不变)。 DCO 不会为您提供所需的精确度、更重要的是、由于调制器产生了相当大的(故意)抖动。 我建议您改为从 ACLK (晶振)运行 TD0。

    2) 2)我不建议在每次捕获时清除计数器(TDCLR)、因为这会在开始时间中引入不可预测的延迟。 相反、让定时器运行并从 连续(上升)边沿减去捕捉。