<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 嵌入式Linux多通道數(shù)據(jù)采集方案

     2011-7-12             

            使用英利工控主板進(jìn)行簡(jiǎn)單的擴(kuò)展,可以構(gòu)成一個(gè)多通道AD數(shù)據(jù)采集方案。這一方案的原理是通過英利工控主板的精簡(jiǎn)ISA總線擴(kuò)展一片TLC2543,,即可以實(shí)現(xiàn)8路模擬量輸入。其中輸入量程0-5V,AD轉(zhuǎn)換精度12bit,AD轉(zhuǎn)換速度100Ksps。

     

    硬件部分
            該方案的主要硬件構(gòu)成如下:

     

    嵌入式Linux多通道數(shù)據(jù)采集方案

     

            其中TLC2543通過4線制SPI接口與英利工控主板連接,具體信號(hào)定義如下:
            (1)SPI_CS:SPI片選信號(hào),低電平有效;從英利工控主板輸出,接到TLC2543 
            (2)SPI_CK:SPI接口的同步時(shí)鐘信號(hào);從英利工控主板輸出,接到TLC2543 
            (3)SPI_DO:SPI接口數(shù)據(jù)輸出,從英利工控主板輸出的轉(zhuǎn)換命令,輸入到TLC2543 
            (4)SPI_DI:SPI接口數(shù)據(jù)輸入,從AD芯片輸出的轉(zhuǎn)換數(shù)據(jù),輸入到英利工控主板

     

            此時(shí)可以采用英利工控主板的GPIO模擬出SPI接口(以EM9160為例):
            #define SPI_CS    GPIO15
            #define SPI_CLK   GPIO14
            #define SPI_DOUT  GPIO13
            #define SPI_DIN   GPIO12
            #define SPI_EOC   GPIO10

     

            除AD輸入以外,該應(yīng)用底板還有如下接口: 
            (1)1個(gè)10M/100M以太網(wǎng)接口 
            (2)4個(gè)帶隔離RS485總線接口,1個(gè)RS232串口,1個(gè)TTL串口 
            (3)2個(gè)USB Host接口,1個(gè)USB Device接口 
            (4)單色點(diǎn)陣液晶接口(支持LCD對(duì)比度調(diào)節(jié)和背光控制) 
            (5)矩陣鍵盤和LED接口 
            (6)精簡(jiǎn)ISA總線接口

     

            該應(yīng)用底板和英利工控主板配套,已經(jīng)可以滿足一般的數(shù)采應(yīng)用需求。如果客戶需要更多的數(shù)據(jù)輸入,可以參考該應(yīng)用底板的方式進(jìn)一步擴(kuò)展;如果客戶需要更多的其他功能,可以參考英利的開發(fā)評(píng)估底板和功能擴(kuò)展模塊進(jìn)行設(shè)計(jì)。

     

    軟件部分
            TLC2543是4線制SPI接口,因此它的讀寫操作是同時(shí)進(jìn)行的,即所謂全雙工串行數(shù)據(jù)傳輸。在構(gòu)造函數(shù)時(shí),需要仔細(xì)研究AD芯片數(shù)據(jù)手冊(cè)上提供的SPI接口時(shí)序關(guān)系,如下圖所示:

     

     

            軟件開發(fā)過程中需注意以下幾點(diǎn):
            1、在SPI_CS片選有效后,TLC2543將把上次AD轉(zhuǎn)換的數(shù)據(jù),按MSB在先的順序,呈現(xiàn)在SPI_DI信號(hào)線上,并在SPI_CK的
                  下降沿更新數(shù)據(jù)
            2、SPI_CK的上升沿將把對(duì)AD芯片的操作指令鎖存到AD芯片,輸出的數(shù)據(jù)也是按MSB在先的順序
            3、輸入AD的操作指令只有8個(gè)bit,而從AD讀出的轉(zhuǎn)換數(shù)據(jù)有12個(gè)bit,在讀入低4bit時(shí),輸入指令用“0”填充
            4、芯片數(shù)據(jù)手冊(cè)中串行輸入輸出數(shù)據(jù)與我們的定義SPI_DO和SPI_DI是正好相反的
            5、讀出的數(shù)據(jù)須經(jīng)過格式轉(zhuǎn)換,才能轉(zhuǎn)為通常所見的電壓值

     

            據(jù)上所述,可以構(gòu)建相應(yīng)的操作函數(shù)如下:

     

    // TLC2543的SPI接口初始化函數(shù)
    int SPI_Init( int fd )
    {
            SPI_OutEnable( fd, SPI_CS );
            SPI_OutEnable( fd, SPI_CLK );
            SPI_OutEnable( fd, SPI_DOUT );
            SPI_OutDisable( fd, SPI_DIN );
            SPI_OutDisable( fd, SPI_EOC );

            SPI_OutSet( fd, SPI_CS );
            SPI_OutClear( fd, SPI_CLK );

            return 1;
    }

    // 輸出使能
    int SPI_OutEnable( int fd, unsigned int dwEnBits )
    {
            int rc;

            rc = ioctl( fd, EM9X60_GPIO_IOCTL_OUT_ENABLE, &dwEnBits ); 
            return rc;
    }

    // 輸出禁止
    int SPI_OutDisable( int fd, unsigned int dwDisBits )
    {
            int rc;

            rc = ioctl( fd, EM9X60_GPIO_IOCTL_OUT_DISABLE, &dwDisBits );
            return rc;
    }

    // 位置高
    int SPI_OutSet( int fd, unsigned int dwSetBits )
    {
            int rc;

            rc = ioctl( fd, EM9X60_GPIO_IOCTL_OUT_SET, &dwSetBits );
            return rc;
    }

    // 位置低
    int SPI_OutClear( int fd, unsigned int dwClearBits )
    {
            int rc;

            rc = ioctl( fd, EM9X60_GPIO_IOCTL_OUT_CLEAR, &dwClearBits );
            return rc;
    }

    // 讀取位狀態(tài)
    int SPI_PinState( int fd, unsigned int* pPinState )

            int rc; 
            unsigned int dwCurrPinState;

            rc = ioctl( fd, EM9X60_GPIO_IOCTL_PIN_STATE, &dwCurrPinState );

            if( rc == 0 )
                    *pPinState = dwCurrPinState;

            return rc;
    }

    // 格式轉(zhuǎn)換為電壓值
    float GetDeltaV( )
    {
            int i1;
            unsigned int i2 = 0;

            for( i1=0; i1<10; i1++ )
                    i2 += ADData[i1];

            result = (i2/10) * DeltaV;
            return result;

     

            該應(yīng)用方案程序的核心部分是數(shù)據(jù)處理函數(shù)int ReadAD( int ChNum ),該函數(shù)將模擬量讀出并轉(zhuǎn)換為浮點(diǎn)數(shù)格式,其相關(guān)處理代碼如下:

     

    int ReadAD( int ChNum )
    {
            unsigned int i1 = 0;
            int i2, i3;
            unsigned int dwPinState;
            unsigned int CtrlBit;

            // 將控制字轉(zhuǎn)換為標(biāo)準(zhǔn)的12位
            CtrlBit = (unsigned int)ChNum << 4;
            SPI_OutClear( fd, SPI_CS );

            // 等待轉(zhuǎn)換完成
            for( i2=0; i2<100; i2++ )
            {
                    SPI_PinState( fd, &dwPinState );
                    if( dwPinState & SPI_EOC );
                            break;
            }

            // 轉(zhuǎn)換失敗處理
            if( i2 >= 100 )
            {
                    SPI_OutSet( fd, SPI_CS );
                    return -14;
            }

            // 第一次讀出的是無效數(shù)據(jù),讀出并且扔掉
            for( i2=0; i2<12; i2++ )
            {
                    i1 = i1 << 1;

                    SPI_PinState( fd, &dwPinState );
                    if( dwPinState & SPI_DIN )
                            i1 = i1 | 0x01;

                    if( CtrlBit & 0x800 )
                            SPI_OutSet( fd, SPI_DOUT );
                    else
                            SPI_OutClear( fd, SPI_DOUT );

                    SPI_OutSet( fd, SPI_CLK );
                    SPI_OutClear( fd, SPI_CLK );

                    CtrlBit = CtrlBit << 1;
            }

            // 正式讀取數(shù)據(jù),讀十次,交由后面的GetDeltaV( )函數(shù)取平均值并轉(zhuǎn)換為電壓
            for( i3=0; i3<10; i3++ )
            {
                    i1 = 0;
                    CtrlBit = (unsigned int)ChNum << 4;
                    for( i2=0; i2<100; i2++ )
                    {
                            SPI_PinState( fd, &dwPinState );
                            if( dwPinState & SPI_EOC );
                                    break;
                    }

                    if( i2 >= 100 )
                    {
                            SPI_OutSet( fd, SPI_CS );
                            return -12;
                    }

                    for( i2=0; i2<12; i2++ )
                    {
                            i1 = i1 << 1;

                            SPI_PinState( fd, &dwPinState );
                            if( dwPinState & SPI_DIN )
                                    i1 = i1 | 0x01;

                            if( CtrlBit & 0x800 )
                                    SPI_OutSet( fd, SPI_DOUT ); 
                            else
                                    SPI_OutClear( fd, SPI_DOUT );

                            SPI_OutSet( fd, SPI_CLK );
                            SPI_OutClear( fd, SPI_CLK );

                            CtrlBit = CtrlBit << 1;
                    }

                    ADData[i3] = i1; 
            }

            SPI_OutSet( fd, SPI_CS );
            GetDeltaV( );
            return 1;
    }

     

            該方案的主流程如下:

     

    int main( )
    {
            int i;
            // 定義8個(gè)數(shù)據(jù)輸入通道
            int AIN[8] = {0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};

            fd = open( '/dev/em9x60_gpio', O_RDWR );
            printf( 'open file = %d\n', fd );

            // 初始化SPI端口
            SPI_Init( fd );
            // 嵌入式程序,總是無限循環(huán)執(zhí)行
            for( ; ; )
            {
                    // 循環(huán)讀取八個(gè)通道的數(shù)據(jù)
                    for( i=0; i<8; i++ )
                    {
                            ReadAD( AIN[i] );
                            printf( 'the result = %.2f V\n', result );
                    }
                    printf( '\n' );
                    sleep( 2 );
            }

            return 1;
    }

    国产精品视频二区不卡| 国产精品无码a∨精品| 国产精品66在线观看| 国产精品黄页在线播放免费| 精品亚洲视频在线| 亚洲国产精品13p| 国产日韩久久久精品影院首页 | 亚洲国产精品成人精品软件| 91无码人妻精品一区二区三区L| 51午夜精品免费视频| 久久精品一区二区三区四区| 精品久久久中文字幕人妻| 国产精品资源在线观看| 91精品天美精东蜜桃传媒入口 | 国产精品视频久久久久久| 久久久久99精品成人片试看| 久久亚洲欧美国产精品| 亚洲国产精品13p| www亚洲精品久久久乳| 亚洲国产主播精品极品网红| 一色屋成人免费精品网站| 四虎8848精品永久在线观看| 久久精品国产91久久麻豆自制 | 91精品国产免费入口| 99久久国语露脸精品国产| 精品麻豆丝袜高跟鞋AV| 亚洲国产精品一区第二页 | 日韩精品一区二三区中文| 国产网红无码精品视频| 在线欧美精品一区二区三区| 亚洲精品一级无码鲁丝片| 精品无码成人网站久久久久久| 久久亚洲精品无码aⅴ大香| 国产在线精品二区韩国演艺界| 亚洲色偷精品一区二区三区 | 日韩熟女精品一区二区三区| 精品国产中文字幕| 午夜精品久久久久久久99蜜桃| 人妻少妇无码精品视频区| 久久99热久久99精品| 精品国产品国语在线不卡|