<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>
  • ESM7000異構(gòu)CPU實(shí)時(shí)應(yīng)用之一
    8通道并行100K 16bit AD采集

     2021-5-11     作者:劉乾坤         

      高速數(shù)據(jù)采集是對(duì)系統(tǒng)實(shí)時(shí)響應(yīng)處理能力的考驗(yàn),以實(shí)現(xiàn)100kSPS采樣率的AD轉(zhuǎn)換為例,系統(tǒng)需要每10μs穩(wěn)定可靠的響應(yīng)AD中斷、讀取AD數(shù)據(jù)。常規(guī)的WinCE或Linux嵌入式操作系統(tǒng)均無法滿足穩(wěn)定的10μs中斷響應(yīng)的性能要求,因此傳統(tǒng)的高速數(shù)據(jù)采集方案通常使用FPGA/CPLD對(duì)AD芯片進(jìn)行直接操作、控制AD轉(zhuǎn)換并對(duì)數(shù)據(jù)進(jìn)行緩存,緩存一定量的數(shù)據(jù)后再向系統(tǒng)發(fā)出中斷請(qǐng)求,系統(tǒng)響應(yīng)中斷讀取批量數(shù)據(jù)。傳統(tǒng)的FPGA/CPLD方案實(shí)現(xiàn)復(fù)雜、成本較高,本文將介紹基于ESM7000工控主板實(shí)現(xiàn)的高效低成本高速AD采集方案。


      ESM7000是英創(chuàng)基于i.MX7D處理器開發(fā)的低功耗高性能工控主板,支持雙網(wǎng)口、6串口、雙CAN總線接口、PCIe、ISA總線等豐富的通訊接口,支持18-bit并行RGB或LVDS顯示接口。主CPU i.MX7D是NXP推出的異構(gòu)多核處理器,配置了主頻高達(dá)1GHz的ARM Cortex-A7雙核和一顆運(yùn)行速度240MHz、帶硬件浮點(diǎn)運(yùn)算的ARM Cortex-M4內(nèi)核。本方案將充分利用i.MX7D的異構(gòu)CPU架構(gòu),由高性能的Cortex-A7完成人機(jī)交互、數(shù)據(jù)處理、通訊管理等復(fù)雜運(yùn)算,而實(shí)時(shí)的AD數(shù)據(jù)采集則由i.MX7D的Cortex-M4完成。


      AD芯片選擇了TI的ADS8588S,ADS8588S是單電源供電的、具有雙極性輸入的16位、高速8通道同步AD采樣芯片,ADS8588S集成了模擬前端,允許直接連接傳感器,無需使用外部驅(qū)動(dòng)電路,能實(shí)現(xiàn)高性能、高精度及零延遲的AD轉(zhuǎn)換,非常適用于工業(yè)自動(dòng)化應(yīng)用。


      下圖是ESM7000連接ADS8588S的原理框圖:


    ESM7000異構(gòu)CPU實(shí)時(shí)應(yīng)用之一.png

    圖1:ESM7000連接ADS8588S原理框圖


      ESM7000與ADS8588S的電路連接十分簡(jiǎn)單,ADS8588S的CONV啟動(dòng)AD轉(zhuǎn)換信號(hào)由ESM7000的PWM3提供,ADS8588S的ADC_BUSY信號(hào)連接到ESM7000的GPIO25,可以作為轉(zhuǎn)換完成的中斷請(qǐng)求。ADS8588S的所有配置都由外部硬件完成,不需要軟件配置,因?yàn)橹恍枰?條SPI信號(hào)線,ESM7000的SPI_MOSI則被配置為GPIO作為ADS8588S硬件復(fù)位信號(hào)。為了實(shí)現(xiàn)高速可靠的實(shí)時(shí)響應(yīng),上述功能接口都由ESM7000的Cortex-M4內(nèi)核管理使用。


      下表1列出了ADS8588S的AD轉(zhuǎn)換時(shí)間,圖2是讀取ADS8588S AD轉(zhuǎn)換結(jié)果的時(shí)序要求。


    ESM7000異構(gòu)CPU實(shí)時(shí)應(yīng)用之一.png

    表1:ADS8588S AD轉(zhuǎn)換時(shí)間


    ESM7000異構(gòu)CPU實(shí)時(shí)應(yīng)用之一.png

    圖2:ADS8588S讀取數(shù)據(jù)時(shí)序


      ADS8588S SPI接口時(shí)鐘最高為20MHz,讀取8通道16位AD數(shù)據(jù)需要128個(gè)SPI時(shí)鐘,最短耗時(shí)6.4μs,表1中ADS8588S最快的AD轉(zhuǎn)換需要3.9μs,如果采用圖2中的Read After conversion時(shí)序,則AD轉(zhuǎn)換加上讀取轉(zhuǎn)換結(jié)果最少需要10.3μs,不能實(shí)現(xiàn)100kSPS的AD采集。如果在AD轉(zhuǎn)換的同時(shí)讀取上一次AD轉(zhuǎn)換的結(jié)果(Read During Conversion),則要求SPI讀操作必須在ADS8588S BUSY過程中完成,如圖2所示。ADS8588S SPI讀操作最快需要6.4μs,顯然無法在3.9μs的AD轉(zhuǎn)換時(shí)間內(nèi)完成,但ADS8588S提供了一個(gè)2次平均模式,AD轉(zhuǎn)換時(shí)間在8.4μs~8.8μs之間(見表1: Oversampling by 2),在此期間剛好可完成6.4μs的SPI讀操作,而8.8μs的AD轉(zhuǎn)換時(shí)間也能滿足100kSPS的最大采樣率的要求。


      下圖是在ESM7000 Cortex-M4內(nèi)核上、運(yùn)行FreeRTOS操作系統(tǒng)實(shí)現(xiàn)的100kSPS AD數(shù)據(jù)采集實(shí)際波形,示波器通道1至通道4依次為:PWM3、ADC_BUSY、SPI_CS_B、SPI_SCLK。


    ESM7000異構(gòu)CPU實(shí)時(shí)應(yīng)用之一.png

    圖3:ESM7000操作ADS8288S時(shí)序圖


      上圖在Cortex-M4程序中直接利用了ESM7000的PWM產(chǎn)生中斷信號(hào),在PWM中斷服務(wù)程序中啟動(dòng)SPI讀操作,因此ADC_BUSY信號(hào)線還可以省掉不用。為了提高SPI操作效率,SPI數(shù)據(jù)接收在SPI FIFO中斷中完成,讀取AD數(shù)據(jù)后直接存放在M4與A7(Linux)共享的乒乓buffer中。M4程序在采樣到指定個(gè)數(shù)的AD數(shù)據(jù)后,通過RPmsg協(xié)議通知應(yīng)用程序,應(yīng)用程序根據(jù)RPmsg提供的信息從共享內(nèi)存中讀取AD數(shù)據(jù)。M4程序使用了FreeRTOS操作系統(tǒng),主要的代碼如下:


    /*!
    * PWM中斷服務(wù)程序,在PWM中斷中啟動(dòng)SPI讀取上一次AD轉(zhuǎn)換結(jié)果
    */
    void ESM_PWM3_HANDLER(void) 
    {
        uint8_t i;
        PWM_ClearStatusFlag(ESM_PWM3, pwmStatusCompare);
        /*每個(gè)數(shù)據(jù)包的第一次采樣記錄us定時(shí)器的值,用于時(shí)間同步*/
        if (samplingCnt == 0)
            data_packed.time_stamp = GPT_ReadCounter(ESM_GPT1);
    /* 向SPI TX FIFO填數(shù)據(jù)即同時(shí)啟動(dòng)SPI讀操作,讀取4個(gè)DWORD、共128bit SPI數(shù)據(jù) */
        for (i = 0; i < 4; i++)
        {
            ECSPI_TXDATA_REG(ESM_SPI1) = 0;
        }
        samplingCnt = (samplingCnt + 8) % sampling_len;
    }
    /*!
    * SPI中斷服務(wù)程序,為了提高SPI操作效率,當(dāng)SPI FIFO中接收到超過32個(gè)DWORD數(shù)時(shí)產(chǎn)生中斷
    * 在中斷服務(wù)程序中將SPI數(shù)據(jù)讀出
    */
    void ESM_SPI1_HANDLER(void)
    {
        uint32_t tmp;
        BaseType_t xHigherPriorityTaskWoken = pdFALSE;
        /* Disable all SPI interrupt */
        ECSPI_INTREG_REG(ESM_SPI1) = 0;
        while (ECSPI_STATREG_REG(ESM_SPI1) & ECSPI_STATREG_RR_MASK)
        {
            tmp = ECSPI_RXDATA_REG(ESM_SPI1);
            /* 將AD數(shù)據(jù)存放在M4與A7(Linux)的共享內(nèi)存中 */
            *((uint16_t *)mem_addr + shared_buf_idx++) = (uint16_t)(tmp >> 16);
            *((uint16_t *)mem_addr + shared_buf_idx++) = (uint16_t)tmp;
            if (shared_buf_idx >= sampling_len)
            {
                /* 當(dāng)采樣到指定長(zhǎng)度的AD數(shù)據(jù)后,對(duì)乒乓buffer進(jìn)行切換,
                并將xDataReadySemaphore信號(hào)量設(shè)置為有效 */
                shared_buf_idx = 0;
                if (mem_addr == SHARED_MEMORY_BASE + SHARED_MEMORY_BLOCK0)
                {
                    data_packed.flags = 0;
                    mem_addr = SHARED_MEMORY_BASE + SHARED_MEMORY_BLOCK1;
                }
                else
                {
                    data_packed.flags = 1;
                    mem_addr = SHARED_MEMORY_BASE + SHARED_MEMORY_BLOCK0;
                }
                /* Unlock the task to process the event. */
                xSemaphoreGiveFromISR(xDataReadySemaphore, &xHigherPriorityTaskWoken);
                /* Perform a context switch to wake the higher priority task. */
                portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
            }
        }
        ECSPI_ClearStatusFlag(ESM_SPI1, ecspiFlagRxfifoDataRequest);
        ECSPI_SetIntCmd(ESM_SPI1, ecspiFlagRxfifoDataRequest, true);
    }
    static void DataReadyTask(void *pvParameters)
    {
        int result;
        for (;;)
        {
            /* 等待信號(hào)量,任務(wù)被無超時(shí)阻塞 */
            xSemaphoreTake(xDataReadySemaphore, portMAX_DELAY);
            /* 通過RPmsg多核協(xié)議將當(dāng)前數(shù)據(jù)包信息上報(bào)給應(yīng)用程序 */
            result = RPMSG_Send(&data_packed, sizeof(data_packed));
            assert(result == 0);
        }
    }


      ESM7000高速AD采集方案充分利用了i.MX7D的異構(gòu)CPU架構(gòu),由高性能的Cortex-A7完成人機(jī)交互、數(shù)據(jù)處理、通訊管理等復(fù)雜運(yùn)算,而實(shí)時(shí)的AD數(shù)據(jù)采集則由i.MX7D的Cortex-M4完成。我們基于此方案推出了ESM2001工控機(jī),感興趣的客戶可參考這里:EMX2000系列工控機(jī)


      ADS8588S支持的最大采樣率為200kSPS,本方案經(jīng)過簡(jiǎn)單的硬件改造,不需要增加任何硬件成本,也可實(shí)現(xiàn)200kSPS的高速AD采集,有需要的客戶可與英創(chuàng)聯(lián)系。


      ESM7000異常CPU架構(gòu)的實(shí)時(shí)應(yīng)用介紹及軟件開發(fā)說明請(qǐng)參考:

      ESM7000異構(gòu)CPU架構(gòu)的實(shí)時(shí)應(yīng)用

      ESM7000 Cortex-M4技術(shù)開發(fā)參考手冊(cè)

    2021精品国产品免费观看| 香蕉精品高清在线观看视频| 婷婷成人国产精品| 香蕉久久夜色精品升级完成| 国产精品无码无卡在线观看久| 91麻豆国产福利精品 | 人妻老妇乱子伦精品无码专区| 久久精品国产成人AV| 国产精品美女久久久久久久| 久久精品人人槡人妻人人玩| 日日噜噜噜噜夜夜爽亚洲精品| 国产精品无码一区二区三区不卡| 久热中文字幕在线精品免费| 精品一区二区三区在线观看| 国产精品视频一区麻豆| 青青热久久久久综合精品| 久久精品中文字幕有码| 国语精品91自产拍在线观看二区| 99视频精品全部免费观看| 国产精品va久久久久久久| 九九精品久久久久久噜噜| 国产精品jizz视频| 国产高清在线精品一区二区三区| 午夜亚洲av永久无码精品| 精品中文字幕一区在线| 免费国内精品久久久久影院| 国产精品一区二区久久| 久久综合日韩亚洲精品色| 久草精品视频在线播放| 久久久久久人妻一区精品| 国产精品内射视频免费| 国产青草亚洲香蕉精品久久| 国产精品久久久久久网站| 国产精品蜜芽在线观看| 中文字幕久久久久久精品| 色妞WWW精品免费视频| 国产高清在线精品免费软件| 亚洲国产精品综合久久网络 | 999国内精品永久免费观看| 无码精品人妻一区二区三区免费看 | 精品国产免费一区二区|