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.

[参考译文] TM4C1294NCPDT:测量周期模式捕捉

Guru**** 2439560 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/613043/tm4c1294ncpdt-measure-period-mode-capture

器件型号:TM4C1294NCPDT

你好。
我正在编写一个代码来测量振荡器电路555的周期。
我配置了两个计时器、Timer0A 每1秒用于中断、Timer1A 用于捕获模式。
Timer0A 中断工作正常、但 Timer1A 未被定向到中断。

遵循配置代码...
我已经就这个问题对论坛进行了研究,但我无法解决这个问题。
注:代码未完成、但未定向到中断。
谢谢你。

#define VET_Transmit 20
#define VET_PERIOD_FREQ 50
#define FREQ_MICRO 16000000.0

void Config_Clock (void);
void Config_Timer (void);

uint32_t g_ui32Clock;
uint32_t Tempo = 0、allCaped = 0;

volatile UINT32_t count、Edge1、Edge2、Edge2 Period[VET_PERIOD_FREQ]、t = 0、l = 0、
FLAG = 0、TX_INDEX = 0、TEMP = 0、segundo = 0;
volatile float freq[VET_PERIOD_FREQ]、 CAP = 0、media_freq = 0、soma_freq = 0;
char buffer[VET_transmit、I = 0;

void main (void)
{

CONFIG_Clock();
CONFIG_Timer();

while (1)
{

标志= 0;//初始化新捕捉的计数

IF (全培养= 1)
{

allCaped = 0;

IF (Edge2 > Edge1)
{ //如果发生溢出,则忽略计算

Period[t]= Edge2 - Edge1; //计算周期
T++;
Edge1 = Edge2;

}
}

}

void Config_Clock (void)
{

G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、
120000000);
}

void Config_Timer (void)
{

//------ 配置 TimerA0 Interupcao cada 1s--------------- //
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);//恢复时钟参数 o 计时器
TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICRACRACASE);//配置计时器参数可互连周期
TimerLoadSet (TIMER0_BASE、TIMER_A、g_ui32SysClock);//gera UMA interupcao a cada 1s
TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
TimerEnable (TIMER0_BASE、TIMER_A);
IntEnable (INT_TIMER0A);

///---------------- Timer2A 模式捕捉--- //
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);//启用用于输入边沿计数的 GPIO 端口
GPIOPinTypeTimer (GPIO_PORTM_BASE、GPIO_PIN_0);//将 PM0配置为定时器2A 上的正边沿捕获
GPIOPinConfigure (GPIO_PM0_T2CCP0);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);//用于边沿计时模式
TimerConfigure (TIMER2_base、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME));
TimerControlEvent (TIMER2_base、TIMER_A、TIMER_EVENT_NEG_EDGE);
TimerIntEnable (TIMER2_base、TIMER_CAP_EVENT);
TimerEnable (TIMER2_base、TIMER_A);//启用计时器
IntEnable (INT_TIMER2A);//为计时器启用中断
IntMasterEnable();
}

void Interrupt_Timer0A (void)
{

TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
Tempo ++;

}

