999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于I2C總線的云臺電機(jī)控制系統(tǒng)設(shè)計

2015-08-02 03:54:48廖建尚
關(guān)鍵詞:設(shè)備

廖建尚

(廣東交通職業(yè)技術(shù)學(xué)院 計算機(jī)工程學(xué)院,廣州 510650)

廖建尚

(廣東交通職業(yè)技術(shù)學(xué)院 計算機(jī)工程學(xué)院,廣州 510650)

本文分析了I2C的工作原理和Linux的I2C總線驅(qū)動程序,構(gòu)建了高速公路視頻監(jiān)控系統(tǒng)下基于I2C云臺電機(jī)控制系統(tǒng),完成了基于ARM和Linux的I2C驅(qū)動程序、I2C應(yīng)用程序和云臺電機(jī)控制應(yīng)用程序設(shè)計,實(shí)現(xiàn)了應(yīng)用程序控制云臺電機(jī),并應(yīng)用于高速公路視頻監(jiān)控系統(tǒng)中,達(dá)到全方位的高速公路視頻監(jiān)控,具有良好的效果和較高的應(yīng)用價值。

視頻監(jiān)控;云臺電機(jī);I2C驅(qū)動;Linux

引 言

本文研究詳細(xì)分析了I2C總線的工作原理、通信協(xié)議和Linux的I2C總線驅(qū)動程序,并設(shè)計一個應(yīng)用在高速公路視頻監(jiān)控中的基于I2C總線的云臺電機(jī)驅(qū)動系統(tǒng),為高速公路的全方位視頻監(jiān)控提供一個設(shè)計方案。

1 高速公路視頻監(jiān)控系統(tǒng)以及云臺電機(jī)整體設(shè)計

高速公路高清視頻監(jiān)控系統(tǒng)采用TI公司的TMS320DM368(以下簡稱DM368),DM368是一款面向多媒體技術(shù)應(yīng)用的高性能芯片,功能強(qiáng)大,集成了ARM926EJ-S內(nèi)核、硬件編碼協(xié)處理引擎( HDVICP)、圖像處理子系統(tǒng)( VPSS)。DM368頻率高達(dá) 432 MHz,支持多格式解碼、多速率以及高清多通道功能,最高可以支持H.264編碼 1080P格式30 fps的速度,而且還可提供多種獨(dú)立式音頻、語音以及高清視頻編解碼器(H.264)。該處理器有I2C總線等外圍接口,其中ARM9可運(yùn)行開源、性能穩(wěn)定、安全的Linux嵌入式操作系統(tǒng)。[2-3]

視頻監(jiān)控系統(tǒng)中云臺電機(jī)控制的設(shè)計采用DM368的I2C總線接口,設(shè)計基于ARM9的I2C總線云臺電機(jī),完成驅(qū)動程序設(shè)計和應(yīng)用程序設(shè)計,以及應(yīng)用程序控制電機(jī)轉(zhuǎn)動。其應(yīng)用于視頻監(jiān)控系統(tǒng)中,可達(dá)到全方位的高速公路視頻監(jiān)控。

2 I2C總線工作原理和通信協(xié)議

I2C總線是由雙向數(shù)據(jù)線和時鐘線構(gòu)成的二線制串行總線,總線采用主從雙向通信,即總線上在某一時刻只有一個主設(shè)備,總線上的其他設(shè)備都作為從設(shè)備。任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主設(shè)備,但是在同一時間內(nèi)只能有一個設(shè)備作為主設(shè)備,通常為微處理器,其他器件作為從設(shè)備與主設(shè)備進(jìn)行通信,采用唯一的I2C總線地址識別。[4]

圖1為I2C的工作時序圖。I2C總線在傳送數(shù)據(jù)過程中使用了3種信號:

① 開始信號。SCL為高電平時,SDA由高電平向低電平跳變,表示將要開始傳送數(shù)據(jù)。

