可測(cè)量脈沖寬度的微控制器串行端口
很多工業(yè)與儀表系統(tǒng)都需要測(cè)量脈沖輸入的持續(xù)時(shí)間,如轉(zhuǎn)速傳感器、外部系統(tǒng)的門控與選通脈沖,以及PWM(脈沖寬度調(diào)制)輸入的頻率等。設(shè)計(jì)者是采用片上定時(shí)器和邊沿驅(qū)動(dòng)的中斷。但是,如果這些元件不可用,可以用片上的串行同步接收器做這類測(cè)量。
可以根據(jù)需要的時(shí)序精度,設(shè)定串行接收器的波特率。接收器每8 bit后中斷微控制器??梢栽趹?yīng)用程序中插入脈沖寬度采集例程,用于讀取ISR(中斷服務(wù)例程)接收到的字節(jié)。它會(huì)統(tǒng)計(jì)和累加接收到的0和1字節(jié),以測(cè)量出進(jìn)入脈沖的持續(xù)時(shí)間(圖1)。
算法測(cè)量a的是兩個(gè)連續(xù)上升沿之間的持續(xù)時(shí)間。當(dāng)微控制器收到一個(gè)既不是0xff也不是0x00的字節(jié)時(shí),就檢測(cè)到了一個(gè)上升沿或下降沿。如果一個(gè)字節(jié)小于0x80H (100 000b),則該字節(jié)表示一個(gè)上升沿。如果字節(jié)等于或大于該值,則該字節(jié)表示一個(gè)下降沿。
前上升沿將位計(jì)數(shù)器重置為上升沿字節(jié)中拖尾1的個(gè)數(shù),方法是將向右移位。位計(jì)數(shù)器在每個(gè)字節(jié)來到時(shí)加8,也包括標(biāo)志下降沿的那個(gè)字節(jié)。當(dāng)計(jì)數(shù)器接收到后上升沿(由下一個(gè)上升沿字節(jié)標(biāo)志,它大于0x80H但小于00H)時(shí),它再次統(tǒng)計(jì)該字節(jié)中領(lǐng)先0的個(gè)數(shù),并將此數(shù)加到累加位計(jì)數(shù)器上。此時(shí)的累加位計(jì)數(shù)與脈沖鏈的時(shí)間周期相關(guān),其因數(shù)等于波特率。
圖2表示一個(gè)200Hz的脈沖鏈,兩個(gè)上升沿之間的時(shí)間為5ms。波特率為256kbaud。在一個(gè)測(cè)量周期內(nèi),假設(shè)前上升沿的標(biāo)志為0011 1111b。微控制器將其向右移位,統(tǒng)計(jì)拖尾1的數(shù)目,位計(jì)數(shù)器初始化為6。這個(gè)計(jì)數(shù)對(duì)應(yīng)的時(shí)間約為23.43 μs。
接下來,上升沿字節(jié)前的每個(gè)字節(jié)都使位計(jì)數(shù)器加8。簡(jiǎn)單計(jì)算表明,共有159字節(jié),即1272位。此時(shí),計(jì)算的總位數(shù)為1278位,包括在第一個(gè)上升沿字節(jié)中收到的6個(gè)1。
現(xiàn)在,脈沖鏈遇到了拖尾的上升沿字節(jié),其值為0011 1111b。做這個(gè)計(jì)數(shù)時(shí),需要將0左移,統(tǒng)計(jì)為兩個(gè)位。兩上升沿之間的總位數(shù)就是1280bit。在256 kbaud速率下,這個(gè)數(shù)字精確地對(duì)應(yīng)于5 ms或200 Hz。
可以根據(jù)自己的應(yīng)用需求,對(duì)這種位計(jì)數(shù)概念作修改。如果只需要測(cè)量低周期的脈沖,需要探測(cè)一個(gè)下降沿,并累計(jì)位數(shù),直到遇見一個(gè)上升沿。可以將這種概念用于讀取進(jìn)入的PWM信號(hào),方法是讀取一個(gè)已知進(jìn)入脈沖頻率的高周期。
評(píng)論