工具与软件:
您好!
我正在尝试 在边沿计时器配置中使用通用计时器模块的捕获比较模式来测量 PWM 占空比。 测得信号的频率为482Hz。 以下是用于引脚初始化的代码。
```SysCtlPeripheralEnable (SYSCTL_PERIPH_TIMER2);
TimerConfigure (TIMER2_BASE、
(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP | TIMER_CFG_B_CAP_TIME_UP);
TimerControlEvent (TIMER2_BASE、TIMER_A、TIMER_EVENT_POS_EDGE);
TimerControlEvent (TIMER2_BASE、TIMER_B、TIMER_EVENT_NEG_EDGE);
TimerEnable (TIMER2_BASE、TIMER_A)
TimerEnable (TIMER2_BASE、TIMER_B);```μ s
上述 init 函数全部属于 tivaware 库。 我认为初始化效果很好、因为我能够在引脚上提供 PWM 信号时获得一些计时器值。
下面是我用于记录总 PWM 脉冲的代码。
```void SpinMotorImpl::MeasureSpinSpeed (){
静态 uint16_t 计数器= 0;
静态 bool previous_measured = false;
静态 uint32_t spin_mot_hlfb_rising prev=0;
uint32_t STATUS_pos = TimerIntStatus (TIMER2_BASE、FALSE);
if ((STATUS_pos & TIMER_CAPA_EVENT )!= 0){
const uint32_t spin_mot_hlfb_rising =(TimerValueGet (TIMER2_base、TIMER_A)&0x00FFFFFF);
const uint32_t spin_mot_hlfb_falling =(TimerValueGet (TIMER2_base、TIMER_B)&0x00FFFFFF);
if (!previous_measured)
{
SPIn_mot_hlfb_rising = SPIn_mot_hlfb_rising;
previous_measured=true;
}
设计
{
计数器++;
if (counter==1000)
{
syslog->printf (syslog_level_info、"m_evt=MeasureSpinSpeed 时序=%ld、%ld、%ld "、SPIn_mot_hlfb_rising、 SPIn_mot_hlfb_rising prev、spin_mot_hlfb_falling);
计数器= 0;
}
previous_measured = false;
TimerReset (TIMER2_BASE、TIMER_BOTH)
}
TimerIntClear (TIMER2_BASE、TIMER_CAPA_EVENT);
TimerIntClear (TIMER2_BASE、TIMER_CAPB_EVENT);
}
}```
MeasureSpinSpeed 的调用间隔为1ms。 我无法在每个周期进行打印 、因为这会使微型系统崩溃、我猜是因为它过载、这就是为什么我有一个计数高达1000的计数器、并且每秒都会以这种方式进行打印的原因。
根据此代码、我预计 SPIn_mot_hlfb_rising 会高于 SPIn_mot_hlfb_rising 和 SPIn_mot_hlfb_falling 之间的某个位置(两个上升沿之间应该有一个下降沿)。
但是、我看到的是:
M_evt=MeasureSpinSpeed 时序=27,640,40840830,43379 ca.
根据此日志消息:spin_mot_hlfb_rising 为40830、 spin_mot_hlfb_falling = 43379和 spin_mot_hlfb_rising = 27640。每个日志消息的值都不同、但这些值之间的差异是一致的。
我有两个问题:
1.计时器似乎在65536左右换行。 我不知道如何对它进行预分频。 数据表显示、在边沿定时器模式中、预分频字节只是作为16位信号的额外8位。 我猜这会使它成为24位信号、因此我要使用0x00FFFFFF 提取24位、但它似乎仍然环绕65536。
2.为什么上升沿的当前计时器值始终低于前一个上升沿、而下降沿始终高于两者。 对于482Hz 的信号、轻触1kHz 的信号应该没有问题。 下降沿应该在它们之间、除非它绕在它们之间的某个位置、在这种情况下、弄清楚如何进行预分频确实会在这里有所帮助。
FYI:TimerReset 会将定时器的 GPTMTAV 和 GPTMTBV 寄存器复位为0、TimerIntClear 设置用于清除定时器的 GPTMRIS 标志的 GPTMICR 标志、TimerValueGet 获取 GPTMTnR 寄存器中的值、TimerIntStatus 获取 GPTMRIS 寄存器的值、以检查是否存在边沿。
不确定我是否澄清了上述问题、但想回答您对我的问题可能有的任何问题。
提前感谢您的帮助。