② 應(yīng)答信號。從設(shè)備在接收到1個字節(jié)數(shù)據(jù)后向主設(shè)備發(fā)出一個低電平脈沖應(yīng)答信號,表示已收到數(shù)據(jù),主設(shè)備根據(jù)從設(shè)備的應(yīng)答信號作出是否繼續(xù)傳輸數(shù)據(jù)的操作(I2C總線每次數(shù)據(jù)傳輸時字節(jié)數(shù)不限制,但是每次發(fā)送都要有一個應(yīng)答信號)。

③ 結(jié)束信號。為低電平時由低電平向高電平跳變,表示數(shù)據(jù)傳送結(jié)束。[5-6]

圖1 I2C工作時序

圖2 I2C驅(qū)動架構(gòu)圖

總線具體的通信工作原理為:主設(shè)備首先發(fā)出開始信號,接著發(fā)送1個字節(jié)的數(shù)據(jù),其由高7位地址碼和最低1位方向位組成(方向位表明主設(shè)備與從設(shè)備間數(shù)據(jù)的傳送方向)。系統(tǒng)中所有從設(shè)備將自己的地址與主設(shè)備發(fā)送到總線上的地址進(jìn)行比較,如果從設(shè)備地址與總線上的地址相同,該設(shè)備就是與主設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)脑O(shè)備。接著進(jìn)行數(shù)據(jù)傳輸,根據(jù)方向位,主設(shè)備接收從設(shè)備數(shù)據(jù)或發(fā)送數(shù)據(jù)到從設(shè)備。當(dāng)數(shù)據(jù)傳送完成后,主設(shè)備發(fā)出一個停止信號,釋放I2C總線,然后所有從設(shè)備等待下一個開始信號的到來。[5-6]

3 I2C總線的Linux和ARM驅(qū)動設(shè)計

3.1 Linux2.6.32的I2C總線驅(qū)動分析[6-8]

I2C總線驅(qū)動由主設(shè)備和從設(shè)備構(gòu)成,通信上通過識別i2C地址進(jìn)行通信,即可以存在多個i2C_adapter適配器和多個外設(shè)i2C_device,Linux的I2C驅(qū)動采用分層設(shè)計思想,層與層之間不存在耦合,增加adapter和device不會影響其他驅(qū)動,具體分層如下。

第一層:提供i2C_adapter的硬件驅(qū)動,探測、初始化i2C_adapter(如申請I2C地址和中斷號),驅(qū)動處理器控制的i2C_adapter在硬件上產(chǎn)生信號(start、stop、ack)以及處理I2C總線中斷,涉及到圖2中的硬件實(shí)現(xiàn)控制層。

第二層:提供i2C_adapter的算法,用具體適配器的xxx_xfer()函數(shù)來填充i2C_algorithm的master_xfer函數(shù)指針,并把賦值后的i2C_algorithm,再賦值給i2C_adapter的成員指針,主要涉及圖2中的訪問抽象層、I2C核心層。

第三層:實(shí)現(xiàn)I2C總線設(shè)備驅(qū)動中的i2C_driver接口,用具體的i2C_device設(shè)備的i2C_add_driver ()、i2C_del_driver ()方法賦值給i2C_driver的成員函數(shù)指針,采用Probe探尋方式實(shí)現(xiàn)設(shè)備device與總線的掛接,涉及圖2中的驅(qū)動層,此層是本文實(shí)現(xiàn)的驅(qū)動部分。

第四層:實(shí)現(xiàn)I2C總線設(shè)備所對應(yīng)的具體device的驅(qū)動,i2C_driver只是實(shí)現(xiàn)設(shè)備與總線的掛接,掛接在總線上的設(shè)備千差萬別,所以要實(shí)現(xiàn)具體設(shè)備device的write()、 read()、ioctl()等方法,賦值給file_operations,然后注冊字符設(shè)備,涉及圖2中的驅(qū)動層,此層是本文實(shí)現(xiàn)的驅(qū)動部分。

第一層和第二層又叫I2C總線驅(qū)動(bus driver),第三層和第四層屬于I2C總線設(shè)備驅(qū)動(device driver)。在Linux驅(qū)動架構(gòu)中,不需要再開發(fā)總線驅(qū)動,因為Linux內(nèi)核幾乎集成所有總線驅(qū)動,驅(qū)動設(shè)計主要是實(shí)現(xiàn)第三層和第四層的設(shè)備驅(qū)動。

