激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

ESM7000異構CPU實時應用之一
8通道并行100K 16bit AD采集

 2021-5-11     作者:劉乾坤         

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


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


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


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


ESM7000異構CPU實時應用之一.png

圖1:ESM7000連接ADS8588S原理框圖


  ESM7000與ADS8588S的電路連接十分簡單,ADS8588S的CONV啟動AD轉換信號由ESM7000的PWM3提供,ADS8588S的ADC_BUSY信號連接到ESM7000的GPIO25,可以作為轉換完成的中斷請求。ADS8588S的所有配置都由外部硬件完成,不需要軟件配置,因為只需要3條SPI信號線,ESM7000的SPI_MOSI則被配置為GPIO作為ADS8588S硬件復位信號。為了實現高速可靠的實時響應,上述功能接口都由ESM7000的Cortex-M4內核管理使用。


  下表1列出了ADS8588S的AD轉換時間,圖2是讀取ADS8588S AD轉換結果的時序要求。


ESM7000異構CPU實時應用之一.png

表1:ADS8588S AD轉換時間


ESM7000異構CPU實時應用之一.png

圖2:ADS8588S讀取數據時序


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


  下圖是在ESM7000 Cortex-M4內核上、運行FreeRTOS操作系統實現的100kSPS AD數據采集實際波形,示波器通道1至通道4依次為:PWM3、ADC_BUSY、SPI_CS_B、SPI_SCLK。


ESM7000異構CPU實時應用之一.png

圖3:ESM7000操作ADS8288S時序圖


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


/*!
* PWM中斷服務程序,在PWM中斷中啟動SPI讀取上一次AD轉換結果
*/
void ESM_PWM3_HANDLER(void) 
{
    uint8_t i;
    PWM_ClearStatusFlag(ESM_PWM3, pwmStatusCompare);
    /*每個數據包的第一次采樣記錄us定時器的值,用于時間同步*/
    if (samplingCnt == 0)
        data_packed.time_stamp = GPT_ReadCounter(ESM_GPT1);
/* 向SPI TX FIFO填數據即同時啟動SPI讀操作,讀取4個DWORD、共128bit SPI數據 */
    for (i = 0; i < 4; i++)
    {
        ECSPI_TXDATA_REG(ESM_SPI1) = 0;
    }
    samplingCnt = (samplingCnt + 8) % sampling_len;
}
/*!
* SPI中斷服務程序,為了提高SPI操作效率,當SPI FIFO中接收到超過32個DWORD數時產生中斷
* 在中斷服務程序中將SPI數據讀出
*/
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數據存放在M4與A7(Linux)的共享內存中 */
        *((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)
        {
            /* 當采樣到指定長度的AD數據后,對乒乓buffer進行切換,
            并將xDataReadySemaphore信號量設置為有效 */
            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 (;;)
    {
        /* 等待信號量,任務被無超時阻塞 */
        xSemaphoreTake(xDataReadySemaphore, portMAX_DELAY);
        /* 通過RPmsg多核協議將當前數據包信息上報給應用程序 */
        result = RPMSG_Send(&data_packed, sizeof(data_packed));
        assert(result == 0);
    }
}


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


  ADS8588S支持的最大采樣率為200kSPS,本方案經過簡單的硬件改造,不需要增加任何硬件成本,也可實現200kSPS的高速AD采集,有需要的客戶可與英創聯系。


  ESM7000異常CPU架構的實時應用介紹及軟件開發說明請參考:

  ESM7000異構CPU架構的實時應用

  ESM7000 Cortex-M4技術開發參考手冊

主站蜘蛛池模板: 一区二区三区福利| japanese护士日本xx丝袜| 国产区在线看| 黄色小视频观看| japanese色系国产在线高清| 亚洲精品国产一区二区图片欧美| 久久久国产99久久国产久| 毛片日韩| 亚洲精品一区最新| 国产午夜视频在永久在线观看| 被免费网站在线视频| 97色伦图片97综合影院久久| 国产日韩一区| 久久久久亚洲精品影视| 中文字幕无线码欧美成人 | 国产短视频在线观看| 久久久免费精品视频| 日韩精品无码一区二区三区| 亚洲欧美日韩国产| 综综综综合网| 97dyy在线观看手机版| 毛片女人毛片一级毛片毛片| 成人欧美一区二区三区黑人| 你懂的免费在线视频| 欧美一区二区在线观看视频| 国产a一级毛片含羞草传媒| 国产成人精品一区二三区2022| 97se狠狠狠狠狠亚洲综合网 | 日韩在线视频免费看| 丝袜美足国产一区在线| 亚洲视频免费在线播放| 欧美黄色性| 欧美黄色影院| 欧美黄免在线播放| 欧美黄免在线播放| 欧美添逼| 欧美一级日韩| 免费观看a级毛片| 免看一级一片一在线看| 你懂的网站在线| 色色视频在线观看|