找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3160|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

超簡單的高精度頻率測(cè)量例程(Proteus仿真80c52單片機(jī))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
    打算做個(gè)stc32g12k128的頻率相關(guān)東西,有朋友建議用proteus仿真一下。結(jié)果發(fā)現(xiàn)proteus里沒有stc32g,與其相近的只有一個(gè)stc15w4k32s4.用了一下,結(jié)果無法運(yùn)行,用盡全身解術(shù)也沒玩轉(zhuǎn)這個(gè)芯片(相信proteus8.9上能運(yùn)行,但我無法成功安裝這個(gè)版本。)只好再找相近的芯片,最后用80c52BUS成功調(diào)通了頻率測(cè)量例程,現(xiàn)在分享給大家。供初學(xué)proteus的朋友參考作用。
    80C52是一款過時(shí)的芯片,選擇這款芯片主要是因?yàn)樵谀苁褂玫男酒兴墓δ茏罱咏黶tc32g的相應(yīng)功能,可以實(shí)現(xiàn)不使用傳統(tǒng)定時(shí)器進(jìn)行頻率測(cè)量。它使用的是T2定時(shí)模塊的脈沖捕捉功能,在頻率測(cè)量中做到程序簡單而精度高。采用這種方法能極大地節(jié)省系統(tǒng)資源,讓單片機(jī)做更多的事情。
   本文的意義在于使用51系列芯片在proteus中進(jìn)行脈沖捕捉仿真。
    仿真電路極簡單,只使用了一個(gè)80C52芯片。然后利用了proteus提供的信號(hào)源和SPI顯示接口。程序中頻率測(cè)量相關(guān)程序只是T2中斷服務(wù)函數(shù)里的內(nèi)容,其余語句基本都是顯示驅(qū)動(dòng)程序用的。程序中的TL2初值是用來補(bǔ)償中斷函數(shù)本身運(yùn)行所耗費(fèi)的時(shí)間的。
   proteus中仿真單片機(jī)有三種模式,一是與kiel聯(lián)調(diào),就是在proteus中啟動(dòng)遠(yuǎn)程編譯監(jiān)視器,然后在kiel里編寫于編譯程序。第二種是直接建立帶固件的仿真工程,這樣可以直接在proteus里編寫和編譯程序,這種模式方便對(duì)程序進(jìn)行修改和調(diào)整。第三種是先把例程調(diào)試好,再轉(zhuǎn)化成可執(zhí)行的hex文件,最后直接把hex文件裝進(jìn)單片機(jī)(在單片機(jī)屬性里有相應(yīng)的選項(xiàng))。
    本例程的測(cè)量模式適合低頻段頻率測(cè)量。
下面是程序內(nèi)容,在附件中提供了源程序下載。
/* Main.c file generated by New Project wizard
*
* Created:   周六 10月 29 2022
* Processor: 80C52
* Compiler:  Keil for 8051
*/

#include <reg52.h>
#include <stdio.h>
sbit sclk=P3^2; //接口定義:lcd_sclk 就是 LCD 的 sclk
sbit sid=P3^1; //接口定義:lcd_sid 就是 LCD 的 sid
//sbit lcd_rs=P3^0; //接口定義:lcd_rs 就是 LCD 的 rs
//sbit lcd_reset=P1^0; //接口定義:lcd_reset 就是 LCD 的 reset
sbit cs1=P1^4; //接口定義:lcd_cs1 就是 LCD 的 cs1
//sbit key=P2^0; //定義一個(gè)按鍵

unsigned int cont1=123;
unsigned int cont2=234;
/*寫數(shù)據(jù)到 LCD 模塊*/
/*延時(shí)*/
void delay_us(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<1;k++);
}

void transfer_data(int data1)
{
char i;
cs1=0;
//rs=1;
for(i=0;i<8;i++)
{
sclk=0;
delay_us(1);
if(data1&0x80) sid=1;
else sid=0;
sclk=1;
delay_us(1);
data1=data1<<=1;
}
cs1=1;
}
/*延時(shí)*/
void delay(int i)
{
int j,k;
for(j=0;j<i;j++)
for(k=0;k<110;k++);
}



void main(void)
{
TH2=0;
        TL2=0;
        T2CON=0x08;//包含下面四行了,還帶上了中斷標(biāo)志位清零
        EA=1;
        ET2=1;
        TR2=1;//開始計(jì)數(shù)//這個(gè)是常變項(xiàng),應(yīng)該單獨(dú)拿出來執(zhí)行


while(1)
  {
       transfer_data(cont2);

     transfer_data(cont1);
  }
while (1)  ;
}
void t2_service() interrupt 5
{
      ET2=0;
        TR2=0;
        cont2=RCAP2H;
   cont1=RCAP2L;
   cont1=cont1;
        TH2=0;
        TL2=30;
                T2CON=0x0d;//帶上了中斷標(biāo)志位清零

   ET2=1;        //        TR2=1;//開始計(jì)數(shù)//這個(gè)是常變項(xiàng),應(yīng)該單獨(dú)拿出來執(zhí)行

        
}

在提供的例程運(yùn)行數(shù)據(jù)中可以看到,信號(hào)源脈沖頻率設(shè)定為1400HZ,測(cè)量時(shí)程序輸出的測(cè)量數(shù)據(jù)為02CA。這個(gè)數(shù)據(jù)為計(jì)數(shù)值,轉(zhuǎn)換為相應(yīng)的頻率值為1400HZ。測(cè)量精度還是很高的。在其它頻率上也做了測(cè)試,效果很理想。再次說明,這個(gè)程序適合低頻率信號(hào)的測(cè)量,需要測(cè)量高頻率,或高精度大頻率范圍的測(cè)量時(shí),我之前已經(jīng)分享過相應(yīng)的例程。請(qǐng)朋友們自行查看。

