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.
您好!
我正努力正确捕获333Hz 脉冲的上升时间。 脉冲是来自 RC TX 的 PPM 信号、因此输入的占空比是可调节的。 我遇到了一个问题:当我将输入的占空比降低时、捕获的值就从信号的时间周期低到信号上的时间周期高。 我认为这是因为我使用的计时器正在滚动、使数据无用。 任何见解都将非常有帮助。 谢谢你。
#define PART_TMC123GH6PM #include // C99标准的变量定义。 #include // C99标准的输入和输出功能。 #include // C99标准的布尔定义。 #include "inc/hw_ints.h" #include "inc/hw_types.h" #include "driverlib/debug.h" #include "driverlib/rom.h" #include "driverlib/sysctl.h" #include "driverlib/pwm.h" #include "driverlib/sctl.h"/用于控制 API 和 SYDriverLib 的宏定义。 #include "driverlib/interrupt.h"//为 DriverLib 的 NVIC 控制器 API 定义和宏。 #include "driverlib/gpio.h"// DriverLib GPIO API 的定义和宏。 #include "driverlib/timer.h"//为 DriverLib 的计时器 API 定义和宏。 #include "driverlib/pin_map.h"//Mapping of peripherals to pins for all parts。 #include "driverlib/adc.h"// DriverLib 的 ADC API 定义。 #include "driverlib/fpu.h"// FPU 操作例程的原型。 #include "inc/tm4c123ghp6.h"//中断和寄存器分配的定义。 #include "inc/hw_memmap.h"// Tiva C 系列器件的存储器映射定义。 #include "inc/hw_types.h"//常用类型和宏的定义。 volatile int intFlag=0; volatile int widthFlag=0; volatile unsigned int POedge =0; volatile unsigned int pulsewidth=0; volatile unsigned int valueArray[10]; volatile unsigned int i=0; volatile unsigned int posAint=0; volatile unsigned divVar=10; double x=0;double checktimer = 0;double v/void timer 1 (void) 启用 void / void timer 1) SysCtlPeripheralEnable (SYSCTL_Periph_Timer1); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); // PB5引脚配置为定时器1 GPIOPinConfigure (GPIO_PB5_T1CCP1); //设置计时器类型 GPIOPinTypeTimer (GPIO_PORTB_BASE、GPIO_PIN_5); //将计时器配置为边沿时间捕获 TimerConfigure (Timer1_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_CAP_TIME_UP); //事件设置为两个脉冲边沿 TimerControlEvent (Timer1_base、timer_B、timer_event_both _edge); TimerPrescaleSet (Timer1_base、timer_B、255); //配置计时器1b 中断 IntEnable (INT_TIMER1B); //启用计时器中断 TimerIntEnable (Timer1_base、timer_CAPB_EVENT); //启用处理器中断 IntMasterEnable(); //启用计时器 TimerEnable (Timer1_base、timer_B); } int main (void) { SysCtlClockSet ( SYSCTL_SYSDIV_64 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHz); Timer_Initialize(); while (1) { //checkVar = TimerLoadGet (Timer1_base、timer_B); //TimerEnable (Timer1_base、timer_B); } } void Timer1IntHandler (void) { TimerIntClear (Timer1_base、timer_CAPB_event); if (intFlag=0) { POedge = TimerValueGet (Timer1_base、timer_B); intFlag=1; widthFlag=0; } 其他 { 负边沿= TimerValueGet (Timer1_base、timer_B); intFlag=0; widthFlag=1; } 如果((widthFlag==1)&&(negEdge>POedge)) { pulsewidth =(negEdge - POedge); valueArray[i]=脉宽; x+=valueArray[i]; i++; } 如果(i==10) {checkVar=TimerValueGet (Timer1_base、timer_B); I=0; 假设平均值=(x/divVar); X=0; divVar=10; POSeged=0; 负边线=0; // TimerLoadSet (Timer1_base、timer_B、20000); } }
使用两个计时器(而不是一个计时器)、您的任务是否会变得如此简单? 一个计时器在"上升沿"-第二个"下降沿?"时检测(中断)
我们阅读了您之前在这方面的帖子-"知道"使用单个计时器(可能)会导致延迟/沮丧。 通过将输入、333Hz 脉冲信号路由到两个计时器引脚(如上所示配置)、您可以极大地加快、简化和增强此类测量。
KISS 规则。 (节省了{其中一个}计时器-谁在乎?)