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.

[参考译文] TM4C123GH6PM:脉冲捕获问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/577838/tm4c123gh6pm-pulse-capture-issues

器件型号:TM4C123GH6PM

您好!  

我正努力正确捕获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 规则。   (节省了{其中一个}计时器-谁在乎?)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我已经花了足够的时间尝试在一个引脚/计时器上使其工作。 我将使用两个。 感谢您的回复、CB1_MOBILE。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常适合您、也非常感谢。
    随着您的职业发展、您将(可能)了解到"使命"首先是"优雅"、其次是(遥远的)...