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.

[参考译文] EK-TM4C1294XL:如何更改 PWM 频率?

Guru**** 2475160 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/685928/ek-tm4c1294xl-how-can-i-change-pwm-frequency

器件型号:EK-TM4C1294XL

大家好、我正在使用以下代码来生成 PWM 信号、我最终希望它以这种方式工作、我希望它生成特定频率、然后我将获得一个中断、让我切换到不同的频率。 目前、我尚未设置中断、但尝试使用延迟来模拟预期的操作。 因此、我基本上让它产生一个特定的频率、一段时间内的延迟、然后在延迟之后切换频率。 但是、每当我尝试进行此更改时、我都无法执行此操作、我最终会进入故障 ISR 循环。

在 PWMOutputState更改并重新配置 PWMdisable 之前、我尝试使用 PWMdisable 并将其设置为 false。 我还尝试仅更改 PWMGenPeriodSet 和 PWMGenWidthSet 而不再次调用完整函数、但也失败了。

我们将感谢您的任何帮助或想法。

void
configurePWM (int test)
{

uint32_t 节拍;
节拍数= TEST;//NUMBER_TICKS_Freq ();

//PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT | PWM_OUT_1_BIT、false);
//PWMGenDisable (PWM0_BASE、PWM_GEN_0);


//
//启用 PWM 使用的 GPIO 外设(PF0、最终为 PF1)
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);

//
//启用 PWM0
//
SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);

//
//将时钟分频以供 PWM 使用-现在将使用一个
//
SysCtlPWMClockSet (SYSCTL_PWMDIV_1);

//
//解锁引脚
//
HWREG (GPIO_PORTF_BASE + GPIO_LO_LOCK)= GPIO_LOCK_KEY;
HWREG (GPIO_PORTF_BASE + GPIO_O_CR)= 0x01;

//
//为 PWM 配置 GPIO 引脚
//
GPIOPinConfigure (GPIO_PF0_M0PWM0);
GPIOPinConfigure (GPIO_PF1_M0PWM1);

GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0 | GPIO_PIN_1);

//
//配置 PWM
//
PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC);

//
//设置 PWM 周期
//
PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、ceil (tick));

//
//设置占空比
//
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、ceil (tICKs/2));
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_1、ceil (tICKs/2));

//
//启用 PWM
//
PWMGenEnable (PWM0_BASE、PWM_GEN_0);
PWMOutputInvert (PWM0_BASE、PWM_OUT_1_BIT、TRUE);
PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT | PWM_OUT_1_BIT、TRUE);

}

int
main (void)
{
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);


configurePWM (1000);
//configureUART();
//IntMasterEnable();//使处理器响应中断。
//Induction Pulse ();
SysCtlDelay (40000000*10);//40000000 = 120MHz/3 = 1秒、因此这应该是10秒-在之前的论坛中阅读、了解如何接近1秒的延迟
configurePWM (500);

// SysCtlDelay (400000);


//TimerEnable (TIMER0_BASE、TIMER_Both);

while (1)
{

}
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试单步执行您的代码、并确切确定哪条线会导致您出错。 我假设问题是在已启用的外设上调用 SysCtlPeripheralEnable()。

    最好在这样的初始启用之后放置 while (!SysCtlPeripheralReady())。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用断点,我发现 PWM 仅在第二次调用 configurePWM()函数后生成,然后转至故障 ISR 循环
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在发布断点消息时发布了断点消息。 我添加了该 while 环路、它现在起作用了。

    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最后一个问题是、为什么我必须调用整个函数? 我假设我必须更改周期和宽度、因为当我更改周期和宽度时、它仍然不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的欢迎。 有时、写下问题的行为会激励人们找到解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为您不需要再次调用整个函数。 PWMPulseWidthSet()和 PWMGenPeriodSet()应该改变频率。 这是否起作用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    完全同意海报 Peter 的评估。     如果 您 唯一需要   的话、无需"调用 PWM 设置/配置"来改变 PWM 频率和/或占空比。   

    您应该注意、有一些"特殊技术可用于更改占空比 -同时 避免产生"runt" 或其他"变形 "PWM 脉冲!

    再次怀疑插入"外设就绪"和/或"延迟"将实现您的目标。   演示 更新后的代码是否对您更有用?  (清楚地显示您 的精简占空比更新代码。    强迫猜测-由你的帮助者 Crüe 证明是最低的效率……)

    我的公司-近乎持续- 命令"逐周期"电流环路控制 -通过 占空比变化 (而不是频率)和"占空比的函数调用... " 是 "所有必需的"。

    您  该函数中使用了一个变量-我要用"硬编码-安全值"替换该变量 、以消除该变量作为 "潜在问题"。    按照  kiss 指示添加这些变量 -只应在 程序 成功后才会发生 !