李蛟龍,任子真
(沈陽化工大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,遼寧 沈陽 110142)
數(shù)據(jù)采集(DAQ)是指在傳感器和其他設(shè)備中對(duì)模擬和數(shù)字單元進(jìn)行非電量或電量信號(hào)的自動(dòng)采集和分析處理[1].在工廠里監(jiān)控環(huán)境及設(shè)備的正常運(yùn)轉(zhuǎn),需要測量電流、電壓、溫度等參數(shù).這時(shí)數(shù)據(jù)采集的正確性就顯得尤為重要,也對(duì)數(shù)據(jù)采集卡提出了較高的要求.現(xiàn)階段國內(nèi)外板卡均參照IBM-PC機(jī)的總線技術(shù)標(biāo)準(zhǔn)設(shè)計(jì)和生產(chǎn),用戶只要把這類板卡插入IBM-PC機(jī)主板上相應(yīng)的I/O擴(kuò)展槽中就可以迅速方便地構(gòu)成一個(gè)數(shù)據(jù)采集與處理系統(tǒng),但相對(duì)成本較高,不便于攜帶.所以本文提出了一種低成本、高性能的數(shù)據(jù)采集卡設(shè)計(jì)方案,便于攜帶且性價(jià)比較高.采用STM32作為微控制器,并用內(nèi)嵌式A/D轉(zhuǎn)換模塊將采集的信號(hào)進(jìn)行轉(zhuǎn)換、CAN總線進(jìn)行傳輸?shù)囊惶讛?shù)據(jù)采集卡程序,同時(shí)配備上位機(jī)形成一套完整的數(shù)據(jù)采集系統(tǒng).該系統(tǒng)具有高性能、低成本、方便攜帶的特點(diǎn).數(shù)據(jù)采集卡的設(shè)計(jì)包括嵌入式硬件設(shè)計(jì)和嵌入式軟件設(shè)計(jì)兩部分:硬件設(shè)計(jì)包括A/D轉(zhuǎn)換電路設(shè)計(jì)和CAN總線電路設(shè)計(jì);軟件設(shè)計(jì)包括 A/D轉(zhuǎn)換程序設(shè)計(jì)和CAN總線程序設(shè)計(jì).
采集卡的硬件設(shè)計(jì)主要是最小系統(tǒng)電路的設(shè)計(jì)和轉(zhuǎn)換傳輸?shù)碾娐吩O(shè)計(jì).最小系統(tǒng)電路的主要作用是形成單片機(jī)的基本功能電路;轉(zhuǎn)換和傳輸?shù)碾娐酚脕韺㈦妷?、電流、溫度信?hào)轉(zhuǎn)化及數(shù)據(jù)的實(shí)時(shí)傳輸.根據(jù)控制要求向MCU發(fā)出響應(yīng),采集所需要的信號(hào),收集到的信號(hào)將傳輸?shù)絊TM32芯片,在上位機(jī)下載程序.采集卡的軟件設(shè)計(jì)主要是由A/D信號(hào)采集模塊、CAN總線數(shù)據(jù)傳輸模塊、I/O口輸入輸出程序組成.采集卡的總體設(shè)計(jì)框圖如圖1所示.
圖1 總體設(shè)計(jì)
STM32F103xx增強(qiáng)型系列由意法半導(dǎo)體集團(tuán)設(shè)計(jì),使用高性能ARMCortex-M3、32位的RISC內(nèi)核,工作頻率為72 MHz,內(nèi)置高速存儲(chǔ)器(高達(dá)128 kB的閃存和20 kB的SRAM),豐富的I/O端口和外圍設(shè)備及APB總線[2].所有類型的設(shè)備包含2個(gè)12位的ADC、3個(gè)通用16位定時(shí)器和1個(gè)PWM定時(shí)器,也包括標(biāo)準(zhǔn)和先進(jìn)的通信接口:I2C、SPI、3個(gè)USART、1個(gè)USB和1個(gè)CAN.具有高性能、實(shí)時(shí)功能、數(shù)字信號(hào)處理、低功耗和低電壓運(yùn)行特性,同時(shí)保持了高集成度和易開發(fā)性的特點(diǎn)[3].圖2為最小系統(tǒng)電路圖.
圖2 最小系統(tǒng)電路
A/D轉(zhuǎn)換是將模擬信號(hào)轉(zhuǎn)變?yōu)閿?shù)字信號(hào),通過特定的電路來實(shí)現(xiàn).模擬量可以是電壓、電流等電信號(hào),也可以是壓力、溫度、濕度、位移、聲音等非電信號(hào).在A/D轉(zhuǎn)換之前,A/D轉(zhuǎn)換器的輸入信號(hào)必須是通過各種傳感器將各種物理量轉(zhuǎn)換成的電壓信號(hào).
ADC是一種逐次逼近型模擬數(shù)字轉(zhuǎn)換器,有18個(gè)通道,可測量16個(gè)外部和2個(gè)內(nèi)部信號(hào)源.各通道的A/D轉(zhuǎn)換可以單次、連續(xù)、掃描或者間接模式執(zhí)行,ADC的結(jié)果可以用對(duì)齊的方式存儲(chǔ)在16位的數(shù)據(jù)寄存器中[4].
轉(zhuǎn)換的核心是將供電電路進(jìn)行必要的降壓和升壓,單片機(jī)A/D輸入信號(hào)的電壓范圍從0~3.3 V提高至-12~12 V,經(jīng)過電壓輸入、轉(zhuǎn)入輸入通道、轉(zhuǎn)換順序、觸發(fā)源、轉(zhuǎn)換時(shí)間、中斷、電壓轉(zhuǎn)換的步驟完成ADC轉(zhuǎn)換.
CAN總線不同于I2C總線和SPI總線.CAN總線定義了一個(gè)更優(yōu)秀的物理層和數(shù)據(jù)鏈路層,是一個(gè)真正的多主機(jī)網(wǎng)絡(luò).當(dāng)總線處于空閑狀態(tài)時(shí),任何節(jié)點(diǎn)單元都可以應(yīng)用成為主機(jī).其原理為首先訪問總線的節(jié)點(diǎn),節(jié)點(diǎn)可以獲得總線的控制權(quán),當(dāng)多個(gè)節(jié)點(diǎn)同時(shí)獲取總線的控制權(quán)時(shí),會(huì)發(fā)生仲裁事件,高優(yōu)先級(jí)的節(jié)點(diǎn)將獲得總線控制權(quán).
CAN總線的物理連接只需兩根線,常稱為CAN_H和CAN_L,通過差分信號(hào)進(jìn)行數(shù)據(jù)的傳輸.CAN總線有兩種電平,分別為隱形電平和顯性電平,因此兩種電平有著以下關(guān)系:若隱形電平相遇,則總線表現(xiàn)為隱形電平;若顯性電平相遇,則總線表現(xiàn)為顯性電平;若隱形電平和顯性電平相遇,則總線表現(xiàn)為顯性電平[5].CAN總線收發(fā)示意圖如圖3所示.
圖4、圖5分別為采集卡電路板的打樣圖和實(shí)物圖.
圖3 CAN收發(fā)示意圖
圖4 電路板打樣圖
圖5 電路板實(shí)物圖
(1)配置RCC寄存器組,配置PLL時(shí)鐘為72 MHz并作為主時(shí)鐘,配置PCLK2為PLL的2分頻,并配置ADC時(shí)鐘為PCLK2的4分頻.
(2)打開ADC設(shè)備時(shí)鐘,同時(shí)打開GPIOB設(shè)備時(shí)鐘.
(3)配置GPIOB.0引腳為模擬輸入模式.
(4)初始化ADC寄存器組,使用ADC1第8轉(zhuǎn)換通道,轉(zhuǎn)換通道數(shù)為1,采樣時(shí)間為60 s.
(5)配置USART寄存器組.
ADC完成單次轉(zhuǎn)換所需時(shí)間為
tcov=Nperiod/fadc.
其中:t為單次轉(zhuǎn)換時(shí)間;N為整個(gè)轉(zhuǎn)換所需周期;f為時(shí)鐘頻率.
ADC轉(zhuǎn)換與采樣電壓之間的關(guān)系:STM32微控制器的ADC為12位精度,則表示其轉(zhuǎn)換結(jié)果數(shù)據(jù)最大為0X0FFF,測取STM32的參考電壓為Uref轉(zhuǎn)換為Usample,利用公式計(jì)算出所對(duì)應(yīng)的采樣電壓Usample[6]為
Usample=Uref×Uvalue/(0X0FFF+1).
為了保證采樣速度,采樣的最小時(shí)間選擇為1 μs,A/D獨(dú)立模式,單通道、單次、右對(duì)齊,按照規(guī)則通道轉(zhuǎn)換完成.圖6為A/D轉(zhuǎn)換的程序設(shè)計(jì)流程.
圖6 A/D轉(zhuǎn)換的程序設(shè)計(jì)流程
(1)初始化RCC寄存器組,配置PLL輸出時(shí)鐘,分別打開CAN、GPIOA、USART1的設(shè)備時(shí)鐘.
(2)設(shè)置CAN的Tx引腳為復(fù)用推挽模式,并設(shè)置Rx引腳為上拉輸入模式.
(3)初始化控制器寄存器組,其中CAN工作模式為環(huán)回模式.
(4)初始化USART、使用拓展數(shù)據(jù)幀格式發(fā)送,ID為0XAA,數(shù)據(jù)長度為8.
計(jì)算波特率是使用任何總線的重要內(nèi)容之一,CAN波特率計(jì)算公式為
波特率=1/正常的位時(shí)間[7].
其中:正常的位時(shí)間=1×tq+tbs1+tbs2,tq=CAN的分頻數(shù)×tpclk,ttpclk為APB1總線的時(shí)鐘周期;tbs1和tbs2稱為時(shí)間段1、時(shí)間段2,這兩個(gè)階段的時(shí)間長度都是以tq的時(shí)間單元為單位,tbs1的時(shí)間長度設(shè)置為8tq,tbs2的時(shí)間長度設(shè)置為7tq.
CAN通信實(shí)驗(yàn)流程如圖7所示.
圖7 CAN通信實(shí)驗(yàn)流程
采集卡主程序設(shè)計(jì)的部分代碼如下:
main主函數(shù)
#include “stm32f10x.h”
#include “iwdg.h”
#include “adc.h”
#include “can.h”
#include “l(fā)ed.h”
extern vu16 AD_Value[50][3];//用來存放ADC轉(zhuǎn)換結(jié)果,也是DMA的轉(zhuǎn)換地址
extern vu16 After_filter[3];//用來存放平均值之后的結(jié)果
u16 GetVolt(u16 advalue0);//獲取電壓值
u16 GetCurrent(u16 advalue1);//獲取電流值
u16 GetTemp(u16 advalue2);//獲取溫度
int main(void)
{
u8 TransmitMailbox = 0;//定義消息發(fā)送狀態(tài)變量
CanTxMsg TxMessage;//定義消息發(fā)送結(jié)構(gòu)體
IWDG_Configuration();//設(shè)置獨(dú)立看門狗
CAN_Configuration();//配置CAN控制器
ADC_Configuration();//配置ADC
DMA_Configuration();//配置DAM
LED_On();//LED指示燈點(diǎn)亮
while(1)
{
filter();//求平均值函數(shù)
TxMessage.StdId = 0x317;//標(biāo)準(zhǔn)ID:0x317
TxMessage.RTR = CAN_RTR_DATA;//類型為數(shù)據(jù)幀
TxMessage.IDE = CAN_ID_STD;//使用標(biāo)準(zhǔn)標(biāo)識(shí)符
TxMessage.DLC = 8;//數(shù)據(jù)長度為8字節(jié)
TxMessage.Data[0]= 0x00;
TxMessage.Data[1]= 0x00;
TxMessage.Data[2]=(unsigned char)(GetTemp(After_filter[0])>>8);//溫度傳輸
TxMessage.Data[3]=(unsigned char)(GetTemp(After_filter[0]));
TxMessage.Data[4]=(unsigned char)(GetVolt(After_filter[1])>>8);//電壓傳輸
TxMessage.Data[5]=(unsigned char)(GetVolt(After_filter[1]));
TxMessage.Data[6]=(unsigned char)(GetCurrent(After_filter[2])>>8);//電流傳輸
TxMessage.Data[7]=(unsigned char)(GetCurrent(After_filter[2]));
TransmitMailbox = CAN_Transmit(CAN1,&TxMessage);//數(shù)據(jù)發(fā)送
while((CAN_TransmitStatus(CAN1,TransmitMailbox)!= CANTXOK));//等待發(fā)送完成
IWDG_ReloadCounter();//看門狗喂狗
}
}
通過硬件電路板的焊制以及調(diào)試和上位機(jī)的演示接收發(fā)送可以很完整地采集到數(shù)據(jù),形成一個(gè)簡潔完善的系統(tǒng).采用STM32芯片內(nèi)置A/D轉(zhuǎn)換功能、CAN總線傳輸?shù)葍?nèi)部功能,成本低廉,設(shè)計(jì)簡單,易于使用.系統(tǒng)不足之處在于只能實(shí)現(xiàn)較小量的數(shù)據(jù)采集,有待繼續(xù)開發(fā),現(xiàn)階段可實(shí)現(xiàn)小規(guī)模產(chǎn)品的運(yùn)營,可以適用于儀器儀表,計(jì)算機(jī)等領(lǐng)域.