您好!
我正在尝试读取提供给 TM4C 的脉冲的长度。 我遇到了很多麻烦、我不确定如何处理、建议会非常有帮助。 我想我可能会遇到几个问题、如果我接地、就没有问题、并且会按预期输出端点= 0、端点=零、长度=零。 但是、当我连接到我的 PWM (不是代码中的 PWM、而是由另一个源生成的 PWM)时、我会得到随机值。 我不确定正在发生什么或如何解决。 我最终要测量的信号频率介于3kHz 至5kHz 之间。 此外、我认为它读取脉冲的顺序可能会有问题-这意味着它可能会读取下降沿、然后是上升沿、 现在我使用50%的 PWM 作为测试信号、这就解决了问题、但将来会出现问题-因此、如果有人有任何建议、这将是一个问题。 我试图找到一种方法让我的时钟在上升沿启动、但我在尝试如何启动时遇到了困难。
我认为我可能使用的中断不正确、我对如何准确地使用中断感到困惑、我尝试将 PD0和 PD1与传入脉冲连接在一起、 然后、当检测到上升沿时、计时器 A 将调用一个保存该值的中断来启动、然后当到达负沿时、计时器 b 将调用一个保存计时器值到结束的中断
请提供任何帮助。 -我将控制电路板上外设的所有代码保存在我发布的代码中,因为我不确定这些线路上是否有任何干扰或其他东西。
#include
#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "inc/hw_pwm.h"
#include "driverlib/debug.h"
#driverlib/driverlib#include "driverlib/driver.h"#driverlib#driverlib/driver.h"
#include "driverlib_dive.m#driverlib_timers/driver.h"
#include "driverlib#driverlib#driverlib#driver/h"
// Pulse
uint32_t start = 0、end = 0、length = 0的全局变量;
//函数原型
void configureUART (void);
void Pulse_Length (void);
void DummyDelay (uint32_t Count);
void configurePWM (void);
void FallingEdge (void);
void RisingEdge (void);
//********* //
//本节包含 UART 通信相关性-用于检查所写入的代码,但大多数//
////将从最终代码中注释掉-它将保留为注释,不会被删除以允许程序编辑器访问//
//使用 UART 来检查值和函数 //
//********* //
void
configureUART (void)
{
//
//启用 GPIO 和 UART 0
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//
//为 UART 模式配置 UART 引脚
//
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
//UARTClockSourceSet (UART0_BASE、UART_CLOCK_SYSTEM);
//
//初始化控制台 I/O 的 UART
//
UARTStdioConfig (0、115200、g_ui32SysClock);
}
//********* //
//此部分将设置计时器来测量进入控制器的脉冲长度。 我将尝试
通过将 PD0和 PD1设置为计时器引脚来实现//////。 这些引脚都将连接到比较器。 PD0将"查找"//
上升沿、而 PD1将"查找"下降沿。 每个变量将捕获计时器值以作为开始和结束变量//
//两者之间的差异将是脉冲长度。
// //
void Pulse 长度(void)
{
//
//启用 GPIO 和计时器0
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
//
//在中配置 GPIO 定时器引脚
//
GPIOPinConfigure (GPIO_PD0_T0CCP0);
GPIOPinConfigure (GPIO_PD1_T0CCP1);
GPIOPinTypeTimer (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1);
//
//初始化计时器 A 和 B,以便在边沿计时模式中向上计数
//
TimerConfigure (TIMER0_BASE、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP | TIMER_CFG_B_CAP_TIME_UP));
//
//定时器装载值
//
TimerLoadSet (TIMER0_BASE、TIMER_Both、g_ui32SysClock);
//
//同步两个计时器
//
TimerSynchronize (TIMER0_BASE、TIMER_0A_SYNC | TIMER_0B_SYNC);
//
// Timer A 记录正边沿时间,Timer B 记录负边沿时间
//
TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_POS_EDGE);
TimerControlEvent (TIMER0_BASE、TIMER_B、TIMER_EVENT_NEG_EDGE);
//注册一个在计时器到达正边沿触发 int 时要调用的中断函数
IntRegister (INT_TIMER0A、RisingEdge);
//确保清除中断
TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
//启用指示的定时器中断源。
TimerIntEnable (TIMER0_BASE、TIMER_CAP_EVENT);
//在中断控制器中启用指定的中断。
IntEnable (INT_TIMER0A);
//注册一个中断函数,当计时器到达 neg edge trig int 时调用该函数
IntRegister (INT_TIMER0B、FallingEdge);
//确保清除中断
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
//启用指示的定时器中断源。
TimerIntEnable (TIMER0_BASE、TIMER_CAPB_EVENT);
//在中断控制器中启用指定的中断。
IntEnable (INT_TIMER0B);
}
void RisingEdge (void)
{
TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
Start = TimerValueGet (TIMER0_BASE、TIMER_A);
}
void FallingEdge (void)
{
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
结束= TimerValueGet (TIMER0_BASE、TIMER_B);
}
//********* //
//********* //
//********* //
/// DummyDelay ()仅在调试
void DummyDelay (uint32_t Count)
{时使用
volatile uint32_t x;
对于(x = 0;x "\nstart="%d\n"," start);="" uartprintf("\nend="%d\n"," end);="" uartprintf("\nlength="%d\n"," length);=""