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