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.

[参考译文] CCS/EK-TM4C1294XL:难以使用建议的功能正确设置 PWM 时钟...

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/604645/ccs-ek-tm4c1294xl-difficulty-setting-pwm-clock-correctly-using-recommended-function

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:TM4C123

工具/软件:Code Composer Studio

大家好、

因此、这是我遇到的一些问题:

在所附的代码中、我尝试生成具有特定周期(50Hz)的简单 PWM 伺服类型控制、并使用 ADC 输入在限制范围内调整占空比。

1) 1)我已经使代码按照给定的方式使用 SysCtlClockFreqSet 函数、在这里我生成一个120MHz 时钟、然后使用建议的 PWMClockSet 将 PWM 时钟除以64。 问题是、如果我需要在远离计算机的地方远程使用评估板、它不会在关闭评估板电源时占用空间。

2) 2)现在、当我使用 SysCtlPWMClockSet 函数时、不建议将该函数用于1294器件、使用我的上述系统时钟设置时、我似乎无法获得可靠的 PWM 输出以达到50Hz。 但是、使用此函数可将设置保留在仅通过 USB 掉电和上电时的位置、并将其可靠地保存在存储器中。

提前有任何想法和感谢吗?

#include 
#include 
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/tm4c1294ncppdt.h"
#include "driverlib/adc.h"
#include "driverlib/pin_map.h"

#include "driverlib/pin/sysctwm"#driverlib/m_swm.h



浮空周期1;
浮点循环1;
};

#define MAX_Counts 4096.0F

int
main (void)
{
浮点 PM;
结构 PWM_PAIR 占空比;

//Section 1-此模块激活 ADC0及其关联的 GPIO 端口
//*********
//该数组用于存储从 ADC FIFO 读取的数据。 它
//必须与正在使用的序列发生器的 FIFO 一样大。 此示例
//使用 FIFO 深度为1的序列3。 如果是另一个序列
//与更深的 FIFO 一起使用,则必须更改数组大小。
//
uint32_t pui32ADC0Value[1];

//
//使用 PLL 将时钟设置为在25MHz 下运行。 时间
//使用 ADC,您必须使用 PLL 或提供一个120 MHz 的时钟
//源。
SysCtlClockFreqSet (SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480、12000000);

//必须启用 ADC0外设才能使用。
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

//
//需要启用 GPIO 端口 E
//因此可以使用这些引脚。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

//
//为这些引脚选择模拟 ADC 功能。
//请查阅数据表以查看每个引脚分配的函数。
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);

//
//使用处理器信号触发器启用采样序列3。 序列3
//将在处理器发送信号启动时执行单次采样
//转换。 每个 ADC 模块有4个可编程序列、序列0
//至序列3。 此示例任意使用序列3。
//
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);

//
//在序列3上配置步骤0。 对中的通道0 (ADC_CTL_CH0)进行采样
//单端模式(默认)并配置中断标志
//(ADC_CTL_IE)将在采样完成时置1。 告诉 ADC 逻辑
//这是序列3上的最后一次转换(ADC_CTL_END)。 序列
// 3只有一个可编程步骤。 序列1和2有4个步骤、和
//序列0有8个可编程步骤。 因为我们只做一个
//使用序列3进行转换,我们将仅配置步骤0。 了解详情
//有关 ADC 序列和步骤的信息、请参考数据表。
//
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE |
ADC_CTL_END);

//
//由于采样序列3现在已配置,因此必须将其启用。
//
ADCSequenceEnable (ADC0_BASE、3);

//
//清除中断状态标志。 这样做是为了确保
//中断标志在我们进行采样之前被清除。
//
ADCIntClear (ADC0_BASE、3);

//Section 2 -这个块激活 PWM0模块0及其
//相关 GPIO 端口
//*********
//将 PWM 时钟设置为与系统时钟相同的频率
PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_64);
//SysCtlPWMClockSet (SYSCTL_PWMDIV_64);
占空比1 = 37500;50Hz 时的//开关周期=>(1/50Hz)*(120MHz/64)
Duty.Cycl1 = Duty.period1 * 0.1025;//15%占空比(已调谐)

SysCtlPeripheralEnable (SYSCTL_Periph_PWM0);//启用 PWM 模块0的控制

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);//启用 GPIO F 控制

GPIOPinConfigure (GPIO_PF0_M0PWM0);//将 PF0映射到 PWM0 Gen0、OP 0

GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_0);//将 PF0配置为 PWM

PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN |
PWM_GEN_MODE_NO_SYNC);//将 PWM0 Gen0配置为递减计数器、不同步更新

PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、Duty.period1);//设置 PWM0 Gen0的周期

PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、Duty.Cycl1);//设置 PWM0 Gen0的占空比

PWMOutputState (PWM0_BASE、PWM_OUT_0_BIT、TRUE);//在 PWM0 Gen0上启用 OP 0

PWMGenEnable (PWM0_BASE、PWM_GEN_0);//启用 PWM0、Gen0
//Section 3 -本部分的目的是使 ADC0在输入电压发生变化时连续采样
//要更改存储在 pui32ADC0Value 中的值,该值随后应在中更新 PWM0的脉冲宽度
//5和15%占空比。
//

//永久采样 AIN0。

while (1)
{
//
//触发 ADC 转换。
//
ADCProcessorTrigger (ADC0_BASE、3);

//
//等待转换完成。
//
while (!ADCIntStatus (ADC0_BASE、3、false))
{
}

//
//清除 ADC 中断标志。
//
ADCIntClear (ADC0_BASE、3);

//
//读取 ADC 值。
//
ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);

//
//此函数提供了生成恒定长度的方法
//延迟。
SysCtlDelay (SysCtlClockGet ()/12);


PM = pui32ADC0Value[0]/ MAX_Counts;//使用存储的采样值作为比率,ADC 最多12位计数
if (PM * Duty.Cycle1 > Duty.Cycle1 / 1.95){//硬限制、使10ms 脉冲宽度最小(调谐)
PWMPulseWidthSet (PWM0_BASE、PWM_OUT_0、PM * Duty.Cycl1);//设置 PWM0 Gen0的占空比
}

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    函数 SysCtlClockGet ()仅适用于 TM4C123器件(第149行)。 您可以使用 SysCtlClockFreqSet()中的返回值,或者如果频率没有变化,只需用常量定义它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Bob、明白了。 但有趣的是、这以前没有引起问题、因为它仅在外设手册中提到123个器件。 但是、更改此项似乎不能缓解我原来的问题。

    我确实注意到了另一个行为、当我单步执行代码直到 PWMClockSet 函数进入它时、它会被挂起、从 PWM.c 文件重定向、并在_startup_ccs.c 文件的 FaultISR 内无限 while 循环进入此函数。

    但是、再说一遍、使用不推荐的函数 SysCtlPWMClockSet、虽然它不会生成所需的输出周期、但工作始终如一。 如果我只能锁定50Hz 的正确频率、就足够好了...