新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用Rowley CrossWorks和MAXQ3120評(píng)估板創(chuàng)建照度計(jì)應(yīng)用系統(tǒng)

用Rowley CrossWorks和MAXQ3120評(píng)估板創(chuàng)建照度計(jì)應(yīng)用系統(tǒng)

——
作者:圖5. 使用本ADC輸入電路可測(cè)量任何類型的電阻傳感器 時(shí)間:2007-01-26 來(lái)源:《Maxim》 收藏
面向maxq (的crossworks為實(shí)現(xiàn)基于maxq平臺(tái)的c應(yīng)用程序開(kāi)發(fā)提供了功能全面的開(kāi)發(fā)環(huán)境。crossworks包含的ansi c編譯器、匯編器和連接器專為maxq架構(gòu)而優(yōu)化,同時(shí)包括一個(gè)可與硬件調(diào)試引擎和大多數(shù)maxq微控制器提供的jtag接口相連接的調(diào)試器。所有這些功能組件完全集成到基于工程的開(kāi)發(fā)環(huán)境中,該開(kāi)發(fā)環(huán)境提供全面的幫助系統(tǒng),并為maxq2000和maxq3120等maxq微控制器提供內(nèi)在支持和樣例程序。注意,目前面向maxq的rowley crossworks僅限于windows? (平臺(tái)。可下載30天試用版軟件。

maxq3120評(píng)估板包含了演示maxq3120主要功能所需要的元件,用戶使用該評(píng)估板,可以在硬件設(shè)計(jì)的同時(shí),立即進(jìn)行軟件開(kāi)發(fā)。該評(píng)估板具有以下特征:

本文引用地址:http://m.butianyuan.cn/article/21288.htm

帶8mhz晶振的80引腳mqfp封裝maxq3120微控制器
串口-jtag接口板,可以采用pc主機(jī)編程和調(diào)試
3.3v線性調(diào)節(jié)器,直接通過(guò)jtag接口為maxq3120供電
maxq3120直接驅(qū)動(dòng)的靜態(tài)3.5位lcd顯示器
復(fù)位和外部中斷按鈕
對(duì)應(yīng)maxq3120串口1的rs-232接口和連接器
包含模擬vdd和4個(gè)模數(shù)轉(zhuǎn)換器(adc)輸入引腳連接點(diǎn)的原型設(shè)計(jì)區(qū)
本系統(tǒng)配合使用串口-jtag接口電路板(圖1),可以完全實(shí)現(xiàn)maxq3120的在系統(tǒng)引導(dǎo)裝入和調(diào)試功能。


圖1. maxq3120評(píng)估板和串口-jtag電路板共同構(gòu)成完整的應(yīng)用開(kāi)發(fā)系統(tǒng)。 在rowley crossworks中創(chuàng)建工程

一旦激活產(chǎn)品(見(jiàn)rowley網(wǎng)站的"support:evaluating crossworks"),運(yùn)行crossworks。選擇菜單中的file new new project,創(chuàng)建一個(gè)新工程。在new project options對(duì)話框中(圖2),選擇"c executable",輸入工程的名稱和存儲(chǔ)位置。在隨后的project setup對(duì)話框(見(jiàn)圖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)用精確測(cè)量電壓,在lcd上顯示這些電壓,并通過(guò)usart串行接口發(fā)送數(shù)據(jù)??上螺d本示例的完整代碼。

maxq3120 adc接口的滿量程測(cè)量范圍可配置為-1v到+1v之間,并在兩個(gè)通道中任何一個(gè)通道的兩輸入引腳間進(jìn)行差分測(cè)量。要進(jìn)行光照強(qiáng)度測(cè)量,我們需要一種簡(jiǎn)單方法來(lái)產(chǎn)生處于該量程范圍內(nèi)的隨周圍光線變化的電壓。

光導(dǎo)式傳感器(圖4)的電阻隨光強(qiáng)度變化而變化。隨著光強(qiáng)度增加,傳感器電阻降低,可使傳感器流過(guò)的電流增大。本例的光傳感器采用了photonic detectors, inc.的pdv-p8001,最大電阻(完全黑暗情況下)約200k,最小電阻約3k。


圖4. 光導(dǎo)式傳感器的阻抗隨光照強(qiáng)度增加而減小。 阻性傳感器的連接如圖5所示,該連接方式使我們可以將傳感器與maxq3120 adc的一個(gè)輸入通道連接,而不用考慮傳感器的最小和最大電阻。即使在完全短路(結(jié)果電壓為0v)或者開(kāi)路(結(jié)果電壓為0.825v)的最壞情況下,輸入電壓也不會(huì)超出adc通道的允許范圍。


圖5. 使用本adc輸入電路可測(cè)量任何類型的電阻傳感器 測(cè)量光照強(qiáng)度

我們必須首先測(cè)量maxq3120 adc通道的輸入電壓。當(dāng)新的電壓采樣就緒后,adc 產(chǎn)生一個(gè)中斷,因此我們只需初始化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ù)都能通過(guò)在函數(shù)定義中增加_interrupt關(guān)鍵字,而被指定為中斷服務(wù)函數(shù)。因?yàn)閙axq3120的所有中斷均指向iv寄存器內(nèi)包含的地址,所以我們只需要定義一個(gè)中斷服務(wù)函數(shù)。本應(yīng)用程序僅使用了一個(gè)中斷,如果我們想增加其他中斷,可以在中斷服務(wù)函數(shù)內(nèi)檢查其他寄存器,以確定哪個(gè)中斷觸發(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個(gè)采樣結(jié)果的移動(dòng)平均值。這可濾除輸入的高頻噪聲,并獲得大約2.4khz的輸出采樣率。由于顯示和傳輸采樣的頻率相當(dāng)?shù)停员緫?yīng)用系統(tǒng)的性能不會(huì)受到影響。


