打印
[51单片机]

pca侧频率

[复制链接]
708|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chuandaoxy|  楼主 | 2016-7-26 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近翻出快旧版子,发现硬件用的是pca侧频率,用了几个方案,测得都不对,最接近的是下面的代码

实际频率6590hz,测得7142hz误差很大啊,错在哪里,晶振110592

#include "REG_MPC82L54.H"
#include <string.h>
#include <stdio.h>


#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long

#define PS    0x10
#define PSH   0x10

uint cap_tmp;

uint pulse_width;
uint capturer1,capturer2;

uchar out_data[2];



bit flag;
bit capture_ok;

#define        led        P32

///////////////////////////////////////////////////

Init_Com()

{
     TMOD = 0x22;                         
     TH1 = 0xFd;
     TL1 = 0xFd;
         TH0 = 0xED;
     TL0 = 0xED;
         SCON = 0x50;
     TR1  = 1;
         TR0  = 1;                
}


///////////////////////////////////////////////////

send232byte(uchar ch)                          
  
{
    SBUF=ch;                                                                          
    while(TI==0);
    TI=0;
}

///////////////////////////////////////////////////

void Initial()

{
    CMOD   = 0X04;   // ECF = 1;开PCA中断标志
    CCAPM1 = 0X21;   // CAPN0 = 1; 下降沿捕获。ECCF0 = 1; 开捕获中断。
    CL = 0;
    CH = 0; // PCA计数器清零
    CCAP1L = 0;
    CCAP1H = 0; // 捕获寄存器清零
    IE =  0xC0; // 开PCA中断
    CR = 1;

}
///////////////////////////////////////////////////

void PCA_Interrupt() interrupt 6

{
            
               
                CF=0;
                CCF1=0;
         
            // if (flag==0)

         //{         
            capturer1=CCAP1L|(CCAP1H<<8);

                 CH=0;
        CL=0;   
               
        //        flag=1;       
         
       
   
}

      

///////////////////////////////////////////////////

void delay()
{
    unsigned int x;

    for(x=0;x<65535;x++);   

}

///////////////////////////////////////////////////

Main()

{
    uint  tmp;
    uint dat;

        P35 = 1;
        Init_Com();
    Initial();
        EA=1;
        while (1)

    {

                  dat=50000/capturer1;
                  
          send232byte(dat>>8);
          send232byte(dat);
                  dat=0;
          delay();
    }

}

相关帖子

沙发
lyjian| | 2016-7-26 12:41 | 只看该作者
先搞定pca的原理

使用特权

评论回复
板凳
coody| | 2016-7-26 14:25 | 只看该作者
我先确定采样时间,比如1s。
那么,我会用PCA捕捉大约1S内的脉冲数和这些脉冲对应的时间,这个类似所谓的“等精度测量”。

比如,PCA时钟是1MHZ,检测到56个脉冲的时间是975628us,则频率就是
56/0.975628=57.399HZ。

由于PCA捕捉是硬件捕捉,连续捕捉本身不会引入误差,误差跟时钟的误差一致。比如使用1ppm的有源时钟12MHZ,则捕捉1秒的误差就在2us之内。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

851

主题

1039

帖子

4

粉丝