3.2 云臺電機(jī)驅(qū)動設(shè)計[8-11]

根據(jù)Linux2.6.32的驅(qū)動分層設(shè)計,驅(qū)動的第一層和第二層在Linux-2.6.32中以及集成了成熟驅(qū)動,分別位于Linux源代碼目錄下的driversi2Ci2C-core.c 和driversI2Cussesdavinci.c中,本文重點(diǎn)講述第三層和第四層驅(qū)動程序的設(shè)計。

驅(qū)動設(shè)計采用字符設(shè)備方式來實(shí)現(xiàn),motor_I2C_devInit()和motor_I2C_devExit()實(shí)現(xiàn)驅(qū)動的初始化以及退出,初始化最后調(diào)用cdev_add()實(shí)現(xiàn)字符設(shè)備的添加,添加過程中通過完善file_operations的結(jié)構(gòu)體,填充了.open = I2C_devOpen、.release = I2C_devRelease、.ioctl = I2C_devIoctl三個結(jié)構(gòu)體變量。這3個用戶空間接口驅(qū)動函數(shù)完成注冊后,用戶空間可以采用文件讀寫的方式來操作I2C設(shè)備,I2C_devOpen函數(shù)實(shí)現(xiàn)打開字符設(shè)備,I2C_devRelease函數(shù)實(shí)現(xiàn)關(guān)閉字符設(shè)備,I2C_devIoctl是和硬件設(shè)備實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)闹匾瘮?shù),主要實(shí)現(xiàn)設(shè)備加載、數(shù)據(jù)讀取和數(shù)據(jù)寫入,從而完成用戶空間和驅(qū)動程序以及硬件設(shè)備的數(shù)據(jù)交換,具體實(shí)現(xiàn)如圖3所示。

圖3 I2C電機(jī)驅(qū)動設(shè)計圖

下面通過I2C_devIoctl介紹這3個函數(shù)的實(shí)現(xiàn)過程。命令I(lǐng)2C_CMD_SET_DEV_ADDR實(shí)現(xiàn)地址設(shè)置,I2C_CMD_READ實(shí)現(xiàn)數(shù)據(jù)讀取,I2C_CMD_WRITE實(shí)現(xiàn)數(shù)據(jù)寫入,最終被分別調(diào)用,其中,I2C_create實(shí)現(xiàn)I2C設(shè)備加載,I2C_read實(shí)現(xiàn)I2C設(shè)備數(shù)據(jù)讀取,I2C_write實(shí)現(xiàn)I2C設(shè)備數(shù)據(jù)寫入。其中I2C_create利用i2c_add_driver調(diào)用i2c_probe,最終調(diào)用i2c_set_clientdata加載I2C從設(shè)備,i2c_read和I2C_write利用i2c_transfer函數(shù)調(diào)用master_xfer實(shí)現(xiàn)數(shù)據(jù)的讀取和寫入,其中I2C_devIoctl實(shí)現(xiàn)部分代碼略——編者注。

4 I2C總線應(yīng)用程序設(shè)計[11-12]

根據(jù)I2C驅(qū)動程序設(shè)計,要正確調(diào)用驅(qū)動程序,需要實(shí)現(xiàn)驅(qū)動的用戶空間調(diào)用函數(shù),主要是實(shí)現(xiàn)open和ioctl等調(diào)用函數(shù),因此在應(yīng)用層的接口函數(shù)中也需要實(shí)現(xiàn)此函數(shù)。

i2c_Init()函數(shù)實(shí)現(xiàn)open函數(shù),調(diào)用驅(qū)動函數(shù)打開該設(shè)備驅(qū)動,定義一個數(shù)據(jù)結(jié)構(gòu)體為:

typedef struct {

unsigned char dataSize;

unsigned char count;

unsigned char *reg;

void *value;

} I2C_Data;

