EM9380工控主板实时控制应用说明

 2013-9-13          [nemail]    
[lablebox]

        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_27GPIO0

  COM2口CTS#

  复用定时器功能

CN1_28GPIO1

  COM2口RTS#

  复用定时器功能

CN1_29GPIO2 

  复用定时器功能

CN1_30GPIO3 

  复用定时器功能 

CN1_31GPIO4 

  PWM3

CN1_32GPIO5 

  PWM4

CN1_33GPIO6

  PWM1

  PWM5

CN1_34GPIO7

  PWM2

  PWM6

CN1_35GPIO8 

  AD0通道输入 

CN1_36GPIO9 

  AD1通道输入

CN2_15GPIO10

  COM6口RXD

  AD2通道输入

CN2_16GPIO11

  COM6口TXD

  AD3通道输入

CN2_17GPIO12 

  AD4通道输入 

CN2_18GPIO13 

  AD5通道输入

CN2_19GPIO14 

  AD6通道输入

CN2_20GPIO15 

  AD7通道输入

CN2_21GPIO16 

  COM2口CTS# 

CN2_22GPIO17 

  COM2口RTS# 

CN2_23GPIO18 

  COM6口RXD 

CN2_24GPIO19 

  COM6口TXD 

CN2_25GPIO20

  PWM3 

  PWM1

CN2_26GPIO21

  PWM4

  PWM2

CN2_27GPIO22

  I2C_SDA

  I2C_SDA 

CN2_28GPIO23

  I2C_SCL

  I2C_SCL

CN2_29GPIO24

  IRQ1

  IRQ1

CN2_30GPIO25

  IRQ2

  IRQ2 

CN2_31GPIO26

  IRQ3

  IRQ3

CN2_32GPIO27

  IRQ4

  IRQ4 

CN2_33GPIO28

  SPI_MISO

  SPI_MISO

CN2_34GPIO29

  SPI_MOSI

  SPI_MOSI

CN2_35GPIO30

  SPI_SCLK  

  SPI_SCLK  

CN2_36GPIO31

  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多路任意脉冲发生器及应用》

[lablebox]