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/TM4C1294NCPDT:捕获模式-测量周期

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

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

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

你好。

我需要测量振荡器(CI555)的周期、频率范围为500kHz 至1kHz、但代码未正确计算周期。

我从该微控制器开始、因此我遇到了一些困难。

我想在 timer2A 计数器捕获2个正边沿后将其归零、然后计算周期、但我没有找到此选项。

我认为我的代码的问题是我的编程逻辑、如果有人能给我一个帮助、我非常感谢您。

谢谢你。

float g_ui32SysClock;

volatile double freq = 0、cap = 0;

volatile uint32_t Edge1、Edge2、flag = 0、 temp = 0、allCaped = 0、period = 0;




void main (void){

CONFIG_Clock();
CONFIG_Timer();


while (1){



if (所有字纹){


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

期间= Edge2 - Edge1; //计算周期
频率= g_ui32SysClock/period;


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)
{


///---------------- 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_POS_EDGE);

//TimerLoadSet (TIMER2_base、TIMER_A、0xFFFF);

TimerIntClear (TIMER2_base、TIMER_CAP_EVENT);
TimerEnable (TIMER2_base、TIMER_A);//启用计时器
TimerIntEnable (TIMER2_base、TIMER_CAP_EVENT);
IntEnable (INT_TIMER2A);
//IntMasterEnable();

}


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);//清除中断标志以使能中断再次发生

。} 

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

    您好、Dalacort、

    我想您只是有一个小错误。

    您正在重置 allCaped = 0;在检查溢出... 但是、每次输入 if (allCaped) if 语句时、您都应该清除此问题。

    从 Edge2 > Edge1比较中获取 allCaped = 0、您应该得到一致的结果。