該結(jié)構(gòu)體主要用來實(shí)現(xiàn)用戶空間和內(nèi)核空間的數(shù)據(jù)交換,dataSize代表數(shù)據(jù)的大小,value是傳輸?shù)臄?shù)值,reg是傳輸命令參數(shù),函數(shù)I2c_Read8()是向內(nèi)核讀入一個字節(jié)數(shù)據(jù),I2c_Write8()是向內(nèi)核寫入一個字節(jié)數(shù)據(jù),I2c_Read16()是向內(nèi)核寫入2個字節(jié)數(shù)據(jù),I2c_Write16()是向內(nèi)核寫入2個字節(jié)數(shù)據(jù),下面列舉一個函數(shù)說明具體的實(shí)現(xiàn)過程:

I2c_Write8(int fd unsigned char *reg, unsigned char *value, unsigned char count){

I2C_Data ptr; unsigned int cmd; int status;

ptr.dataSize = 1;

ptr.reg = reg; ptr.count = count; ptr.value = value;

cmd = CMD_WRITE;

status = ioctl(fd, cmd, & ptr);

if (status !=0)

printf("ioctl I2C_CMD_WRITE error!");

return status;}

函數(shù)最終通過調(diào)用ioctl函數(shù)實(shí)現(xiàn)對驅(qū)動的調(diào)用,參數(shù)fd是設(shè)備句柄,cmd讀寫控制是命令。其中,宏定義I2C_CMD_SET_DEV_ADDR為地址設(shè)置命令,I2C_CMD_READ向內(nèi)核讀取數(shù)據(jù)命令,I2C_CMD_WRITE向內(nèi)核寫入數(shù)據(jù)命令。

其他3個讀寫函數(shù)實(shí)現(xiàn)過程類似,這幾個函數(shù)是數(shù)據(jù)寫入讀出的函數(shù)接口,方便應(yīng)用層實(shí)現(xiàn)調(diào)用。

5 云臺電機(jī)控制應(yīng)用程序設(shè)計[11-12]

云臺的重要部分是電機(jī)轉(zhuǎn)動控制采用圖像界面實(shí)現(xiàn)人機(jī)交互,其中界面設(shè)計采用QT圖形界面,可以在界面操作中實(shí)現(xiàn)電機(jī)的水平轉(zhuǎn)動、垂直轉(zhuǎn)動、逆時針轉(zhuǎn)動和順時針轉(zhuǎn)動,從而帶動視頻監(jiān)控的攝像頭朝不同方位轉(zhuǎn)動以及定位。根據(jù)協(xié)議,圖4所示應(yīng)用程序設(shè)計主要實(shí)現(xiàn)以下操作:

① 獲取當(dāng)前的垂直位置,函數(shù)接口為get_motor_curVertical_ptr (),返回垂直位置值。

② 獲取當(dāng)前的水平位置,函數(shù)接口為get_motor_curHorizontal_ptr (),返回水平位置值。

③ 設(shè)置垂直運(yùn)行的停止位置,函數(shù)接口為set_motor_vertical_ptr (unsigned short ptr),參數(shù)ptr為設(shè)置的垂直停止位置值。

④ 設(shè)置水平運(yùn)行的停止位置,函數(shù)接口為set_motor_horizontal_ptr (unsigned short ptr)參數(shù)ptr為設(shè)置的水平停止位置值。

⑤ 水平操作和垂直操作的啟動操作,接口函數(shù)為set_motor_opt(bool bVertical, bool bHorizontal),參數(shù)bVertical表示是否啟動垂直操作,bHorizontal表示是否啟動水平操作。

⑥ 設(shè)置運(yùn)行速度,函數(shù)接口為set_motor_speed(unsigned char vertical_speed, unsigned char horizontal_speed),參數(shù)vertical_speed控制垂直方向速度值,horizontal_speed控制水平方向速度值。

⑦ 設(shè)置電機(jī)運(yùn)行方向,接口函數(shù)set_motor_direction(bool bVertical, bool bHorizontal),設(shè)置運(yùn)行方向為順時針或者逆時針,參數(shù)bVertical為真表示垂直方向向上運(yùn)動,為假表示向下運(yùn)動;bHorizontal為真表示水平方向逆時針。其中,否則為順時針。

圖4 云臺電機(jī)控制應(yīng)用程序設(shè)計圖

