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.

[参考译文] TM4C129XNCZAD:用于计时器的单次 PWM 不适用于大型 ILR

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/671126/tm4c129xnczad-one-shot-pwm-for-timers-doesn-t-work-for-large-ilr

器件型号:TM4C129XNCZAD

我正在尝试获取一个 PWM 脉冲序列、这些脉冲通过使用单次触发 PWM 模式以菊花链方式连接计时器1和2的 A 和 B 计时器生成。 如果我将 PHASE_PERIOD 设置为适合16位的任何值、则以下代码正常工作。 如果我将 PHASE_PERIOD 设置为超过16位、则看起来计时器会递减计数、直到第一次计时器1A 的16个最低有效位到达零、计时器1A 使能被清除、然后一切都停止。 即使我尝试重新启用计时器1A、使能看起来会立即被清除、计时器也会立即停止。

该文档并未讨论使用单触发 PWM 模式、TI 库本身也不支持该模式。 我必须为它定义自己的配置。 它是有效的工作模式吗?

#define PHASE_PERIOD                               (65536U)

#define TIMER_CFG_A_ONE_SHOT_PWM                 (0x009)

#define TIMER_CFG_B_ONE_SHOT_PWM                 (0x900)

uint32_t load;

TimerConfigure (Timer1_base、timer_CFG_SPLIT_PAIR | timer_CFG_A_ONE_SHOT_PWM | timer_CFG_B_ONE_SHOT_PWM);

/*相位 C PWM */
GPIOPinConfigure( GPIO_PS0_T2CCP0 );
GPIOPinTypeTimer( GPIO_PORTS_BASE,GPIO_PIN_0 );

/*相位 D PWM */
GPIOPinConfigure( GPIO_PS1_T2CCP1 );
GPIOPinTypeTimer( GPIO_PORTS_BASE,GPIO_PIN_1 );

TimerConfigure (TIMER2_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_ONE_SHOT_PWM | TIMER_CFG_B_ONE_SHOT_PWM);

负载= PHASE_PERIOD;
// A 相和 B 相 PWM 控制。
TimerLoadSet (Timer1_base、timer_both、load 和0xFFFF);
TimerPrescaleSet (Timer1_base、timer_both、load >> 16);

//相位 C 和 D PWM 控制。
TimerLoadSet (TIMER2_base、timer_both、load & 0xFFFF);
TimerPrescaleSet (TIMER2_base、timer_both、load >> 16);

///相 B-D 在开始前等待前一个定时器超时。
TimerControlWaitOnTrigger (Timer1_base、timer_B、true);
TimerControlWaitOnTrigger (TIMER2_base、timer_both、true);

load /= 2;

TimerMatchSet (Timer1_base、timer_both、load 和0xFFFF);

TimerPrescaleMatchSet (Timer1_base、timer_both、load >> 16);

TimerMatchSet (TIMER2_base、timer_both、load & 0xFFFF);

TimerPrescaleMatchSet (TIMER2_base、timer_both、load >> 16);

while (true)

if ((HWREG (TIMER2_base + TIMER_O_CTL)& TIMER_CTL_TBEN)=0)

// TODO:设置加热器相位占空比

//首先启用2,因为它在计时器1完成后才会启动。

TimerEnable( TIMER2_base,timer_both );

TimerEnable( Timer1_base,timer_both );

