0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于I2C总线与芯片实现高清视频监控中的云台电机驱动系统设计

电子设计 来源:郭婷 作者:电子设计 2019-06-08 08:50 次阅读

1 引言

近年来,随着视频技术发展,网络稳定性能快速提高,视频监控需求越来越大,其应用领域也越来越广泛。社会的发展,汽车增量不断增多,道路上各种违章的车辆也逐渐增多,为了构建一个平安交通和智能交通,视频监控系统在交通行业的应用也越来越多,为了能全方位的对高速公路进行监控,视频监控的高速球也应用越来越广泛。

本文将研究详细分析I2C工作原理通信协议和Linux的I2C总线驱动程序,设计一个应用在高速公路视频监控的基于I2C云台电机驱动系统,为高速公路的全方位视频监控提供一个设计方案。

2 高速公路视频监控系统以及云台电机整体设计

本研究课题的高速公路高清视频监控系统采用TI公司的TMS320DM368,DM368 是一款面向多媒体技术应用的高性能芯片,功能强大,集成了ARM926EJ-S内核、硬件编码协处理引擎( HDVICP)、图像处理子系统( VPSS)。DM368频率高达 432MH,支持多格式解码、多速率以及高清多通道功能,最高可以支持H.264编码 1080P格式 30帧/s的速度,而且还可提供多种独立式音频、语音以及高清视频编解码器(H.264)。该处理器有I2C总线等外围接口等,其中ARM9运行开源、性能稳定安全Linux 嵌入式操作系统

视频监控系统中云台电机控制的设计采用DM368的I2C总线接口,设计基于ARM9的I2C云台电机,完成驱动程序设计和应用程序设计,以及应用程序控制电机转动,应用于视频监控系统中,达到全方位的高速公路视频监控。

3 I2C硬件构成和通信协议

I2C总线是由双向数据线和时钟线构成的二线制串行总线,总线采用主从双向通信,即总线上在某一时刻只有一个主设备总线上的其他设备都作为从设备,任何能够进行发送和接收的设备都可以成为主设备,但是在同一时间内只能有一个设备作为主设备,通常为处理器,其他器件作为从设备与主设备进行通信,采用唯一的I2C地址识别。

基于I2C总线与芯片实现高清视频监控中的云台电机驱动系统设计

如图1I2C的工作时序图所示,I2C总线在传送数据过程中使用了三种信号。(1)开始信号:SCL为高电平时,SDA由高电平向低电平跳变,表示将要开始传送数据;(2)应答信号:从设备在接收到1个字节数据后向主设备发出一个低电平脉冲应答信号,表示已收到数据,主设备根据从设备的应答信号做出是否继续传输数据的操作(I2C总线每次数据传输时字节数不限制,但是每发送都要有一个应答信号);(3)结束信号:为低电平时由低电平向高电平跳变,表示数据传送结束。

总线具体的通信工作原理:主设备首先发出开始信号,接着发送的1个字节的数据,其由高7位地址码和最低1位方向位组成(方向位表明主设备与从设备间数据的传送方向)。系统中所有从设备将自己的地址与主设备发送到总线上的地址进行比较,如果从设备地址与总线上的地址相同,该设备就是与主设备进行数据传输的设备。接着进行数据传输,根据方向位,主设备接收从设备数据或发送数据到从设备。当数据传送完成后,主设备发出一个停止信号,释放I2C总线,然后所有从设备等待下一个开始信号的到来。

4 I2C的Linux和ARM驱动设计

(1)Linux2.6.32的I2C驱动分析。

I2C由主设备和从设备构成,通信上通过识别I2C地址进行通信,即可以存在多个i2c adapter适配器和多个外设i2c device,Linux的I2C驱动采用分层设计实现的思想,层与层之间不存在耦合,增加adapter和增加device不会影响其他驱动,具体分层如下。

第一层:提供i2c adapter的硬件驱动,探测、初始化i2c adapter(如申请i2c地址和中断号),驱动处理器控制的i2c adapter在硬件上产生信号(start、stop、ack)以及处理i2c中断,涉及图2中的硬件实现层。

