(如果有人能指出如何在不使用不起作用的4空格缩进系统的情况下将代码粘贴到这里,我会很乐意发布代码)
大家好经过大约9个小时的绞尽脑汁,我找不到答案,也找不到我的计算出错的地方。。。但事实确实如此。我有一个使用18F2550微芯片构建的电路。我使用这个电路来测量2个信号之间的延迟,并在捕获模式下使用2个CCP寄存器。这一切都有效,结果被发送到电脑(通过USB串行)所有的数据,但结果是错误的。我必须对任何结果应用大约16000的增益,才能接近引脚的延迟。
我在线路上设置了延迟
Timer1设置为内部
Timer3已禁用
启用相关中断
并且主程序连续运行。当我在CCP1引脚上得到上升沿检测时,中断被配置为将计时器1以及溢出计数器重置为零
#INT_CCP1
void ccp1_isr() // Captures the rising edge of CCP1 pin.
{
if(timing==FALSE){ // only do this on the edge, any bouncing will reset timers etc.
set_timer1(0);
T1_Overflow = 0;
Pulse_Time = 0;
timing = 1; // Set flag to indicate timing.
output_high(BLUE_LED);
}
}
CCD_ 1标志确保时间不能被CCP1引脚上的另一个脉冲复位。计时器1应重置并开始正常计数。每当它滚动65535(16位设备)时,就会触发另一个中断,之后溢出量就会增加。
#INT_TIMER1
void isr()
{
T1_Overflow++;
}
最后,当CCP2上的输入引脚变高时,触发CCP_2中断。这会捕获CCP寄存器的值(即触发中断时Timer0的值)和溢出寄存器。
#INT_CCP2
void ccp2_isr()
{
if(timing == TRUE){ // only output this when preceded by CCP1
if(Count_Done == FALSE) // do this once only
{
Count_Done = TRUE; // and also flag to the main routine to output data to the terminal.
Pulse_time = CCP_2;
Pulse_Overflow = T1_Overflow;
measureCount++; // increment the number of measures.
}
output_low(BLUE_LED);
timing = FALSE;
}
}
CCP1现在可以再次开始响应输入。这样做的想法是,每次我在CCP1获得一个输入脉冲,然后是CCP2,就会向终端发送一个字符串,其中包含计数器、溢出次数和计时器中剩余的时间。
while(TRUE) // do forever while connected
{
usb_task(); // keep usb alive
if(Count_Done == TRUE)
{
printf(usb_cdc_putc, "%lu , %lu , %lu rn",measureCount, pulse_time, pulse_overflow);
Count_Done = FALSE;
}
所以,我应该得到一个类似"161553,35"的输出到终端,在CCP1和CCP2之间有大约12毫秒的延迟。问题是,这些是我为电路提供200ms脉冲的结果。(验证两次)
那么我哪里错了。我有一个48MHZ时钟没有预分频器,这意味着每20ns一个周期。除以时钟的每个周期4条指令,这意味着每个周期5.2ns16位定时器,意味着每65535*5.2ns=每次翻转341us。进行计算时(0.000341*脉冲溢出)+脉冲时间*(5.2*(10^-9))则上述数据给出0012.27ms,而不是所提供的200ms。
有人能指出我的计算哪里出了问题吗???
您的错误是"除以时钟的每个周期4条指令,这意味着每个周期5.2ns"
计数器每4个周期滴答一次,而不是每个周期4次。因此,正确的计算是:
2.08333E-08 s/osc 周期
8.33333E-08计时器的秒/分
0.005461333秒/翻转
你落后了16倍。