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.

[参考译文] TM4C123GH6PM:将 PWM 用于 SPWM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/678508/tm4c123gh6pm-using-the-pwm-for-spwm

器件型号:TM4C123GH6PM

在 TM4C123GHPM 数据表中、图片中显示了以下示例。

我注意到、没有 Tivaware 方法允许我设置 PWM0CMPA 值。 我想利用此示例创建一个变化的占空比 PWM、该 PWM 在滤波后模仿正弦曲线。 其理念是让 PWM 发生器中的三角波与传入的、经过处理的正弦波进行比较(因此该值是经过某种处理的 ADC 读数)、如果三角波>正弦波、我将在 PWMA 上输出高电平、否则输出低电平。 理想情况下、这两个峰值的高度将相同、其中两个峰值均为3300。 此外、我希望此开关在10kHz 时发生。 我的代码是否如下?

我假设:

1) 1)负载值是 PWM 发生器三角波形的峰值(基于我对数据表的理解)

2) 2)我会使用计时器中断、使切换每100us (10kHz)发生一次

3) 3)为了更改比较、我要在计时器中断中更改 PWM0_0_CMPA_R 值、以匹配我当前的正弦波样本。

4) 为了将三角形的高度设为3300、因此如果它是80MHz 时钟频率、我希望在设置 PWMGenPeriodSet (PWM0_BASE、PWM_GEN_1、SysCtlClockGet ()/24250)方法时重新加载值为3299。

5) 5)在常规设置中、我应该设置 PWM_O_0_CTL=x80 // Gena 是本地同步    的、  PWM0CMPA= 0x000000E0 //当比较器 A 递增时驱动 pwmA 为低电平、当比较器 A 递减时设置为高电平、当计数器=0和装载时不执行任何操作。 如何在递增至压实器 A 的计数过程中确保输出为高电平?              

//设置
SysCtlPWMClockSet (SYSCTL_PWMDIV_1);//设置 PWM 时钟与乘法器为1
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0)的处理器时钟;
GPIPTL_Periph_GPIOB);GPIOPINBTL Configure

(GPIO_PB4_M0PM2_PHASE);GPIOPTOM_PWM4_PM2_PM_PHIN;GPIOPPM_PHIN