第二层:提供i2c adapter的algorithm,用具体适配器的xxx_xfer()函数来填充i2c_algorithm的master_xfer函数指针,并把赋值后的i2c_algorithm,再赋值给i2c_adapter的成员指针,主要涉及图2中访问抽象层、i2c核心层。

第三层:实现i2c设备驱动中的i2c_driver接口,用具体的i2c device设备的i2c_add_driver ()、i2c_del_driver ()方法赋值给i2c_driver的成员函数指针,采用Probe探寻方式实现设备device与总线的挂接,涉及图2中的driver驱动层,此层是本文实现的驱动部分。

第四层:实现i2c设备所对应的具体device的驱动,i2c_driver只是实现设备与总线的挂接,挂接在总线上的设备千差万别的,所以要实现具体设备device的write()、 read()、ioctl()等方法,赋值给file_operations,然后注册字符设备,涉及图2中的driver驱动层,此层是本文实现的驱动部分。

第一层和第二层又叫i2c总线驱动(bus driver),第三层和第四层属于i2c设备驱动(device driver)。在Linux驱动架构中,不需要再开发总线驱动,因为Linux内核几乎集成所有总线驱动,驱动设计主要是实现第三层和第四层的设备驱动。

基于I2C总线与芯片实现高清视频监控中的云台电机驱动系统设计

(2)云台电机驱动设计

根据Linux2.6.32的驱动分层设计,驱动的第一层和第二层在Linux-2.6.32中以及集成了成熟驱动,分别位于Linux源代码目录下的\drivers\i2c\i2c-core.c 和\drivers\i2c\busses\davinci.c中,本文重点讲述第三层和第四层驱动程序的设计。

驱动设计采用字符设备方式来实现,motor_I2C_devInit()和motor_I2C_devExit()实现驱动的初始化以及退出,初始化最后调用cdev_add()实现字符设备的添加,添加过程中通过完善file_operations的结构体,填充了 .open = I2C_devOpen, .release = I2C_devRelease,.ioctl = I2C_devIoctl三个结构体变量,这三个用户空间接口驱动函数,完成注册后,用户空间可以采用文件读写的方式来操作I2C设备了,I2C_devOpen函数实现打开字符设备,I2C_devRelease函数实现关闭字符设备,I2C_devIoctl是实现和硬件设备实现数据传输的最重要函数,主要实现设备加载、数据读取和数据写入,从而完成用户空间和驱动程序以及硬件设备的数据交换,具体实现如图3所示。

下面通过I2C_devIoctl介绍这三个函数的实现过程,命令I2C_CMD_SET_DEV_ADDR实现地址设置,I2C_CMD_READ实现数据读取,I2C_CMD_WRITE实现数据写入,最终分别调用,其中I2C_create实现I2C设备加载,I2C_read实现I2C设备数据读取,I2C_write实现I2C设备数据写入,其中I2C_create利用i2c_add_driver调用i2c_probe,最终调用i2c_set_clientdata加载I2C从设备,I2C_read和I2C_write利用i2c_transfer函数调用master_xfer实现数据的读取和写入,具体实现过程如图3所示,其中I2C_devIoctl实现部分代码如下:

int I2C_devIoctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg) {

switch(cmd) {

case I2C_CMD_SET_DEV_ADDR://I2C设置地址设置

filp-》private_data = I2C_create(arg);

……

case I2C_CMD_READ: //数据读取

status = copy_from_user(&transferPrm, (void*)arg, sizeof(transferPrm));

if(status==0) {

status = copy_from_user();//省略参数

if(status==0) {

status = I2C_read();//省略参数

if(status==0) {

status = copy_to_user();//省略参数

}

}

}

break;

case I2C_CMD_WRITE: //数据写入

……

}

return status;

基于I2C总线与芯片实现高清视频监控中的云台电机驱动系统设计

5 I2C应用程序设计

根据I2C驱动程序设计,要正确调用驱动程序,需要实现驱动的用户空间调用函数,主要是实现open和ioctl等调用函数,因此在应用层的接口函数中也需要实现此函数。

i2c_Init()函数实现open函数,调用驱动函数打开该设备驱动,定义一个数据结构体为:

typedef struct {

unsigned char dataSize;

unsigned char count;

unsigned char *reg;

void *value;

} I2C_Data;

该结构体主要用来实现用户空间和内核空间的调用的数据交换,dataSize代表数据的大小,value是传输的数值,reg是传输命令参数,函数有I2c_Read8()是向内核读入一个字节数据,I2c_Write8()是向内核写入一个字节数据,I2c_Read16()是向内核写入2个字节数据,I2c_Write16 ()是向内核写入2个字节数据,下面列举一个函数说明具体的实现过程,

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所示,函数最终通过条用ioctl这个函数实现对驱动的调用,其中参数fd是设备句柄,cmd读写控制是命令, 其中宏定义I2C_CMD_SET_DEV_ADDR为地址设置命令,I2C_CMD_READ向内核读取数据命令, I2C_CMD_WRITE向内核写入数据命令。

基于I2C总线与芯片实现高清视频监控中的云台电机驱动系统设计

其他3个读写函数实现过程类似,这几个函数是数据写入读出的函数接口,方便应用层实现调用。

6 云台电机控制应用程序设计

云台很重要部分是电机转动控制,本课题研究采用图像界面实现人机交互,其中界面设计采用QT图形界面软件来设计,可以在界面操作实现电机的水平转动、垂直转动,逆时针转动和顺时针转动,从而带动视频监控的摄像头朝不同方位转动以及定位,如图所示。根据协议,应用程序设计主要实现以下操作:

(1)获取当前的垂直位置,函数接口为get_motor_curVertical_ptr (),返回垂直位置值;

(2)获取当前的水平位置,函数接口为get_motor_curHorizontal_ptr (),返回水平位置值;

(3)设置垂直运行的停止位置,函数接口为set_motor_vertical_ptr (unsigned short ptr),参数ptr为设置的垂直停止位置值;

(4)设置水平运行的停止位置,函数接口为set_motor_horizontal_ptr (unsigned short ptr)参数ptr为设置的水平停止位置值;

(5)水平操作和垂直操作的启动操作,接口函数为set_motor_opt(bool bVertical, bool bHorizontal) ,参数bVertical表示是否启动垂直操作,bHorizontal表示是否启动水平操作

(6)设置运行速度,函数接口为set_motor_speed(unsigned char vertical_speed, unsigned char horizontal_speed),参数vertical_speed控制垂直方向速度值,horizontal_speed控制水平方向速度值;

(7)设置电机运行方向,接口函数set_motor_direction(bool bVertical, bool bHorizontal) ,设置运行方向为顺时针或者逆时针,参数bVertical为真表示垂直方向向上运动,为假表示向下运动;bHorizontal为真,表示水平方向逆时针,否则为顺时针。

下面通过运动速度的接口函数set_motor_speed(),详细介绍云台控制接口函数的实现过程,电机转动速度设置函数设置set_motor_speed(),其中函数参数vertical_speed为垂直方向运动速度;horizontal_speed为水平方向运动速度,局部变量reg用于制定控制类型,value设计为16位,其中高8位存放垂直转动速度数值命令,低8为存放水平转动速度数值,参数设置完后调用I2c_Write16()函数,从而调用ioctl实现对驱动的调用,最终通过I2C总线控制电机,达到电机快速转动、定位准确。

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;

}

通过实现人机交互操作程序,实现电机的向上转动、向下转动,逆时针转动和顺时针转动,通过调用各种操作的接口函数,实现对I2C应用程序的调用,最用通过ioctl实现对电机的控制,从而带动视频监控的摄像头朝不同方位转动以及定位,具体实现如图4所示。

基于I2C总线与芯片实现高清视频监控中的云台电机驱动系统设计

7 结束语

本系统设计实现了一款基于TMS320DM368的高清视频监控系统中的云台电机控制设计,完成了i2c驱动程序的分析以及设计,并且完成了i2c应用程序的设计和云台电机控制应用程序设计,达到了应用目的,取得了良好效果。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    453

    文章

    50299

    浏览量

    421349
  • 视频监控
    +关注

    关注

    17

    文章

    1706

    浏览量

    64886
  • 总线
    +关注

    关注

    10

    文章

    2863

    浏览量

    87948