原理圖截圖.png (24.09 KB, 下載次數(shù): 69)

僅用了一個(gè)芯片

僅用了一個(gè)芯片

運(yùn)行截圖.png (381.44 KB, 下載次數(shù): 70)

運(yùn)行截圖.png

計(jì)算截圖.png (445.76 KB, 下載次數(shù): 63)

計(jì)算截圖.png

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1039438 發(fā)表于 2022-10-30 12:59 | 只看該作者
補(bǔ)充:該例程在proteus8.12和8.13版本運(yùn)行通過,使用的庫函數(shù)是8.13版的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2022-11-1 16:34 | 只看該作者
你實(shí)際做一下就會(huì)發(fā)現(xiàn)問題了。
做個(gè)電子鐘,看看一個(gè)月誤差幾秒,就知道你的方法靈不靈了。(不用時(shí)鐘專用芯片)
回復(fù)

使用道具 舉報(bào)

地板
ID:1039438 發(fā)表于 2022-11-1 20:39 | 只看該作者
yzwzfyz 發(fā)表于 2022-11-1 16:34
你實(shí)際做一下就會(huì)發(fā)現(xiàn)問題了。
做個(gè)電子鐘,看看一個(gè)月誤差幾秒,就知道你的方法靈不靈了。(不用時(shí)鐘專用 ...

有道理,我是想用這個(gè)程序測(cè)量脈沖頻率,如果做電子鐘的話要考慮系統(tǒng)時(shí)鐘的精度和穩(wěn)定性了。不是程序問題,當(dāng)然程序本身也存在計(jì)數(shù)誤差的限制。
回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2022-11-2 10:00 | 只看該作者
理論日差做到1秒內(nèi),需要的穩(wěn)定度是 1S/24H/60M/60S = 1/86400 = 11.57*10^-6。
而隨意一個(gè)晶振,其穩(wěn)定度輕易就優(yōu)于10^-6。
從這個(gè)道理說,使用普通晶振的單片機(jī),做個(gè)日差1秒之內(nèi)的時(shí)鐘是應(yīng)該能夠達(dá)成的。
而實(shí)際上,由于程序設(shè)計(jì)不合理,做到這一點(diǎn)還是不易的。
實(shí)戰(zhàn)比仿真更能說明問題。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:1049918 發(fā)表于 2022-11-2 13:21 | 只看該作者
yzwzfyz 發(fā)表于 2022-11-2 10:00
理論日差做到1秒內(nèi),需要的穩(wěn)定度是 1S/24H/60M/60S = 1/86400 = 11.57*10^-6。
而隨意一個(gè)晶振,其穩(wěn)定度 ...

很專業(yè)的說明,希望有更多人能看到
回復(fù)

使用道具 舉報(bào)

7#
ID:1039438 發(fā)表于 2022-11-2 18:50 | 只看該作者
yzwzfyz 發(fā)表于 2022-11-2 10:00
理論日差做到1秒內(nèi),需要的穩(wěn)定度是 1S/24H/60M/60S = 1/86400 = 11.57*10^-6。
而隨意一個(gè)晶振,其穩(wěn)定度 ...

我認(rèn)為程序方面現(xiàn)在存在的誤差主要表現(xiàn)在正負(fù)一的計(jì)數(shù)誤差,而解決這個(gè)問題并不難,在我發(fā)的其它帖子里的程序可以容易的解決,但主要是面向測(cè)量頻率的任務(wù),對(duì)時(shí)鐘的需要還真沒認(rèn)真研究過。有空時(shí)會(huì)去分析一下對(duì)策。
回復(fù)

使用道具 舉報(bào)

8#
ID:78901 發(fā)表于 2022-11-2 19:58 | 只看該作者
基準(zhǔn)頻率一定要穩(wěn)和準(zhǔn),否則跳動(dòng)厲害,頻率計(jì)對(duì)于整數(shù)測(cè)量是比較容易的,非整數(shù)難點(diǎn)比較大,比如31.592Hz
回復(fù)

使用道具 舉報(bào)

9#
ID:1039438 發(fā)表于 2022-11-3 08:56 | 只看該作者
fsj5098 發(fā)表于 2022-11-2 19:58
基準(zhǔn)頻率一定要穩(wěn)和準(zhǔn),否則跳動(dòng)厲害,頻率計(jì)對(duì)于整數(shù)測(cè)量是比較容易的,非整數(shù)難點(diǎn)比較大,比如31.592Hz

     我對(duì)這點(diǎn)也有深刻的教訓(xùn),在一個(gè)測(cè)量中發(fā)現(xiàn)測(cè)量結(jié)果沒有誤差,而從測(cè)量機(jī)制上,預(yù)期該有很大誤差才對(duì),具體實(shí)例在我的貼子《基于stc32g12k128單片機(jī)和jlx12864的簡易脈沖測(cè)量器 附程序》中對(duì)11059200HZ的頻率測(cè)量有圖片顯示,正是這種沒誤差測(cè)量結(jié)果使我意識(shí)到測(cè)量方法的合理性存在問題,并在后面做了提示說明。之后發(fā)的幾種有關(guān)頻率測(cè)量的例程都在從不同的側(cè)面去規(guī)避這種漏洞的影響。我的觀點(diǎn)是,整數(shù)測(cè)量的準(zhǔn)確性本身體現(xiàn)的是一種測(cè)量方法的不合理性。但對(duì)非整數(shù)的測(cè)量,還會(huì)受限于單片機(jī)數(shù)字處理能力。特別是對(duì)寬頻率范圍進(jìn)行測(cè)量的程序,小數(shù)部分的處理會(huì)受字節(jié)長度的影響而變得很麻煩。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表