(我很乐意发布代码,如果有人可以指出如何在不使用无效的4空间缩进系统的情况下将其粘贴到此处)
大家好 经过大约9个小时的绞尽脑汁,我无法找到答案或找到我的计算错误的地方......但它们确实如此。 我有一个使用微芯片18F2550微控制器构建的电路。 我正在使用此电路来测量2个信号之间的延迟,并在捕获模式下使用2个CCP寄存器。 这一切都有效,结果发送到PC(通过USB串口)所有花花公子,但结果是错误的。 我必须对任何结果应用~16000的增益才能到达引脚延迟附近的某处。
我在行中设置了延迟
Timer1设置为内部
Timer3被禁用
启用相关中断
并且主程序连续运行。 当我在CCP1引脚上获得上升沿检测时,中断配置为将timer1复位为零以及溢出计数器
#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);
}
}
timing
标志确保CCP1引脚上的另一个脉冲不能复位时间。
然后应复位Timer1并正常开始计数。每次它滚动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 \r\n",measureCount, pulse_time, pulse_overflow);
Count_Done = FALSE;
}
所以,我应该在CCP1和CCP2之间的延迟~12ms之间输出一个类似“1,61553,35”的终端输出。 问题是这些是我为电路提供的200ms脉冲所得到的结果。 (已验证两次)
所以我哪里错了。 我有一个没有预分频器的48MHZ时钟,这意味着每20ns就有一个周期。 时钟每个周期除以4个指令,每个周期意味着5.2ns 16位定时器,意味着每翻转每65535 * 5.2ns = 341us翻转。 当你做计算时(0.000341 * pulse_overflow)+ pulse_time *(5.2 *(10 ^ -9)) 那么上面的数据给出了0012.27ms而不是200ms。
有人能指出我在这些计算中出错了吗?
答案 0 :(得分:1)
你的错误在"每个周期划分为4个指令,每个周期意味着5.2ns"
计数器每4个循环滴答一次,而不是每个循环4次。所以,正确的计算是:
2.08333E-08 s / osc的周期
8.33333E-08 s /计时器滴答
0.005461333 s / rollover
你的关系是16倍。