下面通過運(yùn)動速度的接口函數(shù)set_motor_speed(),詳細(xì)介紹云臺控制接口函數(shù)的實(shí)現(xiàn)過程,電機(jī)轉(zhuǎn)動速度函數(shù)設(shè)置為set_motor_speed()。其中,函數(shù)參數(shù)vertical_speed為垂直方向運(yùn)動速度,horizontal_speed為水平方向運(yùn)動速度,局部變量reg用于制定控制類型,value設(shè)計為16位,其中高8位存放垂直轉(zhuǎn)動速度數(shù)值命令,低8位存放水平轉(zhuǎn)動速度數(shù)值,參數(shù)設(shè)置完后調(diào)用I2C_Write16()函數(shù),從而調(diào)用ioctl函數(shù)實(shí)現(xiàn)對驅(qū)動的調(diào)用,最終通過I2C總線控制電機(jī),達(dá)到電機(jī)快速轉(zhuǎn)動、定位準(zhǔn)確。

通過實(shí)現(xiàn)人機(jī)交互操作程序,實(shí)現(xiàn)電機(jī)的向上轉(zhuǎn)動、向下轉(zhuǎn)動、逆時針轉(zhuǎn)動和順時針轉(zhuǎn)動,通過調(diào)用各種操作的接口函數(shù),實(shí)現(xiàn)對I2C應(yīng)用程序的調(diào)用,最后通過ioctl函數(shù)實(shí)現(xiàn)對電機(jī)的控制,從而帶動視頻監(jiān)控的攝像頭朝不同方位轉(zhuǎn)動以及定位。

結(jié) 語

本系統(tǒng)實(shí)現(xiàn)了一款基于TMS320DM368的高清視頻監(jiān)控系統(tǒng)中的云臺電機(jī)控制設(shè)計,完成了I2C驅(qū)動程序的分析,并且完成了I2C總線應(yīng)用程序和云臺電機(jī)控制應(yīng)用程序設(shè)計,達(dá)到了應(yīng)用目的,取得了良好效果。

[1] 張志.高速公路高清視頻監(jiān)控系統(tǒng)的構(gòu)建[D].北京:中國交通信息化,2011(4).

[2] 鄧旻熙.基于DM365的智能視頻分析系統(tǒng)的設(shè)計與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2011.

[3] Texas Instruments. TMS320DM368 Digital Media Sys-tem-on-Chip( DMSoC),2011.

[4] Philips. The I2C- BUS Specification Version 2. 1,2000.

[5] 高非非. ARM-Linux中I2C總線驅(qū)動開發(fā)[J].微型機(jī)與應(yīng)用,2012(3).

[6] TMS320DM36x Digital Media System-on-Chip(DMSoC)Inter-Integrated Circuit(I2C)Module User's Guide,2009.

[7] Linux-2.6.32.17[EB/OL].[2014-09].http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/dvsdk/DVSDK_4_00/latest/index_FDS.html.

[8] ARM9[EB/OL].[2014-09].http://www.arm.com/zh/products/processors/classic/arm9/index.php.

[9] TI.TMS320DM36x Digital Media System-on-Chip(DMSoC) ARM Subsystem User's Guide[EB/OL].[2014-09].http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/dvsdk/DVSDK_4_00/latest/index_FDS.html.

[10] DanielP Bovet.Understanding the Linux Kernel [M].北京:中國電力出版社,2007:354-669.

[11] Jonahan Corbet.Linux Device Drivers [M].北京:中國電力出版社,2006.

[12] W Richard Stevens.Advanced Progamming in the UNIX Environment Fourth Edition[M].北京:人民郵電出版社,2006.

廖建尚(系統(tǒng)分析師),研究方向為嵌入式系統(tǒng)、視頻處理、智能交通。

Liao Jianshang

(School of Computer Engineering,Guangdong Communication Polytechnic,Guangzhou 510650,China)

This paper analyzes the working principle of I2C and the driver of I2C bus in Linux, then constructs I2C PTZ motor control system used in the video surveillance system on freeway.It completes the I2C driver design on ARM and Linux,I2C application program design and PTZ motor control application program design.The system implements the control of PTZ motor by application program,which is used on freeway.It achieves the full range video surveillance,and has good result and high social value.

