高速微位移測(cè)量儀--程序流程圖
程序流程圖
主程序包括串口初始化,啟動(dòng)周期中斷,之后為一個(gè)無限循環(huán)過程。在無限循環(huán)中,首先將用于匹配離焦量標(biāo)定區(qū)間的變量進(jìn)行清零,再通過AD數(shù)據(jù)采集引腳對(duì)電壓信號(hào)進(jìn)行采集,然后將采集到的信號(hào)值通過換算得到離焦信號(hào),最后用離焦信號(hào)逐次對(duì)每個(gè)離焦標(biāo)定區(qū)間新型匹配,當(dāng)確定離焦信號(hào)所屬區(qū)間后跳入程序?qū)﹄x焦信號(hào)進(jìn)行換算得出離焦量FES。程序的周期中斷的中斷周期為1ms,周期中斷中所執(zhí)行的是一個(gè)顯示程序,以此實(shí)現(xiàn)實(shí)時(shí)輸出。
周期中斷服務(wù)子程序框圖如下:
4.2 離焦信號(hào)AD采集與計(jì)算
為了確保離焦信號(hào)的精確度,程序采用求平均值的方式確定離焦信號(hào)值。首先將AD采集的字符串型AC和SUM信號(hào)值轉(zhuǎn)換為長整形,然后循環(huán)200次且兩組數(shù)值分別自加。得到200次自加后的AC和SUM信號(hào)值先取平均值,然后減去暗室無光中測(cè)得的QP50-6-TO8四象限探測(cè)器的AC和SUM的信號(hào)值。之后將AC和SUM的信號(hào)值轉(zhuǎn)化為雙精度浮點(diǎn)型并進(jìn)行計(jì)算求取離焦量FES。
根據(jù)KL25Z128LV飛思卡爾板電路原理圖,主控MUC的PTE20,PTE21,PTE22,PTE23四路引腳為AD采樣引腳且均能采集0~3V直接的電壓信號(hào)。
通過CodeWarrior對(duì)四路AD引腳分別進(jìn)行通道(Channel)設(shè)置。由于需進(jìn)行多次AD采樣且系統(tǒng)設(shè)計(jì)要求測(cè)量速度小1ms,因此AD轉(zhuǎn)換周期(Conversion time)設(shè)置為1.57356us。
for(i=0;i<200;i++)
{
ADOUT_MeasureChan(1,0);
ADOUT_GetChanValue16(0,&OAC);
AC=OAC;
AC_S=AC_S+AC;
ADOUT_MeasureChan(1,2);
ADOUT_GetChanValue16(2,&OSUM);
SUM=OSUM;
SUM_S=SUM_S+SUM;
}
SUM_S=SUM_S/200-31760;
AC_S=AC_S/200-31760;
SUM_F=(double)SUM_S;
AC_F=(double)AC_S;
FES=AC_F/SUM_F*-100;
4.3 周期中斷與顯示程序
為實(shí)現(xiàn)實(shí)時(shí)顯示輸出,本設(shè)計(jì)采樣周期中斷控制顯示程序?qū)崿F(xiàn)此功能。通過CoadWarror軟件添加周期中斷控件TimerInt,并將中斷周期設(shè)置為1ms。通過編譯后,在Event.c目錄下生成void TI1_OnInterrupt(void),然后進(jìn)行顯示程序編程。
根據(jù)KL25Z128LV飛思卡爾板電路原理圖,顯示模塊是一個(gè)四位LED數(shù)碼管。四個(gè)LED數(shù)碼管分別由四個(gè)PNP型三極管控制位選,當(dāng)給基極高電平時(shí),發(fā)射結(jié)反偏,三極管不導(dǎo)通,位選關(guān)斷,數(shù)碼管無法寫入;當(dāng)給基極低電平時(shí),發(fā)射結(jié)正偏,三極管導(dǎo)通,位選打開。
本設(shè)計(jì)中所用的LED數(shù)碼管為共陽極的數(shù)碼管,對(duì)于共陽極的數(shù)碼管,如果要點(diǎn)亮其中的一段,只要對(duì)應(yīng)的LED 有電流流過,且在對(duì)應(yīng)的引腳加低電平。具體顯示數(shù)值的二進(jìn)制數(shù)值與字符串型如下所示:
|
0 |
1100 0000 |
0xc0 |
|
1 |
1111 1001 |
0xf9 |
|
2 |
1010 0100 |
0xa4 |
|
3 |
1011 0000 |
0xb0 |
|
4 |
1001 1001 |
0x99 |
|
5 |
1001 0010 |
0x92 |
|
6 |
1000 0010 |
0x82 |
|
7 |
1111 1000 |
0xf8 |
|
8 |
1000 0000 |
0x80 |
|
9 |
1001 0000 |
0x90 |
由于顯示數(shù)值為小數(shù),所有在將顯示數(shù)值變量定義為double雙精度浮點(diǎn)型。先將顯示數(shù)字乘以1000,然后再通過除十或者取余分別獲得千位、百位、十位、個(gè)位相應(yīng)數(shù)值。而且因?yàn)榍粚?duì)于原數(shù)值的個(gè)位,需要顯示小數(shù)點(diǎn),所有將千位的字符串于(&) 0x7f。
為了實(shí)現(xiàn)四位LED數(shù)碼管同時(shí)顯示,需要先將四位LED數(shù)碼管位選關(guān)斷,然后再依次開啟一位位選并給段選負(fù)值,并且如此循環(huán)4次。
void display(double d)
{
unsigned char TABLENUM[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
char ch4,ch3,ch2,ch1;
int val;
val = d*1000;
ch4 = TABLENUM[val/1000%10]& 0x7f;
ch3 = TABLENUM[val/100%10];
ch2 = TABLENUM[val/10%10];
ch1 = TABLENUM[val%10];
BitDG1_PutVal(1);
BitDG2_PutVal(1);
BitDG3_PutVal(1);
BitDG4_PutVal(1);
BitDG1_PutVal(0);
BitsLED_PutVal(ch4);
BitDG1_PutVal(1);
BitDG2_PutVal(1);
BitDG3_PutVal(1);
BitDG4_PutVal(1);
BitDG2_PutVal(0);
BitsLED_PutVal(ch3);
BitDG1_PutVal(1);
BitDG2_PutVal(1);
BitDG3_PutVal(1);
BitDG4_PutVal(1);
BitDG3_PutVal(0);
BitsLED_PutVal(ch2);
BitDG1_PutVal(1);
BitDG2_PutVal(1);
BitDG3_PutVal(1);
BitDG4_PutVal(1);
BitDG4_PutVal(0);
BitsLED_PutVal(ch1);
}