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.

[参考译文] CCS/TIDA-00120:MSP430F5152 TimerD 不会生成精确的 PWM 占空比

Guru**** 2589245 points
Other Parts Discussed in Thread: MSP430F5152, TIDA-00120

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

https://e2e.ti.com/support/tools/simulation-hardware-system-design-tools-group/sim-hw-system-design/f/simulation-hardware-system-design-tools-forum/770638/ccs-tida-00120-msp430f5152-timerd-do-not-generate-precise-pwm-duty-cycle

器件型号:TIDA-00120
主题中讨论的其他器件:MSP430F5152

工具/软件:Code Composer Studio

您好!  

 我将使用基于  TIDA-00120参考设计的 MSP430F5152开发 MPPT 控制器。    

将设计从最初的插式降压 转换器调制为单通道 降压转换器。

为了确保适当的死区时间、  我 在使用参考计时器 D 初始化例程时将 T1CCTL1和 T1CCTL2的值差设置为25

应用 MC_3向上向下计数模式。    然后、我发现 PWM 死区时间正在从几乎50ns 更改为1.x us、而没有任何 S/W 参与。  

我在 断点停止条件下使用示波器和逻辑分析器测量 PWM 波形、在 256MHz 的 tmer D free 运行模式下。

Somtime 死区时间几乎变为 50ns 、有时变为 1.x us。    当然、如果我将 T1CCTL1和 T1CCTL2的值间隔设为40、   

这有点安全。    但它可能 会增加 低侧体二极管的导通损耗、  我想尽量缩短死区时间。    

为什么  即使在 CCS 中的断点停止条件下也会更改占空比时序?

下面是 我应用的 TimerD 初始化路由。           我还连接 了简单的逻辑分析仪测量的波形。  逻辑分析仪仅用于24M 样本。  

捕获的 LSB 误差约为40nsec。     但当我在示波器中测量时、显示的条件几乎相同。   

CCS?    

 --------------------------------------------------------------------

空 Init_Timer (空)

 struct s_TLV_Timer_D_CAL_Data * pTD0CAL; //在 tlv.h 中初始化结构
 unsigned char bTD0CAL_bytes;
// unsigned int i = 20;

//将 TimerD 配置为高分辨率自由运行模式
 get_TLV_Info (TLV_TIMER_D_CAL、0、&bTD0CAL_bytes、(无符号整型**)&pTD0CAL);
                                               //Get TimerD0校准值(实例0)
 if (bTD0CAL_bytes = 0x0)
 {
    //未找到 TimerD 自由运行校准数据
    while (1);                            //此处循环
 }
 //配置主计时器实例- TimerD0、高分辨率校准模式
 TD1CTL0 = TDSSEL_2;                      // TDCLK = SMCLK = 25MHz =高分辨率输入时钟选择

 TD1HCTL1 = pTD0CAL->TDH0CTL1_256;        //读取256Mhz TimerD TLV 数据

 TD1CTL1 |= TDCLKM_1;                     //选择高分辨率本地时钟
 TD0HCTL0 = TDHEN + TDHM_1;               // calen=0 =>自由运行模式;启用高分辨率模式
 TD1HCTL0 = TDHEN + TDHM_1;               // calen=0 =>自由运行模式;启用高分辨率模式                                          // TDHM_0 => 256Mhz、TDHM_1 =>256Mhz
 //此处、Timer D 配置为以256Mhz 运行

 TD1CCR0 = 700;                           // 256M 向上向下/700 = 182.8Khz 是降压级的工作频率

 TD1CCTL0 |= CCIE;                    //中断被使能以调整相位
 TD1CCR1 =占空比;              //低侧 PW_L2? 高侧 PW_H1 *****
 TD1CCTL1 |= OUTMOD_2;                    // TD0CCR1,复位/置位(outmode2->切换和复位?)
 TD1CCR2 = Duty;                            // Dute-25被完成来提供死区。 高侧 PW_H2。 PW_L1
 TD1CCTL2 |= OUTMOD_6;                    // TD0CCR2、设置/复位


 TEC1XCTL2 |= TECAXCLREN;     //通过启用从机计时器的辅助清零来启用同步清零
 TD1CTL0 |= MC_3 + TDCLR;                 //向上/向下计数模式、清除 TDR、启动计时器-向上/向下-由 YSK 修改
 }
#pragma vector=Timer1_D0_vector
_interrupt void Timer1_D0_ISR (void)

  TD1CCTL0 &=~CCIE;
  PHASE_PHASE_PHASE_DONE = 1;

#pragma vector=Timer1_D1_vector
_interrupt void Timer1_D1_ISR (void)

 switch (__evo_in_range (TD1IV、30))
 {
   情况 0:中断;                         //无中断
   情况 2:中断;                         //未使用 CCR1
   情况 4:中断;                         //未使用 CCR2
   情况 6:中断;                         //保留
   情况 8:中断;                         //保留
   情况10:中断;                         //保留
   情况12:中断;                         //保留
   案例14:中断;
   案例16:中断;
   案例18:                                //时钟失败低电平
     while (1);                             //输入参考时钟频率过低;请在此处陷阱
   案例20:                                //时钟高电平失败
     while (1);                             //输入参考时钟频率过高;请在此处陷阱
   案例22:                                //高分辨率频率已锁定
     //高分辨率频率已锁定;现在配置端口以在 TD0/TD1上输出 PWM
     P1SEL |= BIT7;                 // P1.6/TD0.0、P1.7、TD0.1、选项选择
     P1

DIR |= BIT6 + BIT7;                 //输出方向
     P2SEL |= BIT0 + BIT2 + BIT3;   // P2.0/TD0.2、P2.1/TD1.0、P2.2/TD1.1、P2.3/TD1.2、 选项选择
     P2DIR |= BIT0 + BIT2 + BIT3;   //输出方向

     _BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE); //返回 main 时退出 LPM0

     中断;
   案例24:中断;                         //高分辨率频率未锁定
   情况26:中断;                         //保留
   情况28:中断;                         //保留
   案例30:中断;                         //保留
   默认值:break;
 }

    TD1CCTL1 = OUTMOD_2;  // 输出模式
    TD1CCTL2 = OUTMOD_6;  //输出模式

 --------------------------------------------------------------------    

非常感谢您的建议!         

 YS Kim

 

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

    您好,Yongsung,

    让我们首先看一下基于 Timer D 的应用手册、它在高分辨率模式下使用 Timer D。 请告诉我这是否有助于缩小您的问题范围。

    Chris

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

    尊敬的 Chris:   

    感谢您提供额外的高分辨率计时器材料!        

     对我的现象进行了解释、  但有一些错误。   变化为50ns 至180nsec。  不是"50ns 至1.x us"。  

    顺便说一下,   当我用示波器测量死区时间时,   即使我使用向上向下计数模式,  死区时间在上升沿和下降沿都不对称。   

    如果 TD1CCR1 上升至 ST1CCR2下降侧死区时间为100nsec、 则另一侧为150nsec。    这是由于 MCU 机器循环造成的?   

    关于时序变化、    在我将 CLLDx 值从0更改为1后、看起来有所改善。    (01当 TDxR 计数为0时、新数据从 TDCCRx 转移到 TDCLx 中。)

    和应用的组比较锁存功能。      它看起来 有点不好、  但不确定是否是固定的。   可能需要进一步测试!

    如果您 发现我错过的任何内容、 请提供任何建议。   

    YS Kim