(如果有人可以指出如何在不使用无效的4个空格缩进系统的情况下将其粘贴到此处,我将很乐意发布代码)

大家好
经过大约9个小时的脑力劳动,我找不到答案,也找不到我的计算出了问题的地方……但事实是如此。
我有一个使用微芯片18F2550微控制器构建的电路。
我正在使用该电路来测量2个信号之间的延迟,并且正在捕获模式下使用2个CCP寄存器。
所有这些都有效,并且所有结果全部都通过USB串行发送到PC,但结果是错误的。
我必须对任何结果应用〜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。

谁能指出我在这些计算上出错了吗???

最佳答案

您的错误在于“时钟每周期除以4条指令,这意味着每个周期5.2ns”

计数器每4个周期滴答一次,而不是每个周期4次滴答。因此,正确的计算是:

2.08333E-08 s /周期的osc

8.33333E-08秒/计时器的刻度

0.005461333 s /翻转

您的收入减少了16倍。

08-17 05:52