一款基于TMS320DM368的高清视频监控系统中的云台电机控制设计
eeskill 2021-10-18

引言

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

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

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

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

2 I2C总线工作原理和通信协议

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

图1为I2C的工作时序图。I2C总线在传送数据过程中使用了3种信号:

① 开始信号。SCL为高电平时,SDA由高电平向低电平跳变,表示将要开始传送数据。

② 应答信号。从设备在接收到1个字节数据后向主设备发出一个低电平脉冲应答信号,表示已收到数据,主设备根据从设备的应答信号作出是否继续传输数据的操作(I2C总线每次数据传输时字节数不限制,但是每次发送都要有一个应答信号)。

③ 结束信号。为低电平时由低电平向高电平跳变,表示数据传送结束。[56]

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

3 I2C总线的Linux和ARM驱动设计

3.1 Linux2.6.32的I2C总线驱动分析[68]

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

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

第二层:提供i2C_adapter的算法,用具体适配器的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中的驱动层,此层是本文实现的驱动部分。

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

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

3.2 云台电机驱动设计[811]

根据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三个结构体变量。这3个用户空间接口驱动函数完成注册后,用户空间可以采用文件读写的方式来操作I2C设备,I2C_devOpen函数实现打开字符设备,I2C_devRelease函数实现关闭字符设备,I2C_devIoctl是和硬件设备实现数据传输的重要函数,主要实现设备加载、数据读取和数据写入,从而完成用户空间和驱动程序以及硬件设备的数据交换,具体实现如图3所示。

下面通过I2C_devIoctl介绍这3个函数的实现过程。命令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实现数据的读取和写入,其中I2C_devIoctl实现部分代码略——编者注。

4 I2C总线应用程序设计[1112]

根据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;

}

函数最终通过调用ioctl函数实现对驱动的调用,参数fd是设备句柄,cmd读写控制是命令。其中,宏定义I2C_CMD_SET_DEV_ADDR为地址设置命令,I2C_CMD_READ向内核读取数据命令,I2C_CMD_WRITE向内核写入数据命令。

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

5 云台电机控制应用程序设计[1112]

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

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

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

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

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

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

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

⑦ 设置电机运行方向,接口函数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总线控制电机,达到电机快速转动、定位准确。

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

结语

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

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
热门推荐
  • 相关技术文库
  • 工业
  • 安防
  • 航空
  • CAN
  • 风电风机故障诊断远程无线管理方案

    风电行业作为可再生能源领域中最具前景的发电方式之一,在全球范围内分布广泛。但是,在风机发生故障时,却总是措手不及。本文将提供可行的方案,能够为解决故障带来便利。   风电行业现状概述 随着“碳中和”和“碳达峰”的热度疯涨,新能源行业势必崛起。风

    04-27
  • 如何将CAN总线升级成CAN FD?

    如何快速升级到CAN FD? 小致百科课堂 · ▴ 点击视频,关注查看更多 ▴ 21世纪初,CAN总线技术迎来了CAN FD时代,数据传输的速率不断提高的同时,极大地缩短了数据传输,尤其是程序下载的时间。那么如何才能将手头的CAN总线升级成CAN FD呢? 致远电子为您提供3

    04-22
  • 一张表看电机的分类

    据说尼古拉·特斯拉(Nikola Tesla)于1888年发明了交流电机。从那时起,由于各种元素创新,例如电机的组成材料(磁铁、钢板等),半导体元器件的材料、部件技术和控制技术等,使电机有了长足发展。例如,在1900年代初期开发的输出功率为5马力的感应电机,在2

    04-21
  • 解析电机的旋转动作和发电作用

    电机的旋转原理 作为电机基础知识,我们将介绍电机原理相关的内容。 关于电流、磁场和力 首先,为了便于后续电机原理说明,我们来回顾一下有关电流、磁场和力的基本定律/法则。虽然有一种怀旧的感觉,但如果平时不常使用磁性元器件,就很容易忘记这些知识。

    04-14
  • 运动控制T型曲线速度规划的matlab、 C语言实现

    ★ 本文介绍了运动控制中常用的梯形速度曲线规划的原理和程序实现,最后给出了测试结果; ” 1 前言 2 理论分析 3 matlab 实现 4 测试结果 5 C语言实现 6 总结 1 前言 在伺服系统以及控制系统的加减速动作中,为了让速度更加平滑,可以引入T型速度曲线规划(T

    03-31
  • CAN总线和RS485总线应用概述

    CAN总线和RS485总线的定义 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为

    03-30
  • 传感器这么多种,你都知道怎么工作的吗

    布料张力测量及控制原理 ▼ 直滑式电位器控制气缸活塞行程 ▼ 压阻式传感器测量液位的工作原理 ▼ MQN型气敏电阻结构及测量电路 ▼ 气泡式水平仪的工作原理 ▼ 扩散硅式压力传感器 ▼ 应变加速度感应器 ▼ 称重式料位计 ▼ 电子皮带秤重示意图 ▼ 电子吊车秤

    03-26
  • 一文看懂I2C(FPGA实测I2C波形)

    据非官方统计,90%电子行业的公众号都介绍过3种串行通讯协议:UART、SPI和I2C。这3种串行协议也是电子开发行业最常用的协议。前面介绍了 及其 , 。本篇文章介绍I2C通讯协议及其FPGA实测波形。 文末有【I2C官方标准文档下载方法】。 有哪些内容 I2C是什么 5种

    03-25
  • 红电线,黄电线,绿电线,各种颜色电线都代表什么?

    1、依导线颜色标志电路 黑色——装置和设备的内部布线。 棕色——直流电路的正极。 红色——三相电路的C相; 半导体三极管的集电极; 半导体二极管、整流二极管或可控硅管的阴极。 黄色——三相电路的A相; 半导体三极管的基极; 可控硅管和双向可控硅管的控

    03-26
  • 总线隔离后接地出现通讯异常该如何改善?

    在已为大家介绍隔离后接地的ESD作用机理,那么面对总线隔离后由于接地而出现的通讯异常问题该如何改善,本文将为大家介绍对应的改善措施以及电路作用详解。    前言 为保证总线网络的通讯稳定性,通讯接口通常会做隔离,隔离的主要目的: 安规考虑:保护设备

    03-19
  • 常用的电气电路图集

    1 单相照明双路互备自投供电电路 2 双路三相电源自投电路 3 茶炉水加热自动控制电路 4 简单的温度控制器电路 5 简易晶闸管温度自动控制电路 6 用双向晶闸管控制温度电路 7 XCT-101动圈式温度调节仪控温电路 8 电接点压力式温度表控温电路 9 TDA-8601型温度指

    03-08
  • 常见CAN总线干扰现象

    CAN总线由其高可靠和实时性被广泛应用于新能源汽车、轨道交通、医疗、工程机械等行业,但是由于大部分行业工作环境都比较恶劣,所以提高总线抗干扰能力是目前行业用户最为关注的方向。   常见CAN总线干扰现象 如下为一条流水线有两路CAN总线,一条总线有22个

    03-11
下载排行榜
更多
广告
X
广告