video surveillance;PTZ motor;I2C driver;Linux

2013年廣東省科技計劃項目(高速公路高清視頻監(jiān)控系統(tǒng)研究與開發(fā))。

TP271

A

?迪娜

2014-09-05)

猜你喜歡
設(shè)備
諧響應(yīng)分析在設(shè)備減振中的應(yīng)用
調(diào)試新設(shè)備
基于VB6.0+Access2010開發(fā)的設(shè)備管理信息系統(tǒng)
基于MPU6050簡單控制設(shè)備
電子制作(2018年11期)2018-08-04 03:26:08
廣播發(fā)射設(shè)備中平衡輸入與不平衡輸入的轉(zhuǎn)換
電子制作(2018年10期)2018-08-04 03:24:48
食之無味,棄之可惜 那些槽點(diǎn)滿滿的可穿戴智能設(shè)備
500kV輸變電設(shè)備運(yùn)行維護(hù)探討
HTC斥資千萬美元入股虛擬現(xiàn)實(shí)設(shè)備商WEVR
IT時代周刊(2015年8期)2015-11-11 05:50:37
Automechanika Shanghai 2014 之“看” 汽保設(shè)備篇
如何在設(shè)備采購中節(jié)省成本
主站蜘蛛池模板: 国产幂在线无码精品| 国产美女主播一级成人毛片| 精品国产一区二区三区在线观看 | 亚洲精品国偷自产在线91正片| 中文成人在线视频| 国产欧美另类| 亚洲男人的天堂网| 欧美精品三级在线| 永久天堂网Av| 无码精品国产dvd在线观看9久| 夜夜操国产| 人妻丰满熟妇αv无码| 91亚洲视频下载| 亚洲欧美成人在线视频| 女人爽到高潮免费视频大全| 亚洲高清中文字幕在线看不卡| 啪啪啪亚洲无码| 中文字幕欧美成人免费| 日本在线国产| 久久99久久无码毛片一区二区 | 久久精品国产电影| 91久久国产综合精品女同我| 日本福利视频网站| 天天色天天综合网| 一级看片免费视频| 无码粉嫩虎白一线天在线观看| 成人va亚洲va欧美天堂| 99草精品视频| 国产成人啪视频一区二区三区| 日韩精品无码免费一区二区三区 | 国产精欧美一区二区三区| 国产精品不卡永久免费| 欧美精品在线看| 欧美特黄一免在线观看| 亚洲AV无码乱码在线观看裸奔 | 国产精品性| 精品视频在线观看你懂的一区| 欧美午夜视频在线| 亚洲综合精品香蕉久久网| 久久亚洲中文字幕精品一区| 无码中文AⅤ在线观看| 伊在人亚洲香蕉精品播放| 亚洲一级毛片免费看| 依依成人精品无v国产| 国产成人亚洲综合a∨婷婷| 91精品国产一区| 欧美一级高清视频在线播放| 内射人妻无套中出无码| 欧美在线网| 欧美α片免费观看| 亚洲A∨无码精品午夜在线观看| 中文字幕一区二区人妻电影| 亚洲中文在线看视频一区| 日韩欧美成人高清在线观看| 九色视频线上播放| 奇米精品一区二区三区在线观看| 久久96热在精品国产高清| 亚洲水蜜桃久久综合网站| 99中文字幕亚洲一区二区| 亚洲无码精品在线播放| 91麻豆精品视频| 青青青国产视频手机| 精品一区国产精品| 国产欧美日韩精品综合在线| 麻豆精品在线播放| 久久99国产综合精品1| 亚洲无线国产观看| 好吊色妇女免费视频免费| 一本大道无码日韩精品影视| 另类专区亚洲| 欧美高清三区| 成AV人片一区二区三区久久| 亚洲色图在线观看| 欧洲熟妇精品视频| 少妇露出福利视频| 国产成人高清精品免费5388| 久久久久久久久亚洲精品| 亚洲一级毛片在线观| 青青热久免费精品视频6| 亚洲人成亚洲精品| 亚洲精品色AV无码看| 免费全部高H视频无码无遮掩|