收藏 人收藏

    评论

    相关推荐

    高清视频监控I2C总线台电机控制设计

    社会的发展,汽车增量不断增多,道路上各种违章的车辆也逐渐增多,为了构建一个平安交通和智能交通,视频监控系统在交通行业的应用也越来越多,为了能全方位的对高速公路进行监控
    发表于 08-01 23:29 1266次阅读

    GPIO模拟I2C总线驱动设计与实现

    I2C总线简单方便,是我们经常使用的一种总线。但有时候我们的MCU没有足够多的I2C控制器来实现我们的应用,所幸我可以使用普通的GPIO引脚
    发表于 12-14 14:19 5312次阅读
    GPIO模拟<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的<b class='flag-5'>驱动</b>设计与<b class='flag-5'>实现</b>

    求一种高清视频监控系统台电机控制设计方案

    系统设计实现了一款基于TMS320DM368的高清视频监控系统
    发表于 05-14 06:11

    一款基于TMS320DM368的高清视频监控系统台电机控制设计

    。结语本系统实现了一款基于TMS320DM368的高清视频监控系统
    发表于 10-19 06:30

    i2c总线ppt(I2C总线器件应用)

    I2C总线器件应用第一节 I2C总线器件应用概述I2C总线工作原理
    发表于 08-13 17:34 0次下载

    视频解码技术I2C总线控制核的实现

    本文介绍了I2C总线的通讯特点,简要说明了I2C总线的协议规范和特点,并针对Philip公司视频解码系列
    发表于 05-27 11:55 17次下载

    I2C总线

    I2C BUS(Inter IC BUS)是NXP 推出的芯片间串行传输总线,它以2 根连线实现了完善的双向同步数据传送,可以极方便地构成多
    发表于 11-03 11:26 49次下载

    基于TMS320DM642的视频处理系统I2C总线的应用

    本文介绍了基于TMS320DM642和Philips视频编解码芯片视频处理系统,给出了视频接口的连接图。在分析
    发表于 08-05 15:39 49次下载

    基于I2C总线的EEPROM驱动程序

     I2C总线是由Philips公司开发的用于器件之间连接的2线式双向同步串行总线。Linux内核针对
    发表于 12-07 13:58 55次下载

    I2C总线在Linux系统驱动设计

    介绍I2C总线的基本概念和工作原理,叙述I2C总线扩展器件ZLG7290的功能特点。在以S3C2410为微控制器,ZLG7290为
    发表于 12-29 16:52 40次下载

    I2C总线驱动程序的实现

    I2C总线驱动程序的实现 I2C 驱动程序的简介本驱动
    发表于 09-26 17:25 5705次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b><b class='flag-5'>驱动</b>程序的<b class='flag-5'>实现</b>

    基于CPLD的I2C总线接口设计

    在电路设计I2C总线是比较常用的两线式串行通信方式,大多数的CPU都擅长于并口操作,不具备直接操作I2C总线接口的能力。为了使不具备
    发表于 02-12 16:11 95次下载
    基于CPLD的<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>接口设计

    NIOS实现I2C总线

    I2C 总线实现关键是SDA,他是双向线,如果对与一个芯片只写而不读,I2C 实现起来很容易.
    发表于 11-01 14:28 37次下载

    分析I2C总线台电机控制设计

    视频监控系统在交通行业的应用也越来越多,为了能全方位的对高速公路进行监控视频监控的高速球也应
    发表于 10-15 10:15 1次下载
    分析<b class='flag-5'>I2C</b><b class='flag-5'>总线</b><b class='flag-5'>云</b><b class='flag-5'>台电机</b>控制设计

    I2C系统SW Architecture

    通过 i2c-core 将 i2c 设备驱动i2c 总线驱动进行了分离,从而使得
    的头像 发表于 07-22 16:01 904次阅读
    <b class='flag-5'>I2C</b>子<b class='flag-5'>系统</b>SW Architecture