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 HPWM的疑问

Other Parts Discussed in Thread: MSP430F5172

   我在使用MSP430f5172 HPWM的过程中,//  SMCLK = MCLK = DCOclock = default DCO; TDCLK(TLV Cal Data)= 64Mhz

也就是我现在我把PWM模块的频率变为了64M,

  TD0CCR0 = 581;                          // PWM Period/2
  TD0CCTL1 = OUTMOD_6;                      // CCR1 toggle/set
  TD0CCR1 = TD0CCR0/2;                             // CCR1 PWM duty cycle

打算输出113.8KHz的频率,发现,我不断变化TD0CCR0的值从581变为576,在变化过程频率基本都没变化,但是当我把TD0CCR0的值变为575时,频率突然变为115KhZ左右了,整个过程我是用示波器查看的,怎么感觉和不是高分辨率一样呢

  • 两个问题请帮确认:

    1)楼主手上有没有计数器/频率计,能否使用频率计重新测量一次?

    2)另外Timer D的时钟源是怎么获得的?

  • 我们这里没有计数器/频率计,
    #include "msp430f5172.h"
    #include "hal_tlv.h"
    void main(void)
    {
      struct s_TLV_Timer_D_Cal_Data * pTD0CAL;  // Structure initialized in tlv.h
      unsigned char bTD0CAL_bytes;                 
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      Get_TLV_Info(TLV_TIMER_D_CAL, 0, &bTD0CAL_bytes, (unsigned int **) &pTD0CAL);
                                                //Get TimerD0 Cal Values (instance 0)
      if(bTD0CAL_bytes == 0x0)
      {
          while(1);                             // Loop here
      } 
      TD0HCTL1 = pTD0CAL->TDH0CTL1_64;          // Read the 64Mhz TimerD TLV Data                
      TD0CTL1 |= TDCLKM_1;                      // Select Hi-res local clock
      TD0HCTL0 = TDHEN + TDHM_0;                // CALEN=0 => free running mode; enable Hi-res mode
      P1SEL |= BIT6 + BIT7;                     // P1.6,7 option select
      P1DIR |= BIT6 + BIT7;                     // P1.6,7 output                         // P2.0 output  
      P2SEL |= BIT0;                            // P2.0 options select
      P2DIR |= BIT0;                            // P2.0 output
      TD0CCR0 = 576;                          // PWM Period/2
      TD0CCTL1 = OUTMOD_6;                      // CCR1 toggle/set
      TD0CCR1 = TD0CCR0/2;                             // CCR1 PWM duty cycle
      TD0CCTL2 = OUTMOD_6;                      // CCR2 toggle/set
      TD0CCR2 = TD0CCR0/2;                             // CCR2 PWM duty cycle
      TD0CTL0 |= MC_1 + TDCLR;                  // up-mode, clear TDR, Start timer
     
      __bis_SR_register(LPM0_bits + GIE);       // Enter LPM0
      __no_operation();                         // For debugger 
    }
    其实就是在你们给的例程里面修改的

  • 因为时间有限,只有在必要的时候才会阅读客户的代码。为了提高效率,建议楼主按照TI技术支持工程师引导提出的问题点,参考用户指南进行问题查找。

    解释一下两个问题:

    1)大多数示波器的频率测量功能,仅仅是示意性质的,精度并不高;建议楼主使用频率计/计数器测量;

    2)时钟的频率精度直接和频率基准源相关,建议使用外部的晶体振荡器作为频率基准源;

  • 我看了用户手册,对照了你们给的历程,实在没办法了才找你们帮忙解决的,说句真心话,也许我愚钝,但是真的没办法解决,我对比过用C2000跑60M的主频去看示波器的频率,基本感觉示波器是没有问题的


  • 我也遇到同样的问题:

          使用F5132的TimerD做高精度的PWM输出,使用Freerunning/regulator 模式,TimerD的时钟频率为256M,CCR0 = 255,当CCR1 <16 or CCR1 > 247时,PWM波无输出,怎么解决的?????

  •   Hi-res对CCRx的值是有限制的,即PWM波不可能到达100% 或 0%,只能无限接近