国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

高清視頻監(jiān)控中的I2C總線云臺(tái)電機(jī)控制設(shè)計(jì)

發(fā)布時(shí)間:2015-5-18 11:23    發(fā)布者:designapp
1 引言

近年來(lái),隨著視頻技術(shù)發(fā)展,網(wǎng)絡(luò)穩(wěn)定性能快速提高,視頻監(jiān)控需求越來(lái)越大,其應(yīng)用領(lǐng)域也越來(lái)越廣泛。社會(huì)的發(fā)展,汽車增量不斷增多,道路上各種違章的車輛也逐漸增多,為了構(gòu)建一個(gè)平安交通和智能交通,視頻監(jiān)控系統(tǒng)在交通行業(yè)的應(yīng)用也越來(lái)越多,為了能全方位的對(duì)高速公路進(jìn)行監(jiān)控,視頻監(jiān)控的高速球也應(yīng)用越來(lái)越廣泛。

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

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

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

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

3 I2C硬件構(gòu)成和通信協(xié)議

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


圖1 I2C時(shí)序

如圖1I2C的工作時(shí)序圖所示,I2C總線在傳送數(shù)據(jù)過(guò)程中使用了三種信號(hào)。(1)開(kāi)始信號(hào):SCL為高電平時(shí),SDA由高電平向低電平跳變,表示將要開(kāi)始傳送數(shù)據(jù);(2)應(yīng)答信號(hào):從設(shè)備在接收到1個(gè)字節(jié)數(shù)據(jù)后向主設(shè)備發(fā)出一個(gè)低電平脈沖應(yīng)答信號(hào),表示已收到數(shù)據(jù),主設(shè)備根據(jù)從設(shè)備的應(yīng)答信號(hào)做出是否繼續(xù)傳輸數(shù)據(jù)的操作(I2C總線每次數(shù)據(jù)傳輸時(shí)字節(jié)數(shù)不限制,但是每發(fā)送都要有一個(gè)應(yīng)答信號(hào));(3)結(jié)束信號(hào):為低電平時(shí)由低電平向高電平跳變,表示數(shù)據(jù)傳送結(jié)束。

總線具體的通信工作原理:主設(shè)備首先發(fā)出開(kāi)始信號(hào),接著發(fā)送的1個(gè)字節(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ā)出一個(gè)停止信號(hào),釋放I2C總線,然后所有從設(shè)備等待下一個(gè)開(kāi)始信號(hào)的到來(lái)。
        
4 I2C的Linux和ARM驅(qū)動(dòng)設(shè)計(jì)

(1)Linux2.6.32的I2C驅(qū)動(dòng)分析。

I2C由主設(shè)備和從設(shè)備構(gòu)成,通信上通過(guò)識(shí)別I2C地址進(jìn)行通信,即可以存在多個(gè)i2c adapter適配器和多個(gè)外設(shè)i2c device,Linux的I2C驅(qū)動(dòng)采用分層設(shè)計(jì)實(shí)現(xiàn)的思想,層與層之間不存在耦合,增加adapter和增加device不會(huì)影響其他驅(qū)動(dòng),具體分層如下。
第一層:提供i2c adapter的硬件驅(qū)動(dòng),探測(cè)、初始化i2c adapter(如申請(qǐng)i2c地址和中斷號(hào)),驅(qū)動(dòng)處理器控制的i2c adapter在硬件上產(chǎn)生信號(hào)(start、stop、ack)以及處理i2c中斷,涉及圖2中的硬件實(shí)現(xiàn)層。

第二層:提供i2c adapter的algorithm,用具體適配器的xxx_xfer()函數(shù)來(lái)填充i2c_algorithm的master_xfer函數(shù)指針,并把賦值后的i2c_algorithm,再賦值給i2c_adapter的成員指針,主要涉及圖2中訪問(wèn)抽象層、i2c核心層。

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

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

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


圖2 I2c驅(qū)動(dòng)架構(gòu)圖
        
(2)云臺(tái)電機(jī)驅(qū)動(dòng)設(shè)計(jì)

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

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

下面通過(guò)I2C_devIoctl介紹這三個(gè)函數(shù)的實(shí)現(xiàn)過(guò)程,命令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ù)的讀取和寫入,具體實(shí)現(xiàn)過(guò)程如圖3所示,其中I2C_devIoctl實(shí)現(xiàn)部分代碼如下:

int I2C_devIoctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) {
          switch(cmd) {
                    case I2C_CMD_SET_DEV_ADDR://I2C設(shè)置地址設(shè)置
                              filp->private_data = I2C_create(arg);
                              ……
                    case I2C_CMD_READ:  //數(shù)據(jù)讀取
                                   status = copy_from_user(&transferPrm, (void*)arg, sizeof(transferPrm));
                              if(status==0) {
                                        status = copy_from_user();//省略參數(shù)      
                                        if(status==0) {
                                                  status = I2C_read();//省略參數(shù)
                                                  if(status==0) {
                                                                   status = copy_to_user();//省略參數(shù)
                                                  }
                                        }
                              }
                              break;
                    case I2C_CMD_WRITE: //數(shù)據(jù)寫入
                               ……
          }
          return status;


圖3 I2C電機(jī)驅(qū)動(dòng)設(shè)計(jì)圖
        
5  I2C應(yīng)用程序設(shè)計(jì)

根據(jù)I2C驅(qū)動(dòng)程序設(shè)計(jì),要正確調(diào)用驅(qū)動(dòng)程序,需要實(shí)現(xiàn)驅(qū)動(dòng)的用戶空間調(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ū)動(dòng)函數(shù)打開(kāi)該設(shè)備驅(qū)動(dòng),定義一個(gè)數(shù)據(jù)結(jié)構(gòu)體為:

typedef struct {
          unsigned char dataSize;
          unsigned char count;
          unsigned char *reg;  
          void   *value;
} I2C_Data;

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

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;
}