PWMGenConfigure (PWM0_BASE、PWM_GEN_1、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_DB_NO_SYNC);
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_1、 SysCtlClockGet ()/24250);//我希望三角形的高度为3300,所以如果它是80MHz 时钟频率,我希望重新加载为
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_2、2500* 50/100);
PWMOutputState (PWM0_BASE、PWM_OUT_BIT、PWM_OUT_2) 真);
PWMDeadBandEnable (PWM0_BASE、PWM_GEN_1、0xF、0xF);
GPIO_PORTB_DR8R_R |=0xC0;// 8mA 输出
PWMGenEnable (PWM0_BASE、PWM_GEN_1); 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     请看下面的图表。 为什么不在表中预先记录所有占空比。 当计数器到达零时生成一个 PWM 中断并重新加载下一个新的占空比。 例如、您首先从占空比为75%的脉冲开始、然后在下一个 PWM 周期中将占空比更改为93.3%、以此类推。 此示例将正弦波分为(数字化) 12个样本。 您可以增加采样点。 您要做的是创建变化的占空比 PWM。 一旦 PWM 信号通过低通滤波器运行、您将看到一个正弦波。  

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

    您好、Charles、

    我最初以为、就像您一样、这张海报的目的是 "制造 PWM 信号"。    

    在重复阅读时-我相信她寻求(相反)" 让 PWM 发生中的三角波与传入的、经过处理的正弦波进行比较"- 这不是 MCU 生成的(通常的) PWM 信号-这里。   (即非常不寻常)   

    因为(大多数情况下) "没有提供这一独特要求的理由"、甚至有很多经验-我无法注意到这种(不寻常)方法的"效用"。   如果"最终游戏"(甚至)被"暗示"、则有人建议采取另一种方法(可能)。

    她的愿望似乎可以通过以下方式得到更好的实现:

    • 缓冲她的原始正弦波信号
    • 然后、通过传统模拟比较器(该比较器定期具有"比较电压"、"根据需要进行调整")来运行该(缩放或放大的)信号(根据需要)。  通过这种方式-将实现"恒定电平输出(她的目标之一)-并且脉宽(占空比)将基于"可调电压"的电平-被馈送到"比较器(其它)输入。  (即该电压的电平越高、脉宽/占空比越低。
    • 通过增加这些脉冲的频率、"比较器电压设置"-可以控制 PWM 脉冲的频率。

    她提到、 "过滤由 MCU 创建的 PWM 输出-但 PWM 周期(由她的示例显示)频率如此低-滤波器组件将"非常大"-并且必须"减少纹波"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    谢谢。 您让我返回帖子并再次阅读。 :-)也许我不理解所问的是什么,最重要的是要实现什么。 我首先读出"我想利用此示例来创建一个变化的占空比 PWM、该 PWM 在滤波后模仿一条正弦曲线。" 它的作用是使用不同的 PWM 创建正弦波信号并通过低通滤波器运行。 我想这张海报可以再详细说明一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    该帖子的"异常性质"-重点说明为什么-海报应包含(部分)详细信息-以解释其真正的目标。   减去(正确)海报指导(长建议)-在此处观察(经常)...

    海报的"3300Hz" PWM 频率将极大地限制她的"重建能力"。   (如果确实-正如我的(多读)具有(行之间的读数)-"已取消"。)

    当"标准、模拟组件 可能更好(即更快、更轻松、更直接)满足要求"时、将任何 MCU 分配给此类任务是我无法理解的...

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

    [引用用户="Oriana Wong"]... 创建可在滤波 后模仿正弦曲线的变化占空比 PWM ...  这种切换发生在10kHz 

    没有提到您的目标精度-也没有提到(真实)最终目标。

    我在朋友查尔斯提到过、我之前提到过一家(长期)过去的设计公司已经实施了、这(似乎)与您的设计要求"重叠"。

    以下是我们生产的产品(> 25年前)-"发光、氖光-气体放电显示"-所需的信号处理-与您的产品类似:       (如此处所示-专为我的设计的完整仪表板、"308GTB"- (COP/gurl 磁体)-意大利跑车[红色])

    您应该注意2个线性条形图(左下)和1个圆形条形图(中心)。   两 个显示"偏转"(即生成这些条) -仅当"传入("您的"字)输入信号"超过应用 于单个模拟比较器的"线性、单调、循环、斜升信号"时。   当"始终 斜升(比较)信号"超限"("CoP"字 、"超限") 时、输入信号-不再有条形灯亮起。  (即 PWM 输出切换至逻辑"低电平"。)  

    因此、我们的模拟比较器方法产生 了一种"脉冲 PWM 输出" 、这与您建议的方法不太不同!   请注意、我们的信号不是正弦波、因此我们从要求"释放"到 了"精确同步到正弦波"、这(可能)是"您的命运"。   (很可能-您的命运...)

    种线性斜坡方法的另一个优点是"自动生成"一致的电平(和电平可调)脉冲"、其占空比(非常)准确地反映了" 传入信号的振幅"。   

    我能够快速确定(几种)您正确"同步到您的传入正弦波"的方法-(以便您可以利用我公司的成熟方法)-然而、由于这种方法是(仅)我的"最佳估计"(代表您)-我更愿意等待您的评论。

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

    我想比较一个三角波和正弦波、因此这些比较将为并网 H 桥逆变器中的开关提供 PWM 信号。 通过比较三角波和正弦波、将生成两个 PWM 信号、在一个外部滤波器之后、这两个信号将是一个正弦波。 最终结果是执行功率流、因此我的输出正弦需要是传入正弦波的时移版本。 我希望我的比较每100us 发生一次、但我不确定是将我的 PWM 周期设置为该值(80MHz/10kHz)、还是将其设置为另一个参数。

    如果我没有任何意义、请告诉我。 我希望使用 PWM 比较器作为以10kHz 运行的三角波、我将正弦波与进行比较、但我不确定是否使用了所有正确的寄存器和设置。 我还想控制三角波的高度、但我不确定这是否可行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否可以注意到(大部分)您通过"基本"模拟比较器 IC 所寻求的-也许(仍然)可以很好地实现?   虽然您(可能)能够通过"正常/习惯 MCU-PWM "以外的(其他)"解决此问题"、但这需要"额外的时间和精力"(远远超出了我 代表您详细介绍的更快和更简单的方法)。

    您是否意识    到您导入的工程图在显示(看起来)为三角"波形"的同时、实际上是 MCU 的"自由运行、计数器/计时器"(递增然后递减)的"视觉表示"-没有"三角、模拟波形"(据我的理解)-在内部或外部创建或可用。    (这是您的任务-通过适当的筛选器-它 将您返回到模拟领域。)   (如前所述 - 在此处按一个...)  

    我不确定这里的问题是: "一个没有意义的问题。"    在我看来、相对"速度、易用性和(过去)久经考验的结果"-注册更高-

    如果您(稍微)详细了解以下内容、将会很有用:

    • 您的精度要求 (已申请-尚未到达)
    • 指定  输出正弦 的"时移"的"规格"
    • 解释为何每100µS ( 10kHz)寻求比较
    • 解释您在三角波的"控制高度"(假设为信号电平)中的目标
    • 解释正弦波不具有类似控制的"电平"的原因
    •  询问 "您的讲师或上司在哪里"以及他们的"专业知识/指导"是否"公平/恰当"?   (如果您的项目是"DRM 限制"项目-我们是否可以注意到、"制造过程中的噩梦?")

    希望这一(必要)添加的详细信息 将促使(其他)提出他们的观点。   

    我的公司-最常-开始此类技术调查时、首先 是 "有条理的调查"(可从商业上获得) -然后"深入调查"-以了解我们的团队是否会、 (如果幸运的话) 会影响改进和/或节省...   您是否进行过此类调查?    如果是、您是否会认为 "列出您的发现?"   (在  您的"助手 Crüe "上节省大量的"磨损/撕裂" - 这证明(肯定)您的关键目标中"高"-不是吗?)

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

    您好!

    仅供您参考、我想添加以下链接:

    此致。

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

    这当然是 Don Lancaster 先生的“nom de plume”——TTL、CMOS、视频(甚至是“廉价视频之子”)(真的)“烹饪书”的名号。

    总是很高兴能看到你的返回-祝你一切顺利-感谢你们的参考。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "想法是让 PWM 发生器中的三角波与传入的、经过处理的正弦波进行比较(因此该值是经过某种处理的 ADC 读数)、如果三角波>正弦波、我会在 PWMA 上输出高电平、否则输出低电平。"

    您的代码没有 ADC、因此您的代码无法执行您想要的操作。

    此外、您的用例很难理解。 听起来好像您正在尝试重新创建您已经拥有的正弦波。

    话虽如此、您的代码可细分为以下几种:

    1.读取 ADC;
    2.生成斜坡;
    3.如果 ADC >斜坡、输出高电平;否则、输出低电平。

    您只需要相应地进行编码。

    多种实现方法:

    1)如上所述、使用模拟比较器;
    2)使用数字比较器:ADC 与单个斜率计时器计数(作为斜坡);
    (笑声)

    但您必须弄清您在这里要做的事情。 众所周知、SPWM 并不是您在这里尝试的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Oriana Wong"]我注意到 没有允许我设置 PWM0CMPA 值的 Tivaware 方法

    此陈述(您的第二句、开场白)是否真的正确?    而是由那些强制 执行"DRM 和 Only DRM"的人"提供"作为编码工具吗?

    您应该注意到供应商广泛的 API、 "提供"源代码"(在不久的过去很少在这里或其他地方证明这种情况)。

    检查这一(相对)明显的 API 函数: "PWMPulseWidthSet()-与您引用的语句冲突-不是吗?

    无效
    PWMPulseWidthSet (uint32_t ui32Base、uint32_t ui32PWMOut、
    uint32_t ui32宽度)




    //写入相应的寄存器。    我们已经"下拉"到最后一个"代码块"-包含在这个长期 API 函数中。
    //
    if (PWM_is_output_odd (ui32PWMOut))

    HWREG (ui32GenBase + PWM_O_X_CMPB)= ui32Reg;

    其他

    HWREG (ui32GenBase + PWM_O_X_CMPA)= ui32Reg;

     供应商的 API 的扩展性和功能应该(最常)证明 "极大地有益于您!"    (即使(特别是在)它的使用"被他人阻止"(毫无道理)时。)

    没有任何东西能阻止那些聪明而又资源丰富的 "API 用户利用者"- 认真审查了关键寄存器-在它们(经过验证和长时间验证) 的"API 函数调用!"中引用了这些寄存器   毫无疑问、这证明了获得 "真正的 MCU 能力和掌握/理解!"的最佳方法    (同时 释放用户(大量的多余时间和精力) ( 始终)" 非常弱" (甚至) "未经测试" DRM 代码(探险)...

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

    PWM 定时器不能是斜升信号吗? 我认为 SPWM 是“通过将所需的基准波形(调制信号)与高频三角‘载波’进行比较来生成所需的输出电压”。 我认为我的方法是尝试使用 PWM 计时器作为斜坡信号、并使用其比较器作为决定信号。

    精度将是输出正弦波、在滤波之后、没有与我正在读取的正弦波具有相同幅度的谐波、但会随着时间的推移而变化或包含相移。
    时移是我正在读取的正弦波、但移位了 X 度数、因此它不会与我正在读取的正弦波完全同相。
    我将用一个比率控制任一信号、所以我可以修改正弦波而不是三角波高度。

    对于 Tivaware 函数、您可以通过设置 PWM 脉冲宽度来设置占空比、但我不知道我的脉冲宽度? 这取决于我的比较、因此我不相信 PulseWidthSet 方法会起作用...

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

    (Danny 的注释-海报似乎回应了我(之前) 的(系列)帖子-尽管她点击了您的...)

    您(O.P.) 似乎(强烈)仍然对您的原始方法表示支持-尽管-尤其是-这里有两个发现(实质性)缺点。

    请注意、 您现在所说 的"不要相信"PulseWidthSet 方法会起作用"- STrays 远非您之前所说的" 没有 Tivaware 方法  允许我设置   PWM0CMPA 值。"    从哪里(错了)出现了"无 Tivaware 方法"?   这涉及到"辅导"、当关键问题(仍未得到解答)未得到解答时、您的(无)帮助者会付出很大的额外努力。   动机会侵蚀!

    [引用 user="Oriana Wong"]我不知道我的脉冲宽度? 这取决于我的比较、因此我不相信 PulseWidthSet 方法会起作用...[/quot]

    然而-这种想法是否不 是"循环"?   源代码-之前为您突出显示-清楚地描述 了设置"PWM 比较器值!"中"PWMPulseWidthSet()"的有效性   因此-如果"比较器值已知-同样- PWM 脉宽...

    (仍然)没有显示 您(可能)需要的准确性 (例如(某些)重要性-是否重要)-并且多个问题-试图"推断"此类"合理数据"-仍然... 没有响应。

    如果您觉得很好、请列出 "讲师/老板"提供的指导 -他们必须提供一些"指导"-是否这样?     (我们不 会试图 "剥夺他们" 对 您 (继续)的进步做出贡献...)

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

    我认为(进一步) "多做些事"(   即(部分 " 指导您的项目!"中参与"、这很有用。   现在你已经努力准确地详细说明了-但是事实是 (赦免) "被淘汰" - 有时 甚至根本不会到达

    您应该知道 "三个在这里" - " 独立地" -意识到了这一点。    遵循海报"Danny"中的2个重要评论:

    • 您必须弄清 -这里要做的是什么

    • 您的用例很难理解

    "丹尼"和我都没有沟通过、但我们 的"不适" 很常见、 并且非常一致!   (此类 协议 -"让我"脱离"我(有时)的专有角色 、"沉重!")     这种 "宽松指导"的条件下、过度使用此论坛资源(相当可预测)!   并减少论坛的预期" 服务交付"。   

    没有人会责备你(信使) 、但是 那些"引导你的努力"应该证明"更愿意"  (即"有点愿意")参与。   (要么 在幕后,要么在这里,实际上... 海报 Danny 和我-发现自己"同样"忙碌-如果不是更多的话-比那些"幕后"演员...)

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

    看起来您正在尝试使用 PWM 来生成正弦波。 因此、您对 spwm 的使用是正确的、除非您对它的理解是错误的。

    实质上、您将正弦波的幅度信息转换为占空比。 例如、在0时、您以50%的速度运行 PWM。 在时间1,您以51%的速度运行它 ,...

    通过控制更新占空比的速度、您可以控制输出频率。 通过控制每步长的占空比变化、您可以控制振幅。

    这就是 spwm 的工作方式。

    但是、在某些情况下、您可以通过将输出保持为1或0来简化该过程、从而重现正弦输出。 这种方法可以产生非常快的波形。

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

    下面是实施上述第二种方法的示例。

    代码在 AVR 上运行、但 TM4C 的逻辑是相同的:

    /lsb 至 msb、8位* 4*8 = 256点
    const uint8_t spwm_table[]={
    254、247、191、191、247、 118、91、171、
    170、148、 68、66、8、8、64、 0、
    0、1、32、32、 132、72、146、82、
    213、 218、182、123、239、239、 255、253、
    
    };
    
    while (1){
    //生成 spwm
    //发送当前位
    if (spwm_table[spwm_index]& spwm_mask) io_set (SPwm_port、SPWM);否则 IO_CLR (SPwM_port、SPWM);
    spwm_mask = spwm_mask << 1;//如果
    已发送 swm_mask (spwm_port、
    
    则提前掩码= 1);spwm_m_mask = 1;/spwm_m_m_mask = 1;/spwm_m_mask = spwm_m_m_m_mask = 1;/spwm_m_m_mask = s//如果
    (spwm_index = 32) spwm_index = 0,则提前字节索引;
    }
    
    

    以下是数字和模拟等效的输出:

    这种方法的优势在于其简单性:无需 PWM 模块。 您只需定期输出 PWM、就像从计时器 ISR 中输出一样、数字输出将重现波形。 整个例行程序在8人痛苦的情况下只需不到40条指令。 32位芯片上的功耗更低。

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

    [引用 user="Danny F"]您的代码没有 ADC,因此您的代码无法执行所需的操作。

    海报是否不希望: "样片、重新创建和时间变换" 她的原始、 "传入、正弦波"(以某种方式)被丢弃?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不、回答给了我如何重新创建正弦波的答案。 我有采样和时间转换的想法。

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

    祝您一切顺利-我们希望您(很快)能遵守(Arnold 的注释短语)、"我会(您会)回来!"
    注意到没有(任何)错误规范、或"领导者指导"是正确/详细的。   (在"避免"( 仍然) 干扰时...)