<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>
  • EM9287 Linux環(huán)境的AD數(shù)據(jù)采集

     2013-11-7              

            EM9287是英創(chuàng)公司新近推出的,專門針對網(wǎng)絡(luò)通訊、智能終端等應(yīng)用的工控主板產(chǎn)品。EM9287可選擇預(yù)裝Linux-3.9.7操作系統(tǒng)。在Linux-3.9.7中,AD數(shù)據(jù)采集已采用新的工業(yè)IO(簡稱IIO)驅(qū)動程序框架,本文主要介紹應(yīng)用程序如何讀取相關(guān)的AD數(shù)據(jù)。此外,英創(chuàng)公司的另一款主流工控主板產(chǎn)品EM9280也升級到Linux-3.9.7,具有與EM9287完全相同的AD通道,因此本文所介紹的AD數(shù)據(jù)讀取方法同樣適用于EM9280。

     

            EM9287支持2路單端模擬信號輸入AIN1和AIN2,輸入量程為 0V – 3.6V,信號管腳在CN1的17#和18#管腳。除了支持2路AD外,應(yīng)用程序還可讀取主板的CPU芯片iMX28的芯片當(dāng)前溫度,以了解設(shè)備的運(yùn)行情況。以下是測試程序:

     

            #include <STDIO.H>
            #include <STDLIB.H> 
            #include <FCNTL.H> 
            #include <UNISTD.H> 
            #include <MATH.H> 

            char iiotype[16][32] = { 
                    ''in_voltage0_raw''
                    'in_voltage1_raw', 
                    'in_voltage2_raw', 
                    'in_voltage3_raw', 
                    'in_voltage4_raw', 
                    'in_voltage5_raw', 
                    'in_voltage6_raw', 
                    'in_voltage7_raw', 
                    'in_temp8_raw', 
                    'in_temp9_raw', 
                    'in_voltage10_raw', 
                    'in_voltage11_raw', 
                    'in_voltage12_raw', 
                    'in_voltage13_raw', 
                    'in_voltage14_raw', 
                    'in_voltage15_raw'
    }; 

            // return = 0: voltage value from AIN1, unit: mV 
            // < 0: failed
     
            int read_AIN1(float *fvoltage) 
            { 
                    int value, ret = 0; 
                    char filename[80]; 
                    FILE *fp; 
                    char buf[20]; 

                    sprintf( filename, '/sys/bus/iio/devices/iio:device0/%s', iiotype[0]); 
                    fp = fopen(filename, 'rt' ); 
                    if( fp==NULL ) 
                    { 
                            printf('open %s fail!\n', filename); 
                            *fvoltage = 0.0; 
                            ret = -1; 
                            return ret; 
                    } 
                    fread( buf, 1, sizeof(buf), fp ); 
                    fclose(fp); 
            
                    // convert to integer 
                    sscanf( buf, '%d', &value ); 
                    *fvoltage = 0.9 * value; 
                    return ret; 
            } 

            // return = 0: voltage value from AIN2, unit: mV 
            // < 0: failed
     
            int read_AIN2(float *fvoltage) 
            { 
                    int value, ret = 0; 
                    char filename[80]; 
                    FILE *fp; 
                    char buf[20]; 

                    sprintf( filename, '/sys/bus/iio/devices/iio:device0/%s', iiotype[1]); 
                    fp = fopen(filename, 'rt' ); 
                    if( fp==NULL ) 
                    { 
                            printf('open %s fail!\n', filename); 
                            *fvoltage = 0.0; 
                            ret = -1; 
                            return ret; 
                    } 
                    fread( buf, 1, sizeof(buf), fp ); 
                    fclose(fp); 

                    // convert to integer 
                    sscanf( buf, '%d', &value ); 
                    *fvoltage = 0.9 * value; 
                    return ret; 
            } 

            // return = 0: temperature value from CPU, unit: K (Kalvin) 
            // < 0: failed
     
            int read_CPU_temperature(float *ftemp) 
            { 
                    int v_ch9, v_ch8, ret = 0; 
                    char filename[80]; 
                    FILE *fp; 
                    char buf[20]; 

                    sprintf( filename, '/sys/bus/iio/devices/iio:device0/%s', iiotype[9]); 
                    fp = fopen(filename, 'rt' ); 
                    if( fp==NULL ) 
                    { 
                            printf('open %s fail!\n', filename); 
                            *ftemp = 0.0; 
                            ret = -1; 
                            return ret; 
                    } 
                    fread( buf, 1, sizeof(buf), fp ); 
                    fclose(fp); 

                    // convert to integer 
                    sscanf( buf, '%d', &v_ch9 ); 

                    sprintf( filename, '/sys/bus/iio/devices/iio:device0/%s', iiotype[8]); 
                    fp = fopen(filename, 'rt' ); 
                    if( fp==NULL ) 
                    { 
                            printf('open %s fail!\n', filename); 
                            *ftemp = 0.0; 
                            ret = -1; 
                            return ret; 
                    } 
                    fread( buf, 1, sizeof(buf), fp ); 
                    fclose(fp); 

                    // convert to integer 
                    sscanf( buf, '%d', &v_ch8 ); 

                    *ftemp = ((float)(v_ch9 - v_ch8) * 1012) / 4000; 
                    return ret; 
            } 

            int main(int argc, char** argv) 
            { 
                    int ret = 0; 
                    float fvalue; 

                    printf('EM9280/EM9287 IIO AD test v2.0\n'); 

                    // read AIN1 
                    ret = read_AIN1(&fvalue); 
                    if(ret < 0) 
                    { 
                            return ret; 
                    } 
                    printf('AIN1 = %.2f mV\n', fvalue); 

                    // read AIN2 
                    ret = read_AIN2(&fvalue); 
                    if(ret < 0) 
                    { 
                            return ret; 
                    } 
                    printf('AIN2 = %.2f mV\n', fvalue); 

                    // read CPU temperature 
                    ret = read_CPU_temperature(&fvalue); 
                    if(ret < 0) 
                    { 
                            return ret; 
                    } 
                    printf('CPU Temperature = %.1f K, (%.1f C degree)\n', fvalue, (fvalue - 273)); 

                    return ret; 
            }

     

            在控制臺(console)窗口,也可通過Linux命令查看IIO驅(qū)動的原始通道:

     

     

            進(jìn)一步,可用cat命令讀取各個(gè)通道AD轉(zhuǎn)換的原始數(shù)據(jù),EM9280、EM9287內(nèi)部AD分辨率為12-bit,所以原始數(shù)據(jù)范圍為:0 – 4095。開發(fā)人員可通過以下命令來快速了解設(shè)備的AD數(shù)據(jù)狀況。

            #cat in_voltage0_raw //   讀取CH0的原始數(shù)據(jù)
            #cat in_voltage1_raw //   讀取CH1的原始數(shù)據(jù) 
            #cat in_temp8_raw //   讀取CPU溫度的原始數(shù)據(jù) 
            #cat in_temp9_raw //   讀取CPU溫度的原始數(shù)據(jù)

     

            其他的原始通道涉及EM9287的觸摸屏、內(nèi)部供電電源等,已不在本文的介紹范圍。

    网友自拍区视频精品| 国产精品午睡沙发系列| 99精品国产一区二区三区不卡| 成人午夜精品视频在线观看| 91天堂素人精品系列网站| 国产精品成人免费观看| 亚洲精品123区在线观看| 精品一区二区三区免费| 亚洲国产精品碰碰| 国产愉拍精品手机| 在线观看日韩精品| 精品国产一区二区三区久久| 日本国产精品久久| 精品麻豆国产色欲色欲色欲www | 久久国产精品一国产精品金尊| 亚洲国产精品无码久久九九| 亚洲精品欧美综合四区| 99re6这里只有精品| 日韩制服国产精品一区| 日韩精品一区二区三区影院| 精品一区二区ww| 国产成人精品福利网站在线| 久久久一本精品99久久精品88| 亚洲精品乱码久久久久久按摩 | 精品国产成a人在线观看| 亚洲精品国产啊女成拍色拍| 久久91精品国产91久久| 亚洲国产一二三精品无码 | 91精品国产乱码久久久久久| 四虎永久在线精品免费影视| 日韩精品福利片午夜免费观着| 精品国产a∨无码一区二区三区| 久久永久免费人妻精品| 国产乱人伦偷精品视频AAA| WWW国产精品内射老师| 国产伦子系列麻豆精品| 精品久久久BBBB人妻| 少妇人妻偷人精品视蜜桃| 亚洲国产成人精品无码区花野真一| AV无码精品一区二区三区| 国产精品成人不卡在线观看|