<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>
  • ETA104數(shù)采模塊實(shí)現(xiàn)波形信號(hào)采集

     2018-6-20     作者:朱賢武         

      ETA104模擬數(shù)據(jù)采集模塊(下文簡(jiǎn)稱:ETA104模塊)是基于英創(chuàng)公司SBC840工控應(yīng)用底板、符合DM5028標(biāo)準(zhǔn)應(yīng)用擴(kuò)展模塊。ETA104模塊上的模數(shù)轉(zhuǎn)換功能,采用ADS7871模擬信號(hào)轉(zhuǎn)換芯片,占用ESMARC工控主板的SPI總線進(jìn)行通訊,最高可實(shí)現(xiàn)48K的數(shù)據(jù)轉(zhuǎn)換率,最大支持8路14bit模擬信號(hào)轉(zhuǎn)換。


      ETA104模塊的A/D轉(zhuǎn)換芯片的數(shù)據(jù)轉(zhuǎn)換啟動(dòng)方法有2種,一種方法是使用軟件寫入指令啟動(dòng)數(shù)據(jù)轉(zhuǎn)換,第二種方法是使用引腳“ADConvert”啟動(dòng)數(shù)據(jù)轉(zhuǎn)換:在該引腳上產(chǎn)生一個(gè)由低到高的上升沿,便可根據(jù)最近一次的A/D輸入端口配置,啟動(dòng)一次數(shù)據(jù)轉(zhuǎn)換,同時(shí)引腳“ADBUSY”由低電平變?yōu)楦唠娖剑划?dāng)前數(shù)據(jù)轉(zhuǎn)換完成后,引腳信號(hào)“ADBUSY”會(huì)產(chǎn)生一個(gè)由高到低的下降沿,表示當(dāng)前數(shù)據(jù)已經(jīng)轉(zhuǎn)換好。


      根據(jù)ETA104模塊的這種特點(diǎn),可以很方便地實(shí)現(xiàn)波形數(shù)據(jù)采樣,基本思路如下:1、配置A/D轉(zhuǎn)換芯片,以滿足需要采集的模擬信號(hào)輸入端口與輸入方式;2、根據(jù)數(shù)據(jù)采樣率需求,配置PWM輸出參數(shù),然后啟動(dòng)PWM信號(hào),經(jīng)由ADConvert信號(hào)引腳觸發(fā)啟動(dòng)A/D數(shù)據(jù)轉(zhuǎn)換;3、當(dāng)數(shù)據(jù)轉(zhuǎn)換完成以后,由ADBUSY信號(hào)觸發(fā)系統(tǒng)IRQ中斷;4、系統(tǒng)中斷后,啟動(dòng)SPI總線進(jìn)行當(dāng)前數(shù)據(jù)讀取。


      ADConvert信號(hào)通過(guò)ETA104的J1.P25腳接入,連接到ESMARC工控主板的PWM1信號(hào)端口;ADBUSY信號(hào)通過(guò)ETA104的J1.30腳輸出,連接到ESMARC工控主板的IRQ1信號(hào)端口。ETA104數(shù)據(jù)采樣控制信號(hào)所占用的相關(guān)引腳,如下表所示:


    無(wú)標(biāo)題文檔

    引腳信號(hào)名稱功能描述
    J1.25GPIO6PWM1信號(hào)輸出用于等時(shí)采樣時(shí),啟動(dòng)AD轉(zhuǎn)換,該信號(hào)連接到ADConvert
    J1.30GPIO24中斷輸入IRQ1數(shù)據(jù)轉(zhuǎn)換完成,通過(guò)ADBUSY信號(hào)輸出下降沿到IRQ1
    J1.38GPIO28SPI_MISO控制ADC器件的SPI總線信號(hào)
    J1.40GPIO29SPI_MOSI
    J1.42GPIO30SPI_CLK
    J1.44GPIO31SPI_CSn


      模擬信號(hào)采樣流程參考圖如下:


    ETA104數(shù)采模塊實(shí)現(xiàn)波形信號(hào)采集.png


      程序流程說(shuō)明:

      1、初始化A/D,主要是配置模擬信號(hào)輸入方式、模擬信號(hào)輸入通道、A/D片內(nèi)增益。

      2、要得到高精度的等時(shí)采集點(diǎn)的數(shù)據(jù),因此使用PWM信號(hào)來(lái)啟動(dòng)A/D的數(shù)據(jù)轉(zhuǎn)換,以達(dá)到非常高的時(shí)間要求精度。

      3、系統(tǒng)使用A/D芯片的BUSY信號(hào)的下降沿,觸發(fā)系統(tǒng)中斷,通知系統(tǒng),當(dāng)前數(shù)據(jù)已經(jīng)準(zhǔn)備好。

      4、以上資源初始化好以后,就可以開始啟動(dòng)A/D轉(zhuǎn)換了。直接啟動(dòng)PWM信號(hào)輸出即可。

      5、等待IRQ中斷消息,即表示當(dāng)前數(shù)據(jù)轉(zhuǎn)換完成。

      6、利SPI總線讀取A/D已轉(zhuǎn)換好的數(shù)據(jù)并存貯。

      7、檢查要采樣的數(shù)據(jù)個(gè)數(shù)是否已達(dá)到,則關(guān)閉PWM輸出,停止數(shù)據(jù)采樣。然后關(guān)才IRQ、PWM相關(guān)設(shè)備。


      以下是基于ESM9287-WinCE6.0環(huán)境的例子程序。由于ESM9287的IRQ響應(yīng)速度限制,該環(huán)境最大數(shù)據(jù)采樣率只能到2Kbps。

      

    // 申請(qǐng)一個(gè)數(shù)據(jù)Buff空間,用于存放采樣數(shù)據(jù)結(jié)果
           AD_DataBuff = new DWORD[AD_CovCount];
           if(AD_DataBuff == NULL)
                  return ;
           
           // 初始化A/D,配置A/C采樣通道與信號(hào)輸入模式
           MyADC_Test.ADS7871_ConfigREG(ADS7818_REG_GainMux,AD_Channel);
     
           // 初始化IRQ,配置中斷源IRQ1作為系統(tǒng)觸發(fā)
           hIRQ1 = CreateFile(_T("IRQ1:"),                          
                  GENERIC_READ|GENERIC_WRITE,         
                  FILE_SHARE_READ|FILE_SHARE_WRITE,      
                  NULL,                                                          
                  OPEN_EXISTING,                                    
                  FILE_FLAG_RANDOM_ACCESS,                    
                  NULL);                                                        
           if(hIRQ1==INVALID_HANDLE_VALUE)
           {
                  printf("Open IRQ1 false!\r\n");
                  return ;
           }
     
           // 初始化PWM信號(hào),使用PWM1作為A/D轉(zhuǎn)換啟動(dòng)信號(hào)
           hPWM = CreateFile( _T("PWM1:"),              
                  GENERIC_READ|GENERIC_WRITE,          
                  FILE_SHARE_READ|FILE_SHARE_WRITE, 
                  NULL,                                                           
                  OPEN_EXISTING,                                     
                  FILE_FLAG_RANDOM_ACCESS,                     
                  NULL);                                                         
           if(hPWM==INVALID_HANDLE_VALUE)
           {
                  printf("Open PWM false!\r\n");
                  return ;
           }
     
           PwmInfo.dwFreq = AD_CovRate; //設(shè)置PWM輸出頻率為數(shù)據(jù)采樣率,如1000Hz
           PwmInfo.dwDuty = 10;
           PwmInfo.dwResolution = 1;
           dwNumberOfBytesWritten = 0;
           bRet = WriteFile(hPWM, &PwmInfo, sizeof(PWM_INFO), &dwNumberOfBytesWritten, NULL);
           if(!bRet)
           {
                  printf("WriteFile failed\n");
                  CloseHandle(hPWM);
           }
     
           i1 = 0;
           while(1) //數(shù)據(jù)采樣循環(huán)控制
           {
                  dwTimeout = 5; //timeout 5ms
                  if (!DeviceIoControl(hIRQ1,                  //等待中斷觸發(fā)信號(hào)
                        IOCTL_WAIT_FOR_IRQ,                    
                         &dwTimeout,                                        
                         sizeof(DWORD),                            
                         &dwReturn,                                    
                         sizeof(DWORD),                             
                         NULL,                                               
                         NULL))                                             
                  {
                         dwReturn =  WAIT_FAILED;
                  }
     
                  if(dwReturn == WAIT_OBJECT_0)
                  {
                         i1++;
                         MyADC_Test.ADS7871_Read( &AD_DataBuff[i1] );//讀取AD采樣好的數(shù)據(jù)
                         if(i1>=AD_CovCount) //判斷數(shù)據(jù)采樣個(gè)數(shù)是否已達(dá)到設(shè)置值
                                break;
                  }
           }
     
           PwmInfo.dwFreq = 0; 
           PwmInfo.dwDuty = 10;
           PwmInfo.dwResolution = 1;
           dwNumberOfBytesWritten = 0;
           bRet = WriteFile(hPWM, &PwmInfo, sizeof(PWM_INFO), &dwNumberOfBytesWritten, NULL); //停止PWM輸出
     
           CloseHandle(hPWM);//關(guān)閉PWM設(shè)備
           CloseHandle(hIRQ1); //關(guān)閉IRQ設(shè)備
           //數(shù)據(jù)復(fù)制/轉(zhuǎn)移到用戶數(shù)據(jù)BUFF
           //......
           delete[] AD_DataBuff;//清理申請(qǐng)的運(yùn)態(tài)數(shù)據(jù)空單
    亚洲国产午夜精品理论片| 无码精品人妻一区二区三区AV| 国产精品成人久久久久三级午夜电影| 97麻豆精品国产自产在线观看 | 国产精品jizz在线观看直播| 久99久无码精品视频免费播放| 久久久久无码精品国产app| 亚洲国产另类久久久精品小说| 国产精品国产午夜免费福利看| 色综合久久精品中文字幕首页| 久久精品国产精品亚洲精品 | 91自产拍在线观看精品| 精品国产亚洲一区二区在线观看| 国产精品麻花传媒二三区别| 久久精品国产亚洲AV大全| 在线观看自拍少妇精品| 动漫精品第一区二区三区| 精品亚洲成a人片在线观看 | 久久线看观看精品香蕉国产| 亚洲精品无码AV中文字幕电影网站| 国产啪精品视频网免费 | 久久精品人人做人人爱爱| 99国产精品99久久久久久| 精品人妻一区二区三区毛片| 国产精品WWW夜色视频| 久久国产精品99国产精| 亚洲av产在线精品亚洲第一站| 亚洲精品自在在线观看| 国产成人精品在线观看| 国产精品无码一区二区三区在 | 久久九九精品国产综合喷水| 奇米影视7777久久精品人人爽| 国产精品原创巨作?v网站| 国产精品一区二区三区久久| 精品久久久久久无码中文字幕一区| 999久久久无码国产精品| 久久久久久久精品成人热色戒| 99re6这里只有精品| 久久se精品一区二区国产| 国产乱码精品一品二品| 国产一精品一AV一免费|