用Rowley CrossWorks和MAXQ3120評估板創(chuàng)建照度計應(yīng)用系統(tǒng)
maxq3120評估板包含了演示maxq3120主要功能所需要的元件,用戶使用該評估板,可以在硬件設(shè)計的同時,立即進(jìn)行軟件開發(fā)。該評估板具有以下特征:
本文引用地址:http://butianyuan.cn/article/21288.htm帶8mhz晶振的80引腳mqfp封裝maxq3120微控制器
串口-jtag接口板,可以采用pc主機(jī)編程和調(diào)試
3.3v線性調(diào)節(jié)器,直接通過jtag接口為maxq3120供電
maxq3120直接驅(qū)動的靜態(tài)3.5位lcd顯示器
復(fù)位和外部中斷按鈕
對應(yīng)maxq3120串口1的rs-232接口和連接器
包含模擬vdd和4個模數(shù)轉(zhuǎn)換器(adc)輸入引腳連接點(diǎn)的原型設(shè)計區(qū)
本系統(tǒng)配合使用串口-jtag接口電路板(圖1),可以完全實(shí)現(xiàn)maxq3120的在系統(tǒng)引導(dǎo)裝入和調(diào)試功能。
圖1. maxq3120評估板和串口-jtag電路板共同構(gòu)成完整的應(yīng)用開發(fā)系統(tǒng)。 在rowley crossworks中創(chuàng)建工程
一旦激活產(chǎn)品(見rowley網(wǎng)站的"support:evaluating crossworks"),運(yùn)行crossworks。選擇菜單中的file new new project,創(chuàng)建一個新工程。在new project options對話框中(圖2),選擇"c executable",輸入工程的名稱和存儲位置。在隨后的project setup對話框(見圖3),確認(rèn)"target processor"選項(xiàng)為maxq3120。其它選項(xiàng)可保留為缺省值。點(diǎn)擊finish創(chuàng)建新工程。
圖2. 創(chuàng)建新工程的第一步:選擇可執(zhí)行程序類型。
圖3. 該工程的目標(biāo)處理器為maxq3120。 應(yīng)用概要
本maxq3120演示示例著重展示了處理器的三項(xiàng)關(guān)鍵特性:adc、lcd控制器和uart接口。使用這些外設(shè),我們可以創(chuàng)建完成以下功能的應(yīng)用系統(tǒng),該應(yīng)用精確測量電壓,在lcd上顯示這些電壓,并通過usart串行接口發(fā)送數(shù)據(jù)??上螺d本示例的完整代碼。
maxq3120 adc接口的滿量程測量范圍可配置為-1v到+1v之間,并在兩個通道中任何一個通道的兩輸入引腳間進(jìn)行差分測量。要進(jìn)行光照強(qiáng)度測量,我們需要一種簡單方法來產(chǎn)生處于該量程范圍內(nèi)的隨周圍光線變化的電壓。
光導(dǎo)式傳感器(圖4)的電阻隨光強(qiáng)度變化而變化。隨著光強(qiáng)度增加,傳感器電阻降低,可使傳感器流過的電流增大。本例的光傳感器采用了photonic detectors, inc.的pdv-p8001,最大電阻(完全黑暗情況下)約200k,最小電阻約3k。
圖4. 光導(dǎo)式傳感器的阻抗隨光照強(qiáng)度增加而減小。 阻性傳感器的連接如圖5所示,該連接方式使我們可以將傳感器與maxq3120 adc的一個輸入通道連接,而不用考慮傳感器的最小和最大電阻。即使在完全短路(結(jié)果電壓為0v)或者開路(結(jié)果電壓為0.825v)的最壞情況下,輸入電壓也不會超出adc通道的允許范圍。
圖5. 使用本adc輸入電路可測量任何類型的電阻傳感器 測量光照強(qiáng)度
我們必須首先測量maxq3120 adc通道的輸入電壓。當(dāng)新的電壓采樣就緒后,adc 產(chǎn)生一個中斷,因此我們只需初始化adc并使能中斷。
// initialize the adc
adcn = 0x0030; // flush samples
adcn = 0x0300; // power down
adcn = 0x0200; // power up
imr = 0x08; // enable interrupts from module 3
ic = 0x01; // enable interrupts globally
在crossworks中,任何函數(shù)都能通過在函數(shù)定義中增加_interrupt關(guān)鍵字,而被指定為中斷服務(wù)函數(shù)。因?yàn)閙axq3120的所有中斷均指向iv寄存器內(nèi)包含的地址,所以我們只需要定義一個中斷服務(wù)函數(shù)。本應(yīng)用程序僅使用了一個中斷,如果我們想增加其他中斷,可以在中斷服務(wù)函數(shù)內(nèi)檢查其他寄存器,以確定哪個中斷觸發(fā)了中斷服務(wù)函數(shù)。
void adc_interrupt(void) __interrupt
{
current_sample = (int)adc0;
sample_count++;
}
void main(void)
{
setiv(adc_interrupt);
...
中斷服務(wù)函數(shù)adc_interrupt求取adc通道0最后16個采樣結(jié)果的移動平均值。這可濾除輸入的高頻噪聲,并獲得大約2.4khz的輸出采樣率。由于顯示和傳輸采樣的頻率相當(dāng)?shù)停员緫?yīng)用系統(tǒng)的性能不會受到影響。
顯示采樣電壓
為簡單起見,我們直接顯示從adc通道0讀出的原始電壓,來表示所測量的光照強(qiáng)度。該電壓在0到1v之間,能以0.001v的精度在所包含的lcd顯示器上顯示。
maxq3120評估板上的lcd采用3.5位靜態(tài)lcd,帶有正/負(fù)和小數(shù)點(diǎn)指示,布局如圖6所示。與lcd接口的第一步是初始化maxq3120
lcd控制器。
void lcd_init(void)
{
lcra = 0x02e0; // 0000 0010 1110 0000, static, 32khz, radj=0
lcfg = 0xf3; // use all pins, enable display
lcd0 = 0xff; // initialize all segments to on
lcd1 = 0xff;
lcd2 = 0xff;
lcd3 = 0x0f;
}
圖6. maxq3120評估板為應(yīng)用提供3.5位靜態(tài)lcd。 lcd初始化完成后,我們即可增加代碼,設(shè)置顯示器的適當(dāng)段來顯示某特定的數(shù)值。lcd的各個段與各寄存器位一一對應(yīng)(表1),因此在顯示器上顯示字符只需簡單地向各寄存器寫入合適的數(shù)值。lcd控制器處理余下的問題。
因?yàn)橛行╋@示位的各段分布在一個以上的lcd存儲器寄存器中,若要在不影響其他字符顯示的前提下改變某一特定字符,需要進(jìn)行兩個操作。首先,選出對應(yīng)該字符的所有寄存器位。其次,寫入新字符的寄存器位值。
unsigned char lcd0_mask[] =
{
0xff, // digit 0 (rightmost)
0x7f, // digit 1 (center)
0x80 // digit 2 (leftmost)
};
....
unsigned char lcd0_table[] =
{
// digit 0
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// digit 1
0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80,
// digit 2
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x67
};
....
void lcd_display(int value, int digit)
{
int index;
if ((digit == 0) || (digit == 1) || (digit == 2)) {
index = digit * 10 + value;
lcd0 &= lcd0_mask[digit];
lcd1 &= lcd1_mask[digit];
lcd2 &= lcd2_mask[digit];
lcd0 |= lcd0_table[index];
lcd1 |= lcd1_table[index];
lcd2 |= lcd2_table[index];
}
}
這些子程序準(zhǔn)備就緒后,所有剩下的問題就是將采樣平均值轉(zhuǎn)換成十進(jìn)位形式,并在lcd上顯示。因?yàn)椴蓸铀俾时萳cd顯示采樣結(jié)果或人眼睛能看到的結(jié)果快得多,本應(yīng)用程序在各次lcd刷新之間加入一個延時循環(huán)。在中斷程序中獲得各采樣結(jié)果并連續(xù)求得平均值,但這些平均采樣值只是周期性地在lcd上顯示。
while (1)
{
ic = 0; // clear interrupts to make sure we copy correctly
ltemp = current_sample; // from our global variable to our local
copy
local_count = interrupts;
ic = 1; // enable interrupts ends the critical section
ltemp = ltemp * 100;
// divide by 32k
ltemp = ltemp >> 15;
local_sample = (int) ltemp;
sign = 0;
if (local_sample < 0) {
sign = 1;
local_sample = local_sample * -1;
}
lcd_display(local_sample % 10, 0);
local_sample = local_sample / 10;
lcd_display(local_sample % 10, 1);
local_sample = local_sample / 10;
lcd_display(local_sample % 10, 2);
local_sample = local_sample / 10;
if (local_sample != 0) {
// set leading 1
lcd_set1000s();
}
if (sign == 1) {
lcd_setnegative();
} else {
lcd_setpositive();
}
for (counter = 0; counter < 1000; counter++) {
// just a simple delay loop
}
}
每當(dāng)電平上升到0.5v以上(local_sample > 50)時,我們就點(diǎn)亮一只led (由端口引腳p0.6驅(qū)動),作為額外指示。環(huán)境光線強(qiáng)度一旦低于某一特定水平(如關(guān)掉房間電燈時),led的發(fā)光指示可產(chǎn)生一種“夜光”效果。
if (local_sample > 50) {
po0 = 0x8f;
} else {
po0 = 0xff;
}
向pc返回結(jié)果
在可視化顯示的同時,我們可擴(kuò)展本應(yīng)用程序的功能,將采樣值送到pc主機(jī),用于后續(xù)處理和分析。最簡單的方法是向串口1寫ascii碼數(shù)據(jù),經(jīng)電平轉(zhuǎn)換并送入db9
rs-232連接器。然后, 只需簡單地將串口與pc連接,使用一個標(biāo)準(zhǔn)終端仿真程序獲取數(shù)據(jù)。
crossworks提供標(biāo)準(zhǔn)的c printf()函數(shù),作為其基本庫的一部分,這樣,將數(shù)據(jù)格式轉(zhuǎn)換成ascii碼十進(jìn)制形式的大部分工作已經(jīng)完成。所有剩下的工作是初始化和控制傳送數(shù)據(jù)的串口。通過定義_putchar函數(shù)在串口輸出一個字符,實(shí)現(xiàn)與printf()的接口。這樣,printf()將在必要時自動調(diào)用此函數(shù)。
int initserial(void)
{
scon1 = (1<<6)|(1<<4); // set to mode 1 (10-bit asynchronous)
& enable
smd1 = 2; // baud rate = 16 x baud clock
pr1 = 0x095d; // p = 2^21 * 9600 / 8mhz crystal
}
int __putchar(int x)
{
sbuf1 = x;
while (!(scon1 & 2));
scon1 &= ~2;
}
為確定輸出采樣之間的時間間隔,本應(yīng)用程序在通過串口發(fā)送每個采樣時,同時發(fā)送原始的adc中斷次數(shù)。在9600波特率下,通過串口輸出10個字符約需100ms。
只有在用戶請求時數(shù)據(jù)才寫入串口,通過按下maxq3120評估板上pb1-pb4中的任何一個按鈕實(shí)現(xiàn)該操作。
if ((pi0 & 0x27) != 0x27) {
printf("%dt%d
", local_count, local_sample);
}
為說明接收數(shù)據(jù)的時序,圖7給出了典型辦公室環(huán)境下打開/關(guān)閉電燈時的照度,以及照相機(jī)消除紅眼閃光燈的照度曲線。為檢測這類照相機(jī)所使用的雙閃光脈沖的特性,這種采樣速率和光傳感器響應(yīng)度已足夠高。注意,采樣值的減小(表示照度增加)幾乎與照度變化同時發(fā)生,采樣值的升高(表示照度降低)顯示了光傳感器在光強(qiáng)度下降時的調(diào)節(jié)特性曲線。
圖7. 測量照相機(jī)消除紅眼閃光燈時得到這些光強(qiáng)采樣結(jié)果。 結(jié)語
maxq3120集成了通用雙通道adc,其處理能力足以應(yīng)付復(fù)雜的信號分析任務(wù)。除此之外,maxq3120還具備充足的能力進(jìn)行顯示控制、與主機(jī)通訊以及完成數(shù)據(jù)采集系統(tǒng)需要的其他任務(wù)。再加上rowley associates的crossworks所提供的完備工具和開發(fā)環(huán)境鼎力相助,任何不具備maxq處理器架構(gòu)專門知識的人,都能很快使用標(biāo)準(zhǔn)ansi c開發(fā)和調(diào)試數(shù)據(jù)采集及處理應(yīng)用程序。
評論