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.
我正在尝试获取一个 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位"-我相信 、当 定时器处于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 运行的"所有其他"方面都没有-被限制? 这是可以接受的吗?
毫无疑问、您已经实现了"四相"输出。 明天-当员工到达时-我将看到他们是否可以"搜索/查找"(相当严重)使用要求-强制执行(过去)计时器同步。 (这可能已经解决了-我的大部分工作现在都解决了"R-52和 M7"(自动驾驶)、因此我不知道"修复此处" 是否已到达/成功。)
一个注意事项-我们的多相设计(需求)是在由我们每个相位驱动的"高侧和低侧"功率 FET 之间插入一个"死区"。 此类"死区"不能(直接)通过计时器实现实现、但可以通过您的 MCU (更先进的) PWM 发生器"完全/有效地可用"。 (可轻松生成具有可编程死区的"互补 PWM 信号"、可在(前沿和后沿)调节。)
您需要注意的是-这些 PWM 发生器可容纳多达4个通道-"完全满足"您的需求。 (但我们的产品不能满足客户(要求严格)规范、该产品可扩展至6-8个阶段。) 所有8个- PWM 发生器信号输出-可通过"单个 PWM 故障引脚!"立即"停止 "故障引脚"可以轻松高效地提供"过流保护"和/或(许多其他) PWM 信号过流...