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:读取脉宽时出现问题(续)

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/694255/ek-tm4c1294xl-trouble-reading-pulse-width-continued

器件型号:EK-TM4C1294XL

您好!

我已经收到 Bob Crosby 的帮助。 直到 bob 帮助我、我无法获得已知 PWM 的任何恒定读数。 现在、我确实获得了已知脉冲长度的 PWM 的恒定读数、但我有一个不正常的现象-我想将我的脉冲长度转换为时间、我必须进行分频(120*10^6)才能在数秒内得到我的答案。 但事实并非如此、我必须使用另一个常量在几秒钟内获得我的答案。 它是一个很好的价值120*10^6 -接近200万.

如果我使用该常数、在将其与示波器进行比较时、我可以获得准确(在误差范围内)的脉冲长度读数(其中包括具有不同脉冲长度的 PWM) 但我想知道什么可能导致我的问题、以及这个问题是否可能在将来成为一个大问题。

以下是我的脉宽相关代码(我目前只想读取一次脉冲):

#include 
#include 
#include 
include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "inc/hw_pwm.h"
#include "driverlib/driverlib/driver.h"



#include "driverlib#driverlib.driver.h"#driverlib#driverlib.driverlib#driverlib#driver.h"#include "driverlib.driverlib#driverlib#driver.h"#include "driverlib#driverlib.driverlib#driverlib.driver.h"#include "driverlib#driverlib.driverlib#driverlib.driver.h"#include "driver.h"#driverlib#driverlib.driverlib.driverlib#driverlib.driverlib#driverlib.driver.h"#include "driver.h"#include "driverlib#driverlib.driv








#include 
#include "driverlib/sysctl.h"

//时钟
uint32_t g_ui32SysClock 的全局变量声明;

// Pulse
uint32_t start = 0、end = 0、length = 0;

void Pulse_Length (void)
{
//
//启用 GPIO 和计时器0
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

//
//在中配置 GPIO 定时器引脚
//
GPIOPinConfigure (GPIO_PD0_T0CCP0);
GPIOPinConfigure (GPIO_PD1_T0CCP1);
GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1);

//
//初始化计时器 A 和 B,以便在边沿计时模式中向上计数
//
TimerConfigure (TIMER0_BASE、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP | TIMER_CFG_B_CAP_TIME_UP));
TimerClockSourceSet (TIMER0_BASE、TIMER_CLOCK 系统);
//
//定时器装载值
//
TimerLoadSet (TIMER0_BASE、TIMER_Both、0xFFFFFFU);

//
// Timer A 记录正边沿时间,Timer B 记录负边沿时间
//
TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_POS_EDGE);
TimerControlEvent (TIMER0_BASE、TIMER_B、TIMER_EVENT_NEG_EDGE);



//注册一个在计时器到达正边沿触发 int 时要调用的中断函数
IntRegister (INT_TIMER0A、RisingEdge);
//将中断设置为最高优先级
IntPrioritySet (INT_TIMER0A、0);
//确保清除中断
TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
//启用指示的定时器中断源。
TimerIntEnable (TIMER0_BASE、TIMER_CAP_EVENT);
//在中断控制器中启用指定的中断。
IntEnable (INT_TIMER0A);

//注册一个中断函数,当计时器到达 neg edge trig int 时调用该函数
IntRegister (INT_TIMER0B、FallingEdge);
//将中断设置为最高优先级
IntPrioritySet (INT_TIMER0B、0);
//确保清除中断
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
//启用指示的定时器中断源。
TimerIntEnable (TIMER0_BASE、TIMER_CAPB_EVENT);
//在中断控制器中启用指定的中断。
//IntEnable (INT_TIMER0B);

TimerEnable (TIMER0_BASE、TIMER_Both);//需要在配置计时器
后到达}

void RisingEdge (void)
{
// if (pultrulate_start = PulseState)
//{
TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
START = TimerValueGet (TIMER0_BASE、TIMER_A);
// PulseState = PULSE_POS;
IntDisable (INT_TIMER0A);
IntEnable (INT_TIMER0B);
//}


void FallingEdge (void)
{
// if (pulse_POS == PulseState)
//{
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
结束= TimerValueGet (TIMER0_BASE、TIMER_B);
if (结束<开始)
{
结束=结束+ 0x10000;
}
长度=结束-开始;
// PulseState=PULSE_NEG;
//}
//IntEnable (INT_TIMER0A);//这对于感知脉冲是禁用的
IntDisable (INT_TIMER0B);
}

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

FPUEnable();
FPUoundingModeSet (FPU_ROUN_POS_INF);
Pulse_Length ();

IntMasterEnable();
while (1)
{
SysCtlDelay (40000000);
UARTprintf ("长度=%d\n"、长度);
}
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在示波器上测量的脉冲有多长时间? 如果它长于546uS、则计时器溢出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:
    您完全正确、我愚蠢地测试了脉冲长度大于546us。 我也知道,我承认这是我们上次谈到这种情况时的限制,这使这种情况更加令人尴尬。

    现在、对于我的最终应用、我将测量该范围内(介于3kHz 和6kHz 之间)的脉冲、因此我在这里可以正常工作。

    但是、我对这一点很好奇、如果我要提高我的极限<start) and adding 0x10000 for each time? 、我可以在每次滚动时(aka)进行跟踪 (似乎很难让代码在每次翻转时将变量递增一个且只递增一个)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可以通过多种方法来扩展 PWM 测量范围。 您可以将预分频器与半宽计时器配合使用、同步和使用两个32位计时器、使用较慢的计时器时钟源(如 PIOSC)或跟踪溢出。

    要按照上述帖子中的建议跟踪溢出、请启用 TimerB 超时以及捕获事件中断。 在"易失性静态"变量中创建溢出计数器。 在计时器 A 中断例程中、将溢出计数器归零并捕获您的起始值。 在定时器 B 中断服务程序中、检查超时和捕捉事件。 如果只设置了超时标志、则使溢出计数器递增。 如果仅设置捕获标志、则计算结束时间加上溢出次数的0x10000倍。 如果同时设置了超时和捕获事件标志、则必须确定捕获的值是在超时之前还是之后。 只需简单地检查捕获的值是否大于0x8000就足够了。 如果捕获值< 0x8000、则在计算经过的时间之前递增溢出计数器。 否则、计算经过的时间而不递增溢出计数器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢!