STM32L476應用開發之二:模擬量數據採集

採集模擬量數據在一臺一塊兒中是必不可少的功能。在本次實驗中咱們要採集的模擬量值主要包括氧氣傳感器的輸出以及壓力變送器的輸出。編程

1硬件設計測試

咱們須要採集數據對精度有必定的要求,而STM32L476自帶ADC爲12位的,因此咱們採用獨立的ADC芯片來完成這一工做。因爲使用經驗的關係,咱們選擇了AD7705芯片。ui

AD7705爲完整16位、低成本、Σ-Δ型ADC,適合直流和低頻交流測量應用。其具備低功耗(3 V時最大值爲1 mW)特性,於是可用於環路供電、電池供電或本地供電的應用中。片內可編程增益放大器提供從1至128的增益設置,無需使用外部信號調理硬件即可接受低電平和高電平模擬輸入。AD7705擁有兩個差分通道,對外通信支持SPI接口方式。其結構圖以下:spa

在STM32L476RG開發板中,有SPI3口已經引到端子可使用。各引腳分別爲:設計

CN7-1         PC10            SPI3-SCK3d

CN7-2         PC11            SPI3-MISOcode

CN7-3         PC12            SPI3-MOSIblog

在開發板上的位置以下紅框標識:接口

 

根據以上描述,因而咱們設計電路圖以下:開發

 

二、軟件設計

完成硬件鏈接後咱們能夠開始軟件開發了,首先咱們在STM32CubeMX中對硬件部分進行配置。因爲板子上沒有焊接X3外部晶振,咱們使用內部時鐘源。使用SPI3的引腳PC10,PC11,PC12,以下圖所示:

 

而後配置SPI3的的參數,咱們採用7爲數據,大端以及64分頻,具體的參數配置以下圖所示:

 

對應的SPI3端口的配置程序以下所示:

static void SPI3_Configuration(void)

{

  hspi3.Instance = SPI3;

  hspi3.Init.Mode = SPI_MODE_MASTER;

  hspi3.Init.Direction = SPI_DIRECTION_2LINES;

  hspi3.Init.DataSize = SPI_DATASIZE_8BIT;

  hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;

  hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;

  hspi3.Init.NSS = SPI_NSS_SOFT;

  hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;

  hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;

  hspi3.Init.TIMode = SPI_TIMODE_DISABLE;

  hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

  hspi3.Init.CRCPolynomial = 7;

  if (HAL_SPI_Init(&hspi3) != HAL_OK)

  {

    Error_Handler();

  }

}

接下來咱們實現經過SPI3接口讀取摸你臉個採集值得程序。

/*獲取採集的物理量值,並做平滑處理*/

void GetMeasuredValue(void)

{

  float currentValue[2]={-1.0,-1.0};

  CalcMeasuredValue(currentValue);

    if(smoothIndex>=SmoothCount)

  {

    smoothIndex=0;

  }

 

  aPara.phyPara.o2Concentration=SmoothingFilter(currentValue[0],AD1Value,smoothIndex,SmoothCount,(O2RANGE-O2ZERO),2.0,0.2);

  aPara.phyPara.h2Concentration=SmoothingFilter(currentValue[1],AD2Value,smoothIndex,SmoothCount,(H2RANGE-H2ZERO),2.0,0.2);

 

  smoothIndex++;

}

/*計算測量值,將AD轉換的值轉爲物理量的對應值*/

static void CalcMeasuredValue(float *newValue)
{
  uint16_t measuredValue=0;

  /*轉化通道1的值*/

  ADDA_AD7705_ENABLE();//使能器件

  Delayus(200);

  measuredValue=GetAD7705ChannelValue(Channel1,SPIReadWriteByte,CheckDataIsReady);

  ADDA_AD7705_DISABLE();//片選取消

  newValue[0]=PowerNPolyfit(((float)(measuredValue-AD1Zero)/(float)(AD1Scale-AD1Zero)),ADFactor[0],3)*(O2RANGE-O2ZERO)+O2ZERO;

  Delayms(1);

  

  /*轉化通道2的值*/

  ADDA_AD7705_ENABLE();//使能器件

  Delayus(200);

  measuredValue=GetAD7705ChannelValue(Channel2,SPIReadWriteByte,CheckDataIsReady);

  ADDA_AD7705_DISABLE();//片選取消

  newValue[1]=PowerNPolyfit(((float)(measuredValue-AD2Zero)/(float)(AD2Scale-AD2Zero)),ADFactor[1],3)*(H2RANGE-H2ZERO)+H2ZERO;

  Delayms(1);

}

/*對SPI端口讀寫一個字節*/

static uint8_t SPIReadWriteByte(uint8_t data)
{
  uint8_t rxData=0;

  HAL_SPI_TransmitReceive(&hspi3,&data,&rxData,1,1000);

  return rxData;

}

/*檢查數據是否準備好*/

static uint8_t CheckDataIsReady(void)
{
  return (uint8_t)HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_7);
}

三、測試結果

程序下裝後,運行正常可一看到2個通道的採集數據。以下圖所示:

 

咱們在測試時,採集了兩個傳感器輸出,在實際使用時,咱們只須要一路接傳感器,而另一路咱們採集鋰電池的電壓信號。

相關文章
相關標籤/搜索