顯示采樣電壓

為簡(jiǎn)單起見(jiàn),我們直接顯示從adc通道0讀出的原始電壓,來(lái)表示所測(cè)量的光照強(qiáng)度。該電壓在0到1v之間,能以0.001v的精度在所包含的lcd顯示器上顯示。
maxq3120評(píng)估板上的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評(píng)估板為應(yīng)用提供3.5位靜態(tài)lcd。 lcd初始化完成后,我們即可增加代碼,設(shè)置顯示器的適當(dāng)段來(lái)顯示某特定的數(shù)值。lcd的各個(gè)段與各寄存器位一一對(duì)應(yīng)(表1),因此在顯示器上顯示字符只需簡(jiǎn)單地向各寄存器寫入合適的數(shù)值。lcd控制器處理余下的問(wèn)題。
因?yàn)橛行╋@示位的各段分布在一個(gè)以上的lcd存儲(chǔ)器寄存器中,若要在不影響其他字符顯示的前提下改變某一特定字符,需要進(jìn)行兩個(gè)操作。首先,選出對(duì)應(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)備就緒后,所有剩下的問(wèn)題就是將采樣平均值轉(zhuǎn)換成十進(jìn)位形式,并在lcd上顯示。因?yàn)椴蓸铀俾时萳cd顯示采樣結(jié)果或人眼睛能看到的結(jié)果快得多,本應(yīng)用程序在各次lcd刷新之間加入一個(gè)延時(shí)循環(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)時(shí),我們就點(diǎn)亮一只led (由端口引腳p0.6驅(qū)動(dòng)),作為額外指示。環(huán)境光線強(qiáng)度一旦低于某一特定水平(如關(guān)掉房間電燈時(shí)),led的發(fā)光指示可產(chǎn)生一種“夜光”效果。

if (local_sample > 50) {
po0 = 0x8f;
} else {
po0 = 0xff;
}


向pc返回結(jié)果

在可視化顯示的同時(shí),我們可擴(kuò)展本應(yīng)用程序的功能,將采樣值送到pc主機(jī),用于后續(xù)處理和分析。最簡(jiǎn)單的方法是向串口1寫ascii碼數(shù)據(jù),經(jīng)電平轉(zhuǎn)換并送入db9 rs-232連接器。然后, 只需簡(jiǎn)單地將串口與pc連接,使用一個(gè)標(biāo)準(zhǔn)終端仿真程序獲取數(shù)據(jù)。

crossworks提供標(biāo)準(zhǔn)的c printf()函數(shù),作為其基本庫(kù)的一部分,這樣,將數(shù)據(jù)格式轉(zhuǎn)換成ascii碼十進(jìn)制形式的大部分工作已經(jīng)完成。所有剩下的工作是初始化和控制傳送數(shù)據(jù)的串口。通過(guò)定義_putchar函數(shù)在串口輸出一個(gè)字符,實(shí)現(xiàn)與printf()的接口。這樣,printf()將在必要時(shí)自動(dòng)調(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;
}

為確定輸出采樣之間的時(shí)間間隔,本應(yīng)用程序在通過(guò)串口發(fā)送每個(gè)采樣時(shí),同時(shí)發(fā)送原始的adc中斷次數(shù)。在9600波特率下,通過(guò)串口輸出10個(gè)字符約需100ms。

只有在用戶請(qǐng)求時(shí)數(shù)據(jù)才寫入串口,通過(guò)按下maxq3120評(píng)估板上pb1-pb4中的任何一個(gè)按鈕實(shí)現(xiàn)該操作。


if ((pi0 & 0x27) != 0x27) {
printf("%dt%d
", local_count, local_sample);
}

為說(shuō)明接收數(shù)據(jù)的時(shí)序,圖7給出了典型辦公室環(huán)境下打開(kāi)/關(guān)閉電燈時(shí)的照度,以及照相機(jī)消除紅眼閃光燈的照度曲線。為檢測(cè)這類照相機(jī)所使用的雙閃光脈沖的特性,這種采樣速率和光傳感器響應(yīng)度已足夠高。注意,采樣值的減小(表示照度增加)幾乎與照度變化同時(shí)發(fā)生,采樣值的升高(表示照度降低)顯示了光傳感器在光強(qiáng)度下降時(shí)的調(diào)節(jié)特性曲線。


圖7. 測(cè)量照相機(jī)消除紅眼閃光燈時(shí)得到這些光強(qiáng)采樣結(jié)果。 結(jié)語(yǔ)

maxq3120集成了通用雙通道adc,其處理能力足以應(yīng)付復(fù)雜的信號(hào)分析任務(wù)。除此之外,maxq3120還具備充足的能力進(jìn)行顯示控制、與主機(jī)通訊以及完成數(shù)據(jù)采集系統(tǒng)需要的其他任務(wù)。再加上rowley associates的crossworks所提供的完備工具和開(kāi)發(fā)環(huán)境鼎力相助,任何不具備maxq處理器架構(gòu)專門知識(shí)的人,都能很快使用標(biāo)準(zhǔn)ansi c開(kāi)發(fā)和調(diào)試數(shù)據(jù)采集及處理應(yīng)用程序。



關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