如圖4所示,函數(shù)最終通過(guò)條用ioctl這個(gè)函數(shù)實(shí)現(xiàn)對(duì)驅(qū)動(dòng)的調(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個(gè)讀寫函數(shù)實(shí)現(xiàn)過(guò)程類似,這幾個(gè)函數(shù)是數(shù)據(jù)寫入讀出的函數(shù)接口,方便應(yīng)用層實(shí)現(xiàn)調(diào)用。


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

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

(1)獲取當(dāng)前的垂直位置,函數(shù)接口為get_motor_curVertical_ptr (),返回垂直位置值;
(2)獲取當(dāng)前的水平位置,函數(shù)接口為get_motor_curHorizontal_ptr (),返回水平位置值;
(3)設(shè)置垂直運(yùn)行的停止位置,函數(shù)接口為set_motor_vertical_ptr (unsigned short ptr),參數(shù)ptr為設(shè)置的垂直停止位置值;
(4)設(shè)置水平運(yùn)行的停止位置,函數(shù)接口為set_motor_horizontal_ptr (unsigned short ptr)參數(shù)ptr為設(shè)置的水平停止位置值;
(5)水平操作和垂直操作的啟動(dòng)操作,接口函數(shù)為set_motor_opt(bool bVertical, bool bHorizontal) ,參數(shù)bVertical表示是否啟動(dòng)垂直操作,bHorizontal表示是否啟動(dòng)水平操作
(6)設(shè)置運(yùn)行速度,函數(shù)接口為set_motor_speed(unsigned char vertical_speed, unsigned char horizontal_speed),參數(shù)vertical_speed控制垂直方向速度值,horizontal_speed控制水平方向速度值;
(7)設(shè)置電機(jī)運(yùn)行方向,接口函數(shù)set_motor_direction(bool bVertical, bool bHorizontal) ,設(shè)置運(yùn)行方向?yàn)轫槙r(shí)針或者逆時(shí)針,參數(shù)bVertical為真表示垂直方向向上運(yùn)動(dòng),為假表示向下運(yùn)動(dòng);bHorizontal為真,表示水平方向逆時(shí)針,否則為順時(shí)針。

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

set_motor_speed(unsigned char vertical_speed, unsigned char horizontal_speed) {
          int ret;
        unsigned char reg;
        unsigned short value=0;
        reg = 3;
        value = vertical_speed<<8;

value |= horizontal_speed;

ret = I2c_Write16 (fd, ®, &value);

if (ret != 0)

printf("set_motor_speed error");

return ret;

}

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

7 結(jié)束語(yǔ)

本系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)了一款基于TMS320DM368的高清視頻監(jiān)控系統(tǒng)中的云臺(tái)電機(jī)控制設(shè)計(jì),完成了i2c驅(qū)動(dòng)程序的分析以及設(shè)計(jì),并且完成了i2c應(yīng)用程序的設(shè)計(jì)和云臺(tái)電機(jī)控制應(yīng)用程序設(shè)計(jì),達(dá)到了應(yīng)用目的,取得了良好效果。
本文地址:http://m.qingdxww.cn/thread-149462-1-1.html     【打印本頁(yè)】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 探索PIC16F13145 MCU系列——快速概覽
  • PIC32CK SG單片機(jī)——輕松滿足新型網(wǎng)絡(luò)安全要求
  • PIC32CM LS00 Curiosity Pro評(píng)估工具包
  • dsPIC® DSC:攻克各種觸摸傳感挑戰(zhàn)的電容式觸摸解決方案
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲操图| 三级毛片免费| 亚洲伊人精品| 日韩亚洲精品不卡在线| 日本欧美在线视频| 热99精品在线| 亚洲好看站| 人妖在线| 熟女毛片| 亚洲精品老司机综合影院| 三级网站国产| 亚洲三级黄色| 午夜影院黄| 午夜久久福利| 亚洲免费观看网站| 午夜在线精品不卡国产| 欧洲毛片真人| 日韩在线资源| 日韩丝袜亚洲国产欧美一区| 欧美日韩加勒比一区二区三区| 亚洲精品另类有吗中文字幕| 天天干天天干天天操| 青草视频入口 在线观看| 亚洲最新永久在线观看| 日韩一级性生活片| 日本韩国香港三级| 亚洲国产视频网站| 亚洲欧洲在线观看| 亚洲综合久久1区2区3区| 殴美一级视频| 欧美午夜在线| 婷婷伊人久久| 青草视频在线观看免费网站| 亚洲成人免费| 婷婷综合久久中文字幕一本| 午夜性刺激在线观看视频| 日韩午夜激情视频| 亚洲国产天堂久久综合9999| 一级大黄毛片| 亚洲国产综合网| 天天操妹子|