您好!
我已经收到 Bob Crosby 的帮助。 直到 bob 帮助我、我无法获得已知 PWM 的任何恒定读数。 现在、我确实获得了已知脉冲长度的 PWM 的恒定读数、但我有一个不正常的现象-我想将我的脉冲长度转换为时间、我必须进行分频(120*10^6)才能在数秒内得到我的答案。 但事实并非如此、我必须使用另一个常量在几秒钟内获得我的答案。 它是一个很好的价值120*10^6 -接近200万.
如果我使用该常数、在将其与示波器进行比较时、我可以获得准确(在误差范围内)的脉冲长度读数(其中包括具有不同脉冲长度的 PWM) 但我想知道什么可能导致我的问题、以及这个问题是否可能在将来成为一个大问题。
以下是我的脉宽相关代码(我目前只想读取一次脉冲):
#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/driverlib/driver.h"
#include "driverlib#driverlib.driver.h"#driverlib#driverlib.driverlib#driverlib#driver.h"#include "driverlib.driverlib#driverlib#driver.h"#include "driverlib#driverlib.driverlib#driverlib.driver.h"#include "driverlib#driverlib.driverlib#driverlib.driver.h"#include "driver.h"#driverlib#driverlib.driverlib.driverlib#driverlib.driverlib#driverlib.driver.h"#include "driver.h"#include "driverlib#driverlib.driv
#include
#include "driverlib/sysctl.h"
//时钟
uint32_t g_ui32SysClock 的全局变量声明;
// Pulse
uint32_t start = 0、end = 0、length = 0;
void Pulse_Length (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));
TimerClockSourceSet (TIMER0_BASE、TIMER_CLOCK 系统);
//
//定时器装载值
//
TimerLoadSet (TIMER0_BASE、TIMER_Both、0xFFFFFFU);
//
// 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);
//将中断设置为最高优先级
IntPrioritySet (INT_TIMER0A、0);
//确保清除中断
TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
//启用指示的定时器中断源。
TimerIntEnable (TIMER0_BASE、TIMER_CAP_EVENT);
//在中断控制器中启用指定的中断。
IntEnable (INT_TIMER0A);
//注册一个中断函数,当计时器到达 neg edge trig int 时调用该函数
IntRegister (INT_TIMER0B、FallingEdge);
//将中断设置为最高优先级
IntPrioritySet (INT_TIMER0B、0);
//确保清除中断
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
//启用指示的定时器中断源。
TimerIntEnable (TIMER0_BASE、TIMER_CAPB_EVENT);
//在中断控制器中启用指定的中断。
//IntEnable (INT_TIMER0B);
TimerEnable (TIMER0_BASE、TIMER_Both);//需要在配置计时器
后到达}
void RisingEdge (void)
{
// if (pultrulate_start = PulseState)
//{
TimerIntClear (TIMER0_BASE、TIMER_CAP_EVENT);
START = TimerValueGet (TIMER0_BASE、TIMER_A);
// PulseState = PULSE_POS;
IntDisable (INT_TIMER0A);
IntEnable (INT_TIMER0B);
//}
void FallingEdge (void)
{
// if (pulse_POS == PulseState)
//{
TimerIntClear (TIMER0_BASE、TIMER_CAPB_EVENT);
结束= TimerValueGet (TIMER0_BASE、TIMER_B);
if (结束<开始)
{
结束=结束+ 0x10000;
}
长度=结束-开始;
// PulseState=PULSE_NEG;
//}
//IntEnable (INT_TIMER0A);//这对于感知脉冲是禁用的
IntDisable (INT_TIMER0B);
}
int
main (void)
{
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
FPUEnable();
FPUoundingModeSet (FPU_ROUN_POS_INF);
Pulse_Length ();
IntMasterEnable();
while (1)
{
SysCtlDelay (40000000);
UARTprintf ("长度=%d\n"、长度);
}
}