英创信息技术EM9380工控主板实时控制应用介绍

描述

EM9380是英创公司针对高速实时应用设计的一款双CPU工控主板,主CPU采用了FreeScale 454MHz ARM9 iMX283, 从CPU采用的是Atmel公司的64MHz Cortex-M3。EM9380预装了WinCE6.0操作系统,经过我们精心的设计,EM9380可实现最小为25uS 的实时控制应用。

EM9380与英创公司的另一款8串口工控主板EM9280的引出管脚高度兼容,具体可参考《EM9380与EM9280兼容设计》一文。 EM9380与EM9280的GPIO对应管脚完全一致,但在其各自复用的功能和软件操作方法上有着较大的区别。下表是EM9380与EM9280 32位GPIO以及各自复用功能的对比。

PIN# 信号名称 EM9280复用功能 EM9380复用功能
CN1_27 GPIO0   COM2口CTS#   复用定时器功能
CN1_28 GPIO1   COM2口RTS#   复用定时器功能
CN1_29 GPIO2     复用定时器功能
CN1_30 GPIO3     复用定时器功能 
CN1_31 GPIO4     PWM3
CN1_32 GPIO5     PWM4
CN1_33 GPIO6   PWM1   PWM5
CN1_34 GPIO7   PWM2   PWM6
CN1_35 GPIO8     AD0通道输入 
CN1_36 GPIO9     AD1通道输入
CN2_15 GPIO10   COM6口RXD   AD2通道输入
CN2_16 GPIO11   COM6口TXD   AD3通道输入
CN2_17 GPIO12     AD4通道输入 
CN2_18 GPIO13     AD5通道输入
CN2_19 GPIO14     AD6通道输入
CN2_20 GPIO15     AD7通道输入
CN2_21 GPIO16     COM2口CTS# 
CN2_22 GPIO17     COM2口RTS# 
CN2_23 GPIO18     COM6口RXD 
CN2_24 GPIO19     COM6口TXD 
CN2_25 GPIO20   PWM3    PWM1
CN2_26 GPIO21   PWM4   PWM2
CN2_27 GPIO22   I2C_SDA   I2C_SDA 
CN2_28 GPIO23   I2C_SCL   I2C_SCL
CN2_29 GPIO24   IRQ1   IRQ1
CN2_30 GPIO25   IRQ2   IRQ2 
CN2_31 GPIO26   IRQ3   IRQ3
CN2_32 GPIO27   IRQ4   IRQ4 
CN2_33 GPIO28   SPI_MISO   SPI_MISO
CN2_34 GPIO29   SPI_MOSI   SPI_MOSI
CN2_35 GPIO30   SPI_SCLK     SPI_SCLK  
CN2_36 GPIO31   SPI_CS0N   SPI_CS0N

从上表可以看出EM9380与EM9280的GPIO20~GPIO31功能完全一样。而EM9380的GPIO0~GPIO15是从Cortex-M3从CPU引出、支持实时控制应用的引脚,可实现高速AD、高精度PWM、数字PID、脉冲计数等高速实时控制,这正是EM9380的特色所在。

在应用程序的设计上,EM9380的GPIO20~GPIO31使用与EM9280一样的函数操作,EM9380的GPIO0~GPIO15则需要一组专门的API函数用来操作,这组API定义在mcu_api.h文件中,下面是对API函数的一个简要说明。

// 打开MCU操作单元,获取MCU的句柄。
        HANDLE OpenMCU( int Index );

// 关闭MCU操作单元
        BOOL CloseMCU( HANDLE hMCU );

// 获取MCU的版本信息。
        BOOL MCU_GetVInfo( HANDLE hMCU, PMCU_VER_INFO pMCU_VInfo ); 
        // MCU GPIO操作:设置相关的GPIO位为输出IO。 
        BOOL MCU_GPIO_OutEnable( HANDLE hMCU, UINT32 dwEnBits ); 
        // MCU GPIO操作:设置相关的GPIO位为输入IO。 
        BOOL MCU_GPIO_OutDisable(HANDLE hMCU, UINT32 dwDisBits ); 
        // MCU GPIO操作:设置输出GPIO位输出高位。 
        BOOL MCU_GPIO_OutSet( HANDLE hMCU, UINT32 dwSetBits ); 
        // MCU GPIO操作:设置输出GPIO位输出低位。 
        BOOL MCU_GPIO_OutClear( HANDLE hMCU, UINT32 dwClearBits ); 
        // MCU GPIO操作:获取相关输入GPIO位状态值。 
        BOOL MCU_GPIO_PinState( HANDLE hMCU, UINT32* pPinState ); 
        // MCU GPIO操作:启动实时监控输入GPIO位状态值。 
        BOOL MCU_GPIO_PinMonitor( HANDLE hMCU, UINT32* pPinState, UINT32 dwPeriod ); 
        // MCU PWM操作:启动/停止PWM通道, 启动参数包括频率、占空比和初始极性 
        // 输入参数dwCh: PWM通道号, = 3, 4, 5, 6 
        // dwFreq: PWM输出频率,单位Hz 
        // dwDuty: PWM输出占空比,单位.1%, 输入范围= 0-1000 
        // dwPol: PWM初始极性,= 0: 低电平, = 1: 高电平 
        BOOL MCU_PWM_CHANNEL( HANDLE hMCU, DWORD dwCh, DWORD dwFreq, DWORD dwDuty, DWORD dwPol ); 
        // MCU ADC操作:启动ADC通道常规数据采集 
        // 输入参数dwChMode: AD通道模式= 0: 单端, = 1: 差分 
        // pBuf: AD数据Buffer 
        // dwBufSize: AD数据Buffer的长度,决定要采集的通道数, WORD长度对齐 
        BOOL MCU_ADC_Generic( HANDLE hMCU, DWORD dwChMode, WORD *pBuf, DWORD dwBufSize ); 
        // MCU 等待实时数据。 
        // return TRUE: 接收到实时数据 
        // FALSE: no 
        BOOL WaitForData( HANDLE hMCU, DWORD dwTimeout ); 
        // 功能: 读取实时数据命令数据 
        // 返回值:MCU实时数据类型编号 
        // <0: 无数据 
        // =1: TYPE_MCU_GPIO_INFO 
        // =2: TYPE_MCU_ADC_INFO 
        DWORD MCU_Read( HANDLE hMCU, LPVOID pBuffer, DWORD Count );

“EM9380开发光盘\Sortware\C例程”目录下的Mcu_TestSDK工程,详细展示了上面API函数的使用方法,在使用这些API函数前,需要在自己的工程中链接对应的库文件“mcusdk.lib”。 
        #pragma comment( lib, 'mcusdk.lib' )

mcusdk.lib实际上是为了方便用户使用MCU功能(MCU即EM9380的从CPU)做的二次封装,在mcusdk.lib库内部依然调用的是标准流式驱动接口函数,比如通过CreateFile打开驱动句柄,通过DeviceIoControl与MCU驱动交互。利用这些标准驱动接口函数,用户可以使用EM9380从CPU的更多高级功能,我们已经做了一些EM9380在高速实时控制方面应用的案例,这些例子演示了通过标准驱动接口函数操作MCU的方法。

相关阅读:

《EM9380多通道AD数据采集》 
        《EM9380多路任意脉冲发生器及应用》

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分