|
使用stc32g12k128(實際用了降龍棍核心板)和一個lcd顯示屏,可以構(gòu)建一個簡易脈沖測量器,該測量器有很寬的測量范圍和不錯的精度,而且由于對硬件沒有其它要求,可以在一般應(yīng)用的系統(tǒng)上,臨時寫入程序,使其成為一個測量脈沖工具,下面分享我的程序和思路,供初學(xué)單片機的朋友參考。
一、硬件選擇的考慮和功能
開始做這個東西的目的,是測量USB信號,48MHZ脈沖信號。相信stc32g12k128具有這個能力,使用jlx12864是看中它具有較快的顯示速度。使用TFT彩屏?xí)r,傳送一個點的數(shù)據(jù)需要兩個8位傳送指令,而jlx12864單色屏,一個8位傳送指令送出的是8個點的顯示信息。速度相差很大,這對高速脈沖的測量顯示很有價值。但實際設(shè)計時卻發(fā)現(xiàn),stc32g12k128的PWM和SPI是共用時鐘輸入分頻器的,如果想測48M的脈沖,必須讓PWM工作在高速模式,但這樣SPI也工作在高速模式了(我的屏是SPI接口),可是現(xiàn)在無論是屏還是IO接口,都不支持這樣的高速。除非使用并口屏,因為手里沒有并口屏,只好放棄了48M的測量。現(xiàn)在的搭配可以測量600HZ到10MHZ的脈沖信號(附圖中有一個測量系統(tǒng)時鐘的結(jié)果),因為對其它硬件沒有要求。所以還是蠻有用的一個東東。
二、程序主體
程序分如下幾個部分(完整程序在附件中)
1、mcu配置,這對PWM使用很重要,內(nèi)容也多些。
2、lcd12864屏驅(qū)動,包括屏的初始化和屏顯示用函數(shù),這部分可以根據(jù)用戶自己的屏進行修改,如果用戶用的并口屏,可以試著測更高的頻率。當(dāng)然程序中的參數(shù)需要修改。重要的是開高速PWM模式。
3、中斷函數(shù),一個是PWM中斷,用來捕捉周期和脈寬信號。一個是T0中斷,只為在無被測信號時顯示0.也就是超時清零。不過頻率欄在無信號時用來顯示系統(tǒng)時鐘頻率。
4、數(shù)字字模和漢字字模,分別在兩個頭文件中,方便修改。
測量11.0592MHZ芯片的時鐘
測600HZPWM信號
測2000HZPWM信號
mcu配置和main如下:
#include "STC32G.H"
#include "stc32_12864driver.h"
#include "mcu_initial.h"
#include "initial_lcd.h"
#include "chinese_zhouqi.h"
unsigned long int cnt1,cnt2;
void main(void)
{
mcu_initial();
initial_lcd();
clear_screen();
transfer_chine_word(1,0,zhou);
transfer_chine_word(1,16,qi);
transfer_chine_word(3,0,zhan);
transfer_chine_word(3,16,kong);
transfer_chine_word(5,0,pin);
transfer_chine_word(5,16,lu);
EA=1;
ET0=1;
while (1)
{
digit6_display(1,32,cnt1);//以計數(shù)的形式顯示周期值
digit6_display(3,32,cnt2);//以計數(shù)的形式顯示脈寬
digit6_display(5,32,33177600/(cnt1+1));//顯示轉(zhuǎn)換后的頻率值,單位HZ,無被測信號時顯示單片機的時鐘
}
}
void PWMA_ISR(void) interrupt 26 //測量脈沖的周期和脈寬
{
TR0=0;//關(guān)T0,中斷響應(yīng)期間免受T0中斷影響
if (PWMA_SR1 & 0x02) //判斷上升沿捕獲中斷是否發(fā)生
{
if (PWMA_SR1 & 0x02) //判斷上升沿捕獲中斷是否發(fā)生
{
PWMA_SR1 &= ~0x02; //中斷標(biāo)志位清零
cnt1 = (PWMA_CCR1H << 8) + PWMA_CCR1L; //CC1 捕獲周期寬度
}
if (PWMA_SR1 & 0x04) //判斷下降沿捕獲中斷是否發(fā)生
{
PWMA_SR1 &= ~0x04; //中斷標(biāo)志位清零
cnt2 = (PWMA_CCR2H << 8) + PWMA_CCR2L; //CC2 捕獲占空比(高電平寬度)
TH0=0;//T0初始化
TL0=0;
TR0=1;//開T0定時器
}
}
}
void tm0_isr(void) interrupt 1 //定時清屏幕顯示
{
cnt2=0;
cnt1=0;
}
#include "mcu_initial.h"
#include "STC32G.H"
void mcu_initial(void)
{
P_SW1=0x04;
EAXFR = 1; //使能訪問 XFR
CKCON = 0x00; //設(shè)置外部數(shù)據(jù)總線速度為最快
WTST = 0x00; //設(shè)置程序代碼等待參數(shù),
P1M0=0x00; //P1配置為高阻,其中的P1.6為雙向。P1.0輸入被檢測脈沖
P1M1=0xbf;
P2M0=0xFF;
P2M1=0x00;
// AUXR |= 0x80; //定時器時鐘1T模式,定時器用較慢模式,減少對測量可能產(chǎn)生的影響
TMOD &= 0xF0; //設(shè)置定時器模式
TL0 = 0x00; //設(shè)置定時初始值
TH0 = 0x00; //設(shè)置定時初始值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時器0開始計時
MCLKOCR=0xff;//P1.6輸出127分頻系統(tǒng)時鐘
HSSPI_CFG2=0X20;
SPSTAT=0x00;
SPCTL=0xd3;
PWMA_PS=0x00;//不需要選了,用默認值
//(CC1 捕獲 TI1 上升沿,CC2 捕獲 TI1 下降沿)
//CC1 捕獲周期寬度,CC2 捕獲高電平寬度
PWMA_CCER1 = 0x00; //捕獲使能。采用了初始值
PWMA_CCMR1 = 0x01; //CC1 為輸入模式,且映射到 TI1FP1 上
PWMA_CCMR2 =0x02; //CC2 為輸入模式,且映射到 TI1FP2 上
PWMA_CCER1 = 0x11; //使能 CC1/CC2 上的捕獲功能
PWMA_CCER1 |= 0x00; //設(shè)置捕獲極性為 CC1 的上升沿
PWMA_CCER1 |= 0x20; //設(shè)置捕獲極性為 CC2 的下降沿
PWMA_SMCR = 0x54; //TS=TI1FP1,SMS=TI1 上升沿復(fù)位模式
PWMA_IER = 0x06; //使能 CC1/CC2 捕獲中斷 。但TIE和UIE沒開通
PWMA_CR1 |= 0x01; //使能計數(shù)器
}
三、使用效果
見附圖吧測量時使用單獨一個降龍棍核心板作信號發(fā)生器,產(chǎn)生600HZ,2000HZ的PWM信號和一個系統(tǒng)時鐘輸出,然后用本貼所述的系統(tǒng)對其進行測試。信號發(fā)生器的低頻輸出用虛擬示波器測試,測試結(jié)果與設(shè)定值相符。
四、存在的問題
1、在測量較低頻率時出現(xiàn)的誤差。超出預(yù)期。
2、高頻時誤差比預(yù)期小太多,應(yīng)該引起重視(懷疑)。
3、可以用調(diào)整程序內(nèi)容實現(xiàn)低頻率的測量。
4、沒有使用并口屏實現(xiàn)更高頻率脈沖的捕捉。
有實力的朋友應(yīng)該能夠容易的解決存在的問題。
Keil代碼下載:
Keil代碼.7z
(25.82 KB, 下載次數(shù): 35)
2022-9-28 17:33 上傳
點擊文件名下載附件
脈沖測量器
|
評分
-
查看全部評分
|