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.
在 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);
您好、Charles、
我最初以为、就像您一样、这张海报的目的是 "制造 PWM 信号"。
在重复阅读时-我相信她寻求(相反)" 让 PWM 发生中的三角波与传入的、经过处理的正弦波进行比较"- 这不是 MCU 生成的(通常的) PWM 信号-这里。 (即非常不寻常)
因为(大多数情况下) "没有提供这一独特要求的理由"、甚至有很多经验-我无法注意到这种(不寻常)方法的"效用"。 如果"最终游戏"(甚至)被"暗示"、则有人建议采取另一种方法(可能)。
她的愿望似乎可以通过以下方式得到更好的实现:
她提到、 "过滤由 MCU 创建的 PWM 输出-但 PWM 周期(由她的示例显示)频率如此低-滤波器组件将"非常大"-并且必须"减少纹波"。
您好、Charles、
该帖子的"异常性质"-重点说明为什么-海报应包含(部分)详细信息-以解释其真正的目标。 减去(正确)海报指导(长建议)-在此处观察(经常)...
海报的"3300Hz" PWM 频率将极大地限制她的"重建能力"。 (如果确实-正如我的(多读)具有(行之间的读数)-"已取消"。)
当"标准、模拟组件 可能更好(即更快、更轻松、更直接)满足要求"时、将任何 MCU 分配给此类任务是我无法理解的...
[引用用户="Oriana Wong"]... 创建可在滤波 后模仿正弦曲线的变化占空比 PWM ... 这种切换发生在10kHz
没有提到您的目标精度-也没有提到(真实)最终目标。
我在朋友查尔斯提到过、我之前提到过一家(长期)过去的设计公司已经实施了、这(似乎)与您的设计要求"重叠"。
以下是我们生产的产品(> 25年前)-"发光、氖光-气体放电显示"-所需的信号处理-与您的产品类似: (如此处所示-专为我的设计的完整仪表板、"308GTB"- (COP/gurl 磁体)-意大利跑车[红色])
您应该注意2个线性条形图(左下)和1个圆形条形图(中心)。 两 个显示"偏转"(即生成这些条) -仅当"传入("您的"字)输入信号"超过应用 于单个模拟比较器的"线性、单调、循环、斜升信号"时。 当"始终 斜升(比较)信号"超限"("CoP"字 、"超限") 时、输入信号-不再有条形灯亮起。 (即 PWM 输出切换至逻辑"低电平"。)
因此、我们的模拟比较器方法产生 了一种"脉冲 PWM 输出" 、这与您建议的方法不太不同! 请注意、我们的信号不是正弦波、因此我们从要求"释放"到 了"精确同步到正弦波"、这(可能)是"您的命运"。 (很可能-您的命运...)
这种线性斜坡方法的另一个优点是"自动生成"一致的电平(和电平可调)脉冲"、其占空比(非常)准确地反映了" 传入信号的振幅"。
我能够快速确定(几种)您正确"同步到您的传入正弦波"的方法-(以便您可以利用我公司的成熟方法)-然而、由于这种方法是(仅)我的"最佳估计"(代表您)-我更愿意等待您的评论。
您是否可以注意到(大部分)您通过"基本"模拟比较器 IC 所寻求的-也许(仍然)可以很好地实现? 虽然您(可能)能够通过"正常/习惯 MCU-PWM "以外的(其他)"解决此问题"、但这需要"额外的时间和精力"(远远超出了我 代表您详细介绍的更快和更简单的方法)。
您是否意识 到您导入的工程图在显示(看起来)为三角"波形"的同时、实际上是 MCU 的"自由运行、计数器/计时器"(递增然后递减)的"视觉表示"-没有"三角、模拟波形"(据我的理解)-在内部或外部创建或可用。 (这是您的任务-通过适当的筛选器-它 将您返回到模拟领域。) (如前所述 - 在此处按一个...)
我不确定这里的问题是: "一个没有意义的问题。" 在我看来、相对"速度、易用性和(过去)久经考验的结果"-注册更高-
如果您(稍微)详细了解以下内容、将会很有用:
希望这一(必要)添加的详细信息 将促使(其他)提出他们的观点。
我的公司-最常-开始此类技术调查时、首先 是 "有条理的调查"(可从商业上获得) -然后"深入调查"-以了解我们的团队是否会、 (如果幸运的话) 会影响改进和/或节省... 您是否进行过此类调查? 如果是、您是否会认为 "列出您的发现?" (在 您的"助手 Crüe "上节省大量的"磨损/撕裂" - 这证明(肯定)您的关键目标中"高"-不是吗?)
[引用 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 的注释短语)、"我会(您会)回来!"
注意到没有(任何)错误规范、或"领导者指导"是正确/详细的。 (在"避免"( 仍然) 干扰时...)