感谢你的帮助。

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

    [引用 user="Keith Cliffe"]使用单次 PWM 模式以菊花链方式连接计时器1和2的 A 和 B 计时器所产生的 PWM 脉冲[/引用]

    我大体上同意您的目标、但 无法确认此类计时器生成的"一次性 PWM 模式" 是否正式(且正确) 存在。   您会问您的是否为"有效运行模式"-从图表说明(如下)和我多年的经验(在这里、拥有多个其他 ARM MCU)来看、我会投票、 不会!

    遵循调整(直接来自我当前的4C129 MCU 手册)。   请注意、"单次触发和 PWM"模式是单独的-我不确定它们是否可以(正确混合/组合!)

    现在、您报告(部分) 16位(或更少)的成功这一事实表明您(可能)创建了"成功混合模式"、而我和其他人(包括供应商)可能不知道这种模式!   请注意、在(两种)"单次触发"或"PWM"情况下、"计数器大小"限制为16位、但预分频器可以将范围(每种)扩展到24位。       

    虽然 MCU 手册和 API 证据"针对您的堆栈"( 可能会"淘汰"此类功能、但前提是"时间、精力和适当+持续关注"充足。

    也许如果您描述您的"最终目标"(我或 其他人在此)、可能会"分享此类需求"并做出(部分)贡献...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过链接两个计时器、您尝试执行的操作尚不清楚。

    上述内容、请阅读数据表、了解 PWM 模式中的定时器高16位。 您会发现它对您有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    至于" PWM 模式中的定时器高16位"-我相信 、当 定时器处于16位、PWM 模式时、"不存在这样高16位(高效)"(具有寄存器 GPTMTnILR)。

     我所展示的图表所示、可通过预分频器(寄存器 GPTMTnPR)实现八个额外的"高位"(而不是)。

    MCU 手册指出、 "在16位模式、该寄存器(GPTMTAILR)的高16位读作0、对 GPTMTBILR 的状态没有影响。"

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

    感谢你的帮助。 我使用 ALTCLK (16而不是120 MHz)来驱动计时器。 我没有完全想要的范围、由于 ALTCLK 是从 PIOSC 派生出来的、所以它不会与系统时钟同步、但我将与它一起查看它是如何工作的。 我再看一下文档、TxMR:TAAMS 有以下说明

    注:要启用 PWM 模式、还必须清除 TACMR
    并将 TAMR 域配置为0x1或0x2。

    0x01用于单次触发、0x02用于周期、因此根据支持该模式。 作为测试、我将计时器配置更改为周期性、但它没有相同的问题、但我需要一次性配置。

    应用需要按顺序驱动加热元件的4个相位。 如果所有其他故障、我可以显式驱动相位。

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

    很高兴能注意到您的成功-干得不错。  (但"保留"很少。)

    您是否可以(甚至)在您(相信的) 4个通道之间准备一张粗糙的"笔/铅笔"草图-显示时间关系。   Fire/I ( 通过 Cortex M7)从事许多"多相"设计工作、并采用了您所介绍的方法(外部)。   (不一定要求卓越的 MCU 的强大功能)

    关于"计时器同步"-请注意、此类"计时器同步"附加了"非常"(非常)精细(且要求苛刻)的"勘误表"。    快速扫描最新的 MCU 勘误表可能会使您"省去"-行下。

    将系统时钟从120 MHz 减少到16MHz (非整数) BTW独特的计时器同步实现中的信号(可能)"低效"有关。    

    此外-您的 MCU 运行的"所有其他"方面都没有-被限制?    这是可以接受的吗?

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

    感谢您提及勘误表。 我扫描了它、看不到任何适用于我的情况的东西。

    我没有更改系统时钟。 我将在菊花链中使用的定时器的时钟源设置为 ALTCLK 将两个定时器模块的 GPTMCC 设置为1、并确保 ALTCLKCFG 设置为使用 PIOSC。

    我附加了一个示波器捕获。 我将 PWM 设置为接近100%、并且必须通过启用链中的第一个计时器来显式重新启动序列。

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

    毫无疑问、您已经实现了"四相"输出。   明天-当员工到达时-我将看到他们是否可以"搜索/查找"(相当严重)使用要求-强制执行(过去)计时器同步。  (这可能已经解决了-我的大部分工作现在都解决了"R-52和 M7"(自动驾驶)、因此我不知道"修复此处" 是否已到达/成功。)

    一个注意事项-我们的多相设计(需求)是在由我们每个相位驱动的"高侧和低侧"功率 FET 之间插入一个"死区"。    此类"死区"不能(直接)通过计时器实现实现、可以通过您的 MCU (更先进的) PWM 发生器"完全/有效地可用"。    (可轻松生成具有可编程死区的"互补 PWM 信号"、可在(前沿和后沿)调节。)

    您需要注意的是-这些 PWM 发生器可容纳多达4个通道-"完全满足"您的需求。   (但我们的产品不能满足客户(要求严格)规范、该产品可扩展至6-8个阶段。)   所有8个- PWM 发生器信号输出-可通过"单个 PWM 故障引脚!"立即"停止   "故障引脚"可以轻松高效地提供"过流保护"和/或(许多其他) PWM 信号过流...

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

    对于这样的东西、您不需要太花哨了。 一个计时器可以轻松实现、并根据需要生成尽可能多的脉冲。

    这可能有助于您入门:  

    它使用 AVR/pic 生成任意且完全独立的脉冲来驱动伺服、但同样的概念也适用于此处。