请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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);//清除中断标志以使能中断再次发生 。}