void Interrupt_Timer2A (void)
{

uint32_t InterruptFlags = TimerIntStatus (TIMER2_base、true);

IF (InterruptFlags & TIMER_CAP_EVENT)
{

如果(!flag)
{
//捕获第一个边沿计时器值并指示程序已在第一个边沿捕获
Edge1 = MAP_TimerValueGet (TIMER2_base、timer_A);
Flag = 1;
}
//捕捉到下降沿后、存储完成采样的第二个上升沿的值
否则 IF (标志)
{
Edge2 = MAP_TimerValueGet (TIMER2_base、timer_A);
//表示计算所需的全部三个边沿均已捕获并准备好计算
已全部捕捉= 1;

}
}
//清除中断标志以使能中断再次发生。
TimerIntClear (TIMER2_base、TIMER_CAP_EVENT);

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您设置 TimerA1来对下降沿进行计数、但未设置匹配值。 是否要在一定数量的下降沿之后生成中断? 如果您通过对边沿进行计数来测量一秒的频率、那么只需读取 timerA1计数值、然后在一秒中断例程中将其清除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Boa tarde Ricardo、

    请您自己并愿意帮助您:编辑您的消息、使用丰富的格式、剪切程序代码以及使用过去 选项。 这将使我们更容易阅读和提供帮助。

    您希望您的计时器处于 TIMER_CFG_A_CAP_TIME 模式、而不是计数模式。

    另外、请注意:您将通过查看计时器计数器来评估当前转换和上一次转换之间的时间差-但请注意、计时器宽度是有限的、因此您需要适当考虑计时器翻转、对吧?

    最后、我对此没有任何问题-但最好先在代码上使用英文注释... 尤其是当您在此处寻求反馈时... 好的老葡萄牙语对2亿6千万人来说很有用...

    谢谢

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

    [引用用户="Bruno Saraiva"]好的老葡萄牙语对仅2.6亿人有用...[/引用]

    这些(260M)中的大多数人都不是住在巴西吗?     必须注意的是,你的语言比英语更是歌词/音乐。

    (注意:CB1/教职员工 已"恢复"他们的"红枪增益"、因为您的新头像已降落...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴听到这个消息! 我希望这段短暂的时间不会让您的 R-G-B 矩阵毫无平衡地老化!

    是的,这260M 中的大多数人说"巴西",而不是"真正的"葡萄牙语。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    布鲁诺:“与“真正的”葡萄牙语相反。”

    你是说我们(转种/转义)纽约市的人会说“真正的英语?” (Dese、DEM、Dose、Gimme 等...)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引述 USER="CB1_MOBIT"]您的意思是,我们(移植/转义)纽约市的人会说“真正的英语?”[/引述]

    完全相反! 我实际上说,逃跑者(在这种情况下是越过赤道的人)讲巴西语,而葡萄牙语是少数几种语言!

    "真正的英式"仅限于女王之地!

    现在,我想知道海报是否有人回答他的问题? 有用吗? 零反馈使得激励甚至质量控制有点困难...

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

    你好。 我获得了代码、该代码将按原样重定向到中断。 但是,它仍然无法按预期工作。

    如前所述、我将捕获来自 IC 555的方波的负边沿、以计算周期和频率。

    如果有人能提供帮助、我将不胜感激。 遵循规范

    注意:Timer0A 没有边框计数。


    #include 
    #include 
    #include 
    include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_NVIC.h"
    #include "inc/hw_types.h"
    #include "driverlib/hw_utils.h"
    #include "driverlib/drivers.dlpine"
    
    #include "driverlib/subtex"#driver.h"#drivers.util.md.ide"#include "drivers.idex"#drivers.md.util.ide"#include "#drivers.md.util.h
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    #include 
    
    #include "driverlib/ssi.h"
    #include "spi.h"
    #include "nrf24/nrf24.h"
    #include 
    #include 
    
    #define VET_Transmit 20
    #define VET_PERIOD_FREQ 50
    #define FREQ_MICRO 16000000.0
    
    void Config_Clock (void);
    void Config_Timer (void);
    
    uint32_t g_ui32Clock;
    uint32_t Tempo = 0、allCaped = 0;
    
    volatile UINT32_t count、Edge1、Edge2、Edge2 PERIOD[VET_PERIOD_FREQ]、t = 0、l = 0、
    FLAG = 0、TX_INDEX = 0、 temp = 0、segundo = 0;
    volatile float freq[VET_PERIOD_FREQ]、cap = 0、media_freq = 0、 Soma_freq = 0;
    char buffer[VET_transmit ]、i = 0;
    
    void main (void)
    {
    
    Config_Clock ();
    Config_Timer ();
    
    while (1)
    {
    
    flag = 0;//初始化新捕捉的计数
    
    (allCaped = 1)
    {
    
    allCaped = 0;
    
    if (Edge2 > Edge1)
    {//忽略溢出
    
    计算[如果发生时] //计算周期
    t++;
    Edge1 = Edge2;
    
    }
    
    }
    }
    
    void Config_Clock (void)
    {
    
    g_ui32SysClock = SysCtlClockFreqSet (((SYSCTL_XTAL_25MHz |
    SYSCL_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、
    
    
    
    
    {-/void 配置)
    
    ———} 配置 TimerA0 Interupcao cada 1s--------------- //
    SysCtlPeripheralEnable (sysctl_Periph_TIMER0);//恢复时钟参数 o 定时器
    TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICRAY);//配置 o 定时器参数 interpcos 周期(
    TIMER0_BASE、TIMER_A、gui_TIMER0);TIMER0A_INT_TIMERA (TIMER0) TimerA (TIMERA) TimerA (TIMERA) TimerA (TIMER_INT_INTA TIMEOUT
    ) TimerA (TIMERA (TIMERA) Timer0A) TimerA (TIMERA (TIMER_TIMEOUT) TimerA (TIMERA (TIMERA) TimerA (TIMERA) Timer
    
    
    
    ///---------------- Timer2A 模式捕捉--- //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);//启用用于输入边沿计数
    的 GPIO 端口 GPIOPINTypeTimer (GPIO_PORTM_BASE、GPIO_PIN_0);//将 PM0配置为计时器2A
    上的正边沿捕获 GPIOPENCH (GPIO0_T2CCP0)
    
    ;//将 Timer_Timer_Timer_A (Timer_Timer_A)与 Timer_Timer_A (Timer_Timer_Timer_A)绑定时(Timer_Timer_Timer_Timer_A);//将 Timer_Timer_Timer_Timer_Timer_Timer_A (Timer_Timer_Timer_A (Timer_A)设置为 Timer_A (Timer_A);Timer_Timer_Timer_Timer_A (Timer_Timer_Timer_A)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    空 InterEnable (TIMER2_base、TIMER_CAP_EVENT);TimerEnable (TIMER2_base、TIMER_A);//启用定时器内部使能(INT_TIMER2A);//启用定时器内部使能()的中断;}void InterInterinterrupt_Timer0A (void){TIMERIntClear (INT_TIMER2A);//使能中断= TIMER32+、TIMER_Interrupt_TIMER = TIMER+(TIMER+);TIMER_INTERVERTAUTAUTAUTAULT_TIMER
    
    if (InterruptFlags & TIMER_CAP_EVENT)
    {
    
    if (!flag)
    {
    //捕获第一个边沿计时器值并指示程序已在
    Edge1 = MAP_TimerValueGet (TIMER2_base、timer_A)上捕获第一个边沿计时器值;
    flag = 1;
    }
    //捕获到下降沿后,存储第二个上升沿的值,如果
    (flag)
    {
    Edge2 = MAP_TimerValueGet (TIMER2_base、timer_A);
    //表示计算所需的全部三个边沿都已捕获并准备好计算
    Capallened = 1;
    
    }
    }
    //清除中断标志以使能中断再次发生。
    TimerIntClear (TIMER2_base、TIMER_CAP_EVENT);
    
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Bob。
    我只需要从 IC 555计算信号的周期。
    该周期是可变的、因此我需要监测该周期的变化。
    该频率范围约为500kHz 至10kHz。

    TimerA0针对其他应用进行了配置。

    我有下面的代码... 谢谢您的帮助。
    谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    达拉科特、
    您甚至没有阅读(简短)段落、我在该段落中要求您以格式化的方式发布您的代码。
    在这个论坛上的互动是在"自愿帮助"的基础上进行的。 如果您没有阅读某人发布的一句话、则其他人不太可能阅读完整的代码并尝试在其中找到错误... 尤其是在代码未格式化的情况下。
    此致
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。
    我的代码正在以正确的方式运行,这要归功于漫长的周末。

    但您尚未计算周期、频率是正确的。
    我有一个320Khz 的 IC 555输入信号、但我仍然无法通过我得到的计数达到该值。

    我的主时钟是否配置错误?

    如果有人能提供帮助、我将不胜感激。
    谢谢你

    #define VET_Transmit 20
    #define VET_PERIOD_FREQ 50
    #define FREQ_MICRO 16000000.0
    
    void Config_Clock (void);
    void Config_Timer (void);
    
    uint32_t g_ui32Clock;
    uint32_t t = 0;
    
    volatile UINT32_t Edge1、EDGE2、PERIOD[VET_PERIOD = 0]、INTQ_t、FREQ] temp = 0、allCaped = 0;
    
    
    
    void main (void)
    {
    
    CONFIG_Clock();
    CONFIG_Timer();
    
    while (1)
    {
    //标志= 0;
    if (allCaped = 1){
    
    如果(Edge2 > Edge1){//如果溢出发生则忽略计算
    
    Period[t]= Edge2 - Edge1; //计算周期
    T++;
    //Edge1 = Edge2;
    allCaped = 0;
    
    if (t=VET_PERIOD_FREQ){
    T=0;
    }
    }
    否则{
    allCaped = 0;
    
    }
    
    }
    
    
    
    }
    
    void Config_Clock (void)
    {
    
    G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    }
    
    void Config_Timer (void)
    {
    
    //------ 配置 TimerA0 Interupcao cada 1s--------------- //
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);//恢复时钟参数 o 计时器
    TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICRACRACASE);//配置计时器参数可互连周期
    TimerLoadSet (TIMER0_BASE、TIMER_A、g_ui32SysClock);//gera UMA interupcao a cada 1s
    TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    TimerEnable (TIMER0_BASE、TIMER_A);
    IntEnable (INT_TIMER0A);
    
    ///---------------- Timer2A 模式捕捉--- //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);//启用用于输入边沿计数的 GPIO 端口
    GPIOPinTypeTimer (GPIO_PORTM_BASE、GPIO_PIN_0);//将 PM0配置为定时器2A 上的正边沿捕获
    GPIOPinConfigure (GPIO_PM0_T2CCP0);
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);//用于边沿计时模式
    TimerConfigure (TIMER2_base、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP));
    TimerControlEvent (TIMER2_base、TIMER_A、TIMER_EVENT_NEG_EDGE);
    
    //TimerLoadSet (TIMER2_base、TIMER_A、0xFFFFFFFF);//开始计数0x0000
    
    TimerIntClear (TIMER2_base、TIMER_CAP_EVENT);
    TimerEnable (TIMER2_base、TIMER_A);//启用计时器
    TimerIntEnable (TIMER2_base、TIMER_CAP_EVENT);
    IntEnable (INT_TIMER2A);
    //IntMasterEnable();
    
    
    
    }
    
    void Interrupt_Timer0A (void)
    {
    
    TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
    temp++;
    
    }
    
    void Interrupt_Timer2A (void)
    {
    
    uint32_t InterruptFlags = TimerIntStatus (TIMER2_base、true);
    
    IF (InterruptFlags & TIMER_CAP_EVENT)
    {
    
    if (!flag){//捕获第一个边沿计时器值并指示程序已首先捕获
    
    Edge1 = TimerValueGet (TIMER2_base、timer_A);
    Flag = 1;
    }
    //捕捉到下降沿后、存储完成采样的第二个上升沿的值
    否则、如果(flag){
    
    Edge2 = TimerValueGet (TIMER2_base、timer_A);
    
    AllCaped = 1;//表示计算所需的全部三个边沿均已捕获并准备好计算
    标志= 0;
    }
    
    }
    //清除中断标志以使能中断再次发生。
    TimerIntClear (TIMER2_base、TIMER_CAP_EVENT);
    
    }