吳俊 馮國勝 王點點
(石家莊鐵道大學)
傳統(tǒng)電子測速法的M法和T 法在實際應用當中,測量范圍、精度有限[1],這往往是由于DSP 計數(shù)器溢出[2]和DSP 執(zhí)行程序需要一定的時間所導致的,其中T 法在測量低頻脈沖、M法在測量高頻脈沖時,測量結(jié)果不準確的情況更加頻繁。目前傳統(tǒng)的改善方法是通過復雜的軟硬件配置來實現(xiàn)準確測速。文章主要使用CodeWarrior 下更加高效的PE 編程工具,采用新的編程方法將 M 法和 T 法應用到數(shù)字信號處理器MC56F8346 的測速中,提高了傳統(tǒng)T 法、M法的測量范圍和精度。
MC56F8346 是一款數(shù)字信號處理器,它的結(jié)構(gòu)中包含數(shù)個定時模塊,每個定時模塊由4 組相同的16 位定時/計數(shù)器組成,其單個定時/計數(shù)器結(jié)構(gòu),如圖1所示。定時/計數(shù)器有2 種基本的工作模式:1)記錄內(nèi)部和外部事件數(shù),該模式應用在M法上;2)記錄每個外部事件之間所經(jīng)歷的內(nèi)部時鐘周期數(shù),也就是得到外部事件的時間間隔,該模式應用在T 法上[3]。文章中,使用信號發(fā)生器產(chǎn)生一定頻率的方波信號來模擬編碼器產(chǎn)生的轉(zhuǎn)速信號,將此信號輸入至MC56F8346 引腳處,分別使用count(計數(shù))模塊和capture(捕獲)模塊對方波信號計數(shù)。最終通過計算求得輸入信號的周期和頻率。使用M 法時,要先配置count 模塊,在計數(shù)過程中,當輸入高頻方波信號時,計數(shù)器會多次溢出;文章引入變量over(變量名),計數(shù)器每溢出1 次,變量就會加1。使用T 法時,要先配置capture 模塊,當輸入低頻方波信號時,計數(shù)器可能會多次溢出;同樣引入變量over,記錄溢出次數(shù)。
圖1 定時/計數(shù)器結(jié)構(gòu)框圖
定時/計數(shù)寄存器(TMRCNTR)是16 位寄存器。其中,計數(shù)捕獲寄存器(TMRCAP)是16 位寄存器,該寄存器存儲從計數(shù)器捕獲的值;定時重裝載寄存器(TMRLOAD)是16 位寄存器,用來裝載計數(shù)器的值;定時控制寄存器(TMRCTRL)是16 位寄存器,其中的位15~13是計數(shù)模式控制位(CM);計數(shù)狀態(tài)/控制寄存器(TMRSCR)是16 位寄存器,位13 是計數(shù)器溢出標志位(TOF),位12 是計數(shù)器溢出中斷使能位(TOFIE),位11是輸入邊沿標志位(IEF),位10 是輸入邊沿中斷使能位 (IEFIE),位 7,6 是輸入捕獲模式位(CAPTURE MODE);定時比較寄存器 1(TMRCMP1)是 16 位寄存器,該寄存器存儲的數(shù)值與計數(shù)器數(shù)值進行比較;定時重裝載寄存器1(TMRCMPLD1)是16 位寄存器,該寄存器存放定時比較寄存器中的比較值;計數(shù)比較狀態(tài)/控制寄存器(TMRCOMSCR)是16 位寄存器,位6 是計數(shù)比較寄存器1 中斷使能位(TCF1EN),當TCF1EN 與TCF1 同時置1 時,產(chǎn)生計數(shù)比較中斷,位4 是計數(shù)比較寄存器1 標志位(TCF1),當比較寄存器比較成功后,TCF1 置 1。
CodeWarrior 下的PE 編程工具是某公司開發(fā)的一款快速初始化工具,可以更加簡單、高效地完成項目任務。PE 支持該公司幾乎所有的嵌入式芯片,該工具會直接生成函數(shù)框架,編程人員在其中寫代碼即可,為編程人員提供了高效的工作環(huán)境。使用PE 編程流程,如圖2所示。
圖2 使用PE 編程流程圖
T法測周期,即通過記錄輸入脈沖信號2 個連續(xù)上升沿之間所經(jīng)歷的內(nèi)部時鐘周期數(shù),經(jīng)計算就會得到輸入脈沖信號周期。使用PE 工具編程時首先選擇Capture Components(捕獲元件),并對其進行設置[4]。之后,PE 生成相對應的Cap1_Init(void)初始化程序,初始化程序主要完成的工作有:
1)設置定時控制寄存器(TMRCTRL)。這里將位8,7(副計數(shù)脈沖源控制位)置為01,確定外部脈沖信號的輸入引腳為1。
2)設置計數(shù)狀態(tài)/控制寄存器(TMRSCR)。這里將位 12(TOFIE)、位 10(IEFIE)置 1,這樣就會使能計數(shù)器溢出中斷、輸入邊沿中斷。
3)清空定時/計數(shù)寄存器(TMRCNTR)、計數(shù)捕獲寄存器(TMRCAP)、定時重裝載寄存器(TMRLOAD)。
4)設置前分頻。這里將PCS 位設置為1 100,即IP總線時鐘為16 分頻。
5)設置定時控制寄存器(TMRCTRL)CM 位,選擇計數(shù)器的控制模式。這里設置為001,即在主計數(shù)脈沖上升沿計數(shù)。
6)設置計數(shù)狀態(tài)/控制寄存器(TMRSCR)Capture-Mode 位。這里設置為01,選擇上升沿裝載。
當?shù)讓映绦虺跏蓟螅?6 位定時/計數(shù)寄存器(TMRCNTR)就開始對系統(tǒng)時鐘循環(huán)計數(shù)。當定時/計數(shù)器達到滿值65 535(216-1)時,計數(shù)狀態(tài)/控制寄存器(TMRSCR)的位13 計數(shù)器溢出標志位(TOF)就會置1。由于將計數(shù)狀態(tài)/控制寄存器(TMRSCR)位 12(TOFIE)置為1,所以當TOF 為1 時,就會產(chǎn)生1 個計數(shù)器溢出中斷。在該中斷中編寫一個變量over,使其累加;那么每次計數(shù)器達到滿值時,就會進入中斷中,變量over 就會加1。
輸入的脈沖信號每當出現(xiàn)一個上升沿或下降沿時,就會置位 IEF。同時由于計數(shù)狀態(tài)/控制寄存器(TMRSCR)的位 10(IEFIE)置 1,就會產(chǎn)生輸入邊沿中斷。設置計數(shù)狀態(tài)/控制寄存器(TMRSCR)Capture Mode位為01,當置位IEF 時,設置為上升沿裝載。因此遇到上升沿時,計數(shù)器中的數(shù)據(jù)就存儲在捕獲寄存器中。
2 個相鄰上升沿發(fā)生時,可能的情況可以分為2 種:1)第1 個上升沿發(fā)生后,第2 個上升沿發(fā)生前,定時/計數(shù)寄存器沒有發(fā)生溢出;2)第1 個上升沿發(fā)生過后,在第2 個上升沿到來之前,定時/計數(shù)寄存器發(fā)生了溢出且可能不止1 次溢出,對應over 會遞增。在2 個相鄰的上升沿產(chǎn)生的邊沿中斷中,分別將2 次捕獲寄存器中的值賦給變量count1 和count2,同時記錄此時的溢出次數(shù)over1 和over2。中斷子程序流程圖,如圖3所示。
圖3 T 法中斷子程序流程圖
編寫程序如下:
#pragma interrupt called
void Cap1_OnCapture(void)
{
/*Write your code here...*/
index++;
if(index==1)
{
over1=over;
Cap1_GetCaptureValue( & count[index]);
}
if(index==2)
{
over2=over;
Cap1_GetCaptureValue( & count[index]);
……
index=0;
over=0;
}
}
這種方法主要是通過測量一段時間內(nèi)的脈沖個數(shù)來獲得轉(zhuǎn)速,也可以稱為測頻法。同樣,使用PE 編程時首先選擇EventCntr16,TimerInt Components,并對其進行設置。設置后,PE 底層生成的主要初始化程序包括TI1_Init(void),EC16_Init(void)。TI1_Init(void)主要完成的工作有:
1)設置控制寄存器(TMRA2_CTRL)。這里將位5(LENGTH)置1,這樣計數(shù)器到達預設值后重新初始化。
2)設置控制寄存器(TMRA3_CTRL)。這里將CM位置為0111,這樣就采用級聯(lián)計數(shù)模式,擴大了定時中斷的時間(Component 中設置為1 000 ms)。
3)設置計數(shù)狀態(tài)/控制寄存器(TMRA2_SCR,TMRA3_SCR)。
4)清空定時/計數(shù)寄存器(TMRA2_CNTR,TMRA3_CNTR)、定時重裝載寄存器(TMRA2_LOAD,TMRA3_LOAD)。
5)設置定時比較寄存器(TMRCMP1)。文中定時時間設置為1 s。因為采取級聯(lián)計數(shù)模式,即TMRA2 的輸出作為TMRA3 的輸入。這里將TMRA3_CMP1 設置為1 279,TMRA2_CMP1 設置為 46 874。每當 TMRA2 的計數(shù)器數(shù)值達到TMRA2_CMP1 所設置值(46 874)時,TMRA3 的計數(shù)器就會加1,直到達到TMRA3_CMP1 所設置值(1 279)時,產(chǎn)生比較成功中斷程序,這樣共計數(shù)46 874×1 279=59 951 846 次。
6)設置計數(shù)比較狀態(tài)/控制寄存器(TMRCOMSCR)。文章中采用級聯(lián)計數(shù)模式,這里將TMRA3_COMSCR 的TCF1EN 位置1,當與3 通道定時比較寄存器 1(TMRCMP1)完成比較時(TCF1 位置 1),計數(shù)比較寄存器就會發(fā)生中斷;CL1 位置1,即在與3 通道 TMRCMP1 比較成功后重裝初值。 將 TMRA2_COMSCR 的 CL1 位置 1,即在與 2 通道 TMRCMP1 比較成功后重裝初值。
7)1 279,46 874 分別寫入 TMRA3_CMPLD1,TMRA2_CMPLD1。
8)設置定時控制寄存器TMRA2_CTRL。這里設置PCS 位為1 000,即設置IP 總線時鐘為1 分頻。
9)清空定時/計數(shù)寄存器TMR2_CNTR,TMR3_CNTR。
10)設置定時控制寄存器TMRA2_CTRL。這里將CM位設為001,在主計數(shù)脈沖上升沿計數(shù)。
完成上述工作后,定時器產(chǎn)生的中斷間隔時間的計算,如式(1)所示。
其中60×106是CPU 源時鐘經(jīng)過分頻得到的系統(tǒng)時鐘;59 951 846 是設置得到的計數(shù)值。因此得到中斷的時間為0.999 2 s,接近于1 s。
EC16_Init(void)主要完成的工作有:
1)設置控制寄存器(TMRA0_CTRL)。首先停止計數(shù)器的所有功能。
2)設置計數(shù)狀態(tài)/控制寄存器(TMRA0_SCR)。這里將TOFIE 位置1,當計數(shù)器溢出標志位(TOF)為1 時,產(chǎn)生計數(shù)器溢出中斷。
3)設置計數(shù)比較狀態(tài)/控制寄存器(TMRA0_COMSCR)。
4)清空定時/計數(shù)寄存器(TMRA0_CNTR)。.
5)設置控制寄存器(TMRA0_CTRL)。這里設置CM為001,即在主計數(shù)脈沖的上升沿計數(shù)。
在Component 中設置完成后,每1 s 會產(chǎn)生1 個定時中斷;同時當計數(shù)器A0 溢出后,就會進入溢出中斷,使變量over 加1。
圖4示出M法中斷子程序流程。
圖4 M 法中斷子程序流程圖
編寫程序如下:
void TI1_OnInterrupt(void)
{
/*Write your code here...*/
EC161_GetNumEvents( & count1);
over1=over;
……
}
void EC161_Interrupt(void)
{
clrRegBit(TMRA0_SCR,TOF);
……
over++;
}
同時要對底層程序進行修改,清空計數(shù)器的同時也要清空變量over。
byte EC161_Reset(void)
{
setReg(TMRA0_CNTR,0x00);
over=0;
……
}
該程序中,輸出變量count 值就是測量脈沖的頻率。
在實驗室中搭建測速平臺,通過信號發(fā)生器模擬轉(zhuǎn)速信號,通過M法和T 法測得的結(jié)果,如表1所示。信號發(fā)生器輸出信號的頻率在1~100 000 范圍內(nèi),用M法和T 法得到的測量誤差中,最大為3.74%,最小為0。整體來講,采用新的方法得到的試驗結(jié)果誤差范圍小、結(jié)果可靠。
表1 使用PE 編程的T 法和M 法測量結(jié)果表
T 法和M法在電子測速過程中所存在的計數(shù)器溢出情況往往被忽略,文章對這種情況進行了處理,通過選用更加高效的PE 編程工具,采用新的軟件編程方法,對信號發(fā)生器輸出的模擬轉(zhuǎn)速信號進行了測速試驗。結(jié)果表明,該法比前人的軟件編程過程更高效、方便且整體代碼量小,當輸入信號頻率在1~100 000 Hz范圍內(nèi)時,得到的測量結(jié)果誤差范圍小、可靠性高。該方法是否可行,還需要在實際的行車過程進行進一步驗證。