色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

聚豐項目 > 呼吸式酒精檢測儀檢定設備

呼吸式酒精檢測儀檢定設備

本項目是一套用于酒精檢測儀的檢定的設備,用于測試酒精檢測儀器精確性的檢定。如可用于檢定呼吸式警用酒精檢測儀等。系統要實現溫濕度檢測、輸入輸出壓力檢測、溫度控制及高精度溫度檢測等,因為在測試過程中溫度和濕度會對檢定的精確性有重要影響。進氣分為6路,除了空氣和酒精氣體外,還有CO和丙酮等干擾性氣體,有一套復炸的氣體配置方式。同時又有4路氣體加熱腔室對測試氣體進行加熱并進行精確的溫度控制。另外對氣體的流量要進行控制并能實現數據遠傳和操作。

Cresta Cresta

分享
6 喜歡這個項目
團隊介紹

Cresta Cresta

團隊成員

尹家軍 工程師

分享
項目簡介
本項目是一套用于酒精檢測儀的檢定的設備,用于測試酒精檢測儀器精確性的檢定。如可用于檢定呼吸式警用酒精檢測儀等。系統要實現溫濕度檢測、輸入輸出壓力檢測、溫度控制及高精度溫度檢測等,因為在測試過程中溫度和濕度會對檢定的精確性有重要影響。進氣分為6路,除了空氣和酒精氣體外,還有CO和丙酮等干擾性氣體,有一套復炸的氣體配置方式。同時又有4路氣體加熱腔室對測試氣體進行加熱并進行精確的溫度控制。另外對氣體的流量要進行控制并能實現數據遠傳和操作。
硬件說明

根據項目需求,在氣體流量控制方面選優MFC(氣體質量流量控制器)通過ADCDAC實現控制。ADCDAC都使用片上自帶的,采用運算放大器進行隔離和放大使其輸入輸出0-5VDC信號。

jj1.png

溫度檢測通過LTC2400實現熱電阻高精度溫度采集。由于對溫度非常敏感所以這部分要求較高,使用了24位的ADC實現高進度采集,通過SPI總線獲取。

jj2.png

試驗氣體的配置采用6個六個電磁閥控制配置不同成分的測試氣體。沒路輸出根據需要可輸出干觸點或者24VDC濕觸點。

jj3.png

溫度控制器采用宇電AI-7804同時實現4路溫度的檢測與控制。采用RS-485的通訊方式和PWM輸出控制加熱功率。

jj4.png

上位通訊采用兩種方式,以太網遠傳和串口觸摸屏控制。以太網采用W5500SPI接口方式實現:

jj5.PNG

而串口觸摸屏的通訊采用RS485或者RS232方式,本次采用RS485的通訊方式,使用MAX3485芯片實現。

jj6.png

壓力檢測采用MS5803采集壓力的變化,采用I2C通訊。濕度檢測使用SHT15實現,采用類式I2C通訊方式,通過GPIO模擬。


軟件說明

軟件的設計采用IAR EWARM V7.8ST標準庫V3.5實現。具體的軟件設計包括上位遠傳通訊、模擬量輸入輸出控制、邏輯控制、熱電阻溫度采集、溫濕度和壓力數據采集以及加熱和溫度控制。

為了讓軟件更好地適應更換傳感器和應用不同場合的功能增減要求,我們在設計軟件時使用了一個配置文件來配置更能的使用和增減。這個配置文件就是一個頭文件,定義了一些宏來控制條件編譯,節選部分配置文件如下:

/*定義以太網通訊功能的使能,1:啟用;0:禁用*/
#ifndef Ethernet_ENABLE
#define Ethernet_ENABLE (1)
#endif
 
/*定義串口上位通訊使能,1:啟用;0:禁用*/
#ifndef UPPER_SERIAL_ENABLE
#define UPPER_SERIAL_ENABLE (0)
#endif
 
/*定義片上Flash存取使能,1:啟用;0:禁用*/
#ifndef STORAGE_ENABLE
#define STORAGE_ENABLE (0)
#endif
 
/*定義模擬量輸入是否啟用,1:啟用;0:禁用*/
#ifndef ANALOG_INPUT_ENABLE
#define ANALOG_INPUT_ENABLE (1)
#endif
 
/*定義模擬量輸出是否啟用,1:啟用;0:禁用*/
#ifndef ANALOG_OUTPUT_ENABLE
#define ANALOG_OUTPUT_ENABLE (1)
#endif
 
/*定義數字量操作是否啟用,1:啟用;0:禁用*/
#ifndef DIGITAL_ENABLE
#define DIGITAL_ENABLE (1)
#endif
 
/*定義溫濕度計是否啟用,1:啟用;0:禁用*/
#ifndef HYGRO_THERMO_ENABLE
#define HYGRO_THERMO_ENABLE (1)
#endif
 
/*壓力變送器是否啟用,1:啟用;0:禁用*/
#ifndef PRESS_TRANS_ENABLE
#define PRESS_TRANS_ENABLE (1)
#endif
    
/*熱電阻采集電路是否啟用,1:啟用;0:禁用*/
#ifndef RTD_COLLECT_ENABLE
#define RTD_COLLECT_ENABLE (0)
#endif
    
/*備用串行設備是否啟用,1:啟用;0:禁用*/
#ifndef SERIAL_SPARE_ENABLE
#define SERIAL_SPARE_ENABLE (0)
#endif
    
/*溫控器是否啟用,1:啟用;0:禁用*/
#ifndef THERMOSTAT_ENABLE
#define THERMOSTAT_ENABL (0)
#endif
 
/*定義串口上位通訊方式的選擇,1:RS232;0:RS485*/
#ifndef UPUSART_COMM_TYPE
#define UPUSART_COMM_TYPE (0)
#endif
 
/*定義壓力變送器MS4515DO的通訊方式的選擇,1:SPI;0:I2C*/
#ifndef MS4515DO_COMM_TYPE
#define MS4515DO_COMM_TYPE (0)
#endif
 
/*定義啟用的壓力變送器類型,1:MS5837;0:MS5803*/
#ifndef PRESSURE_TRANSMITTER_TYPE
#define PRESSURE_TRANSMITTER_TYPE (0)
#endif
 
/*定義MS5803(MS5837)采集值是否啟用濾波功能,1:啟用;0:禁用*/
#ifndef MS5803_FILTER_ENABLE
#define MS5803_FILTER_ENABLE (1)
#endif

上位遠傳通訊包括有以太網通訊和串口通訊,以太網通訊用于連接遠程計算機,出口通訊用于連接觸摸屏。均使用Modbus協議,支持030616等功能碼。

//解析接收到的數據
uint16_t ReceivedDataParsing(uint8_t *rxBuffer,uint8_t *txBuffer)
{
  uint16_t length=0;
  
  uint8_t fuctionCode=rxBuffer[7];
  switch(fuctionCode)
  {
  case READ_HOLDING_REGISTERS:
    {
      uint16_t startAddress=rxBuffer[8];
      startAddress=(startAddress<<8)+(uint16_t)rxBuffer[9];
      uint16_t RegisterNumber=rxBuffer[10];
      RegisterNumber=(RegisterNumber<<8)+(uint16_t)rxBuffer[11];
      //RegisterNumber=0;
      //讀取對應寄存器數值
      uint8_t returnData[REGISTERAMOUNT*2+2];
      GetRegisterValue(startAddress,RegisterNumber,returnData);
      
      uint16_t byteCount=0;
      txBuffer[byteCount++]=rxBuffer[0];
      txBuffer[byteCount++]=rxBuffer[1];
      txBuffer[byteCount++]=rxBuffer[2];
      txBuffer[byteCount++]=rxBuffer[3];
      uint16_t byteAmount=RegisterNumber*2+3;
      txBuffer[byteCount++]=(byteAmount>>8);
      txBuffer[byteCount++]=byteAmount;
      txBuffer[byteCount++]=rxBuffer[6];
      for(int i=0;i<RegisterNumber*2+2;i++)
      {
        txBuffer[byteCount++]=returnData[i];
      }
      length=byteCount;
      break;
    }
  case WRITE_SINGLE_REGISTER:
    {
      //txBuffer=rxBuffer;//將指針賦值,不能改變數組的值
      uint16_t ByteAmount=rxBuffer[4];
      ByteAmount=(ByteAmount<<8)+(uint16_t)rxBuffer[5];
      length=ByteAmount+6;
      uint16_t objectRegister=0;
      objectRegister=rxBuffer[8];
      objectRegister=(objectRegister<<8)+(uint16_t)rxBuffer[9];
      uint16_t setValue=rxBuffer[10];
      setValue=(setValue<<8)+(uint16_t)rxBuffer[11];
      //將設定值寫到對應的寄存器
      SetRegisterValue(objectRegister,setValue);
      for(int i=0;i<length;i++)
      {
        txBuffer[i]=rxBuffer[i];
      }
      break;
    }
  case WRITE_MULTI_REGISTER:
    {
      length=12;
      SetMultiRegisterValue(rxBuffer+8);
      for(int i=0;i<length;i++)
      {
        txBuffer[i]=rxBuffer[i];
      }
      txBuffer[5]=0x06;
      break;
    }
  default:
    {
      break;
    }
  }
  return length;
}

模擬量輸入輸出控制的控制較為簡單,直接使用DMA操作方式,實現簡單方便,不用詳述。數字量的控制方式以及溫度的SPI操作與前面文章中的一致。

溫濕度采集使用的SHT15模塊,它的通訊協議類是于I2C方式,但是用STM32自帶的I2C來操作卻不方便,所以使用GPIO來實現通訊。為了方便在不同的系統使用所以對時鐘和數據引腳的操作采用的回掉函數來實現。

先便寫SHT15(實際上SHT1X均可用)的操作函數,并在此時用弱化的操作函數:

/*讀取DATA引腳位,弱化的函數,無操作,必須在應用中實現該函數,并自動調用*/
__weak uint8_t ReadDataPinBit(void)
{
  return 0;
}
 
/*將DATA線設置為輸入輸出方向模式*/
__weak void SetDataPineDirection(IODirection direction)
{
}

事實上是,什么也不做,然后在最終的應用中來實現這兩個函數,以實現相應的操作,對于不同的系統只需在應用中實現不同操作。

/*讀取DATA引腳位*/
uint8_t ReadDataPinBit(void)
{
  return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
}
/*將DATA線設置為輸入輸出方向模式*/
void SetDataPineDirection(IODirection direction)
{
  GPIO_InitTypeDef GPIO_InitStructure; 
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  if(direction)
  {
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  }
  else
  {
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  }
   
  GPIO_Init( GPIOB, &GPIO_InitStructure); 
}

同時使用函數執政數組的方式來簡化SCKDATA引腳的操作函數的編寫:

/*定義操作GPIO管腳的函數指針*/
void (*OperationSHT1xIO[])(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)={GPIO_ResetBits,GPIO_SetBits};
/*定義SHT1X總線引腳操作函數指針*/
BusPinOperation SetBusPin[]={OperationSckPin,OperationDataPin};
/*操作SCK引腳,設置高低操作*/
void OperationSckPin(BusPinValue value)
{
  OperationSHT1xIO[value](GPIOB,GPIO_Pin_6);
}
 
/*操作DATA引腳,設置高低操作*/
void OperationDataPin(BusPinValue value)
{
  OperationSHT1xIO[value](GPIOB,GPIO_Pin_7);
}

同時定義幾個枚舉類型:

typedef enum{
  Set=1,
  Reset=(!Set)
}BusPinValue;
 
typedef enum{
  Out=1,
  In=(!Out)
}IODirection;
 
typedef enum{
  SckPin=0,
  DataPin=1
}SHT1XPin;

這樣要操作那個引腳就非常方便了:

  /*將data線設置為輸出模式*/
  SetDataPineDirection(Out);
  /*將DATA引腳置位*/
  SetBusPin[DataPin](Set);

壓力數據采集的采用I2C總線,對STM32I2C通訊網上文章很多此處不再重復,需要提一下的是整個操作也是適用函數指針來實現毀掉的方式來簡化編程過程。另外STM32I2C好像比較容易出現死鎖的情況,不知為何,有待解惑。

加熱和溫度控制采用RS485通訊,使用宇電的AI-BUS協議,這個比較簡單,不再多說。


演示效果

經過差不多2周的調試,現在設備已經成型,效果還是比較理想的,首先來一張調試圖片:

yjj7.png

這是現實的DAC輸出電壓:

jj8.png

這是數據遠傳以Modscan讀取數據的結果:

jj9.png

來一張組裝后的圖片:

yjj10.png

最后來一組測試是的上位操作及顯示畫面:

jj13.png

jj14.png

jj15.png

jj16.png

jj17.png

jj18.png

jj19.png

jj20.png

jj21.png


最后說一下這次的一點體會,以往程序調試沒問題就算好了,由于這個產品對時間非常敏感,有些測試過程必須在很短的時間(以毫秒為單位)完成。所以這次我再軟解的整體結構上下了一些功夫,讓速度提升了好幾倍,所以我覺得規劃好程序結構也是一很重要的方面。

 


評論區(4 )
  • 黑科技大學: 有聯系方式嗎

    回復

  • 超級開發板: 這個不錯,我也做個

    回復

    • zh559663: 你好,您做了嗎,我也想做一個可以請教一下嗎

      回復

  • 動心忍性1234: 您好我是無線電雜志的編輯,我們對您的項目十分感興趣,請問您有興趣投稿嗎?成為我們的作者除稿費外還有其他優厚條件。敬請參與。投稿請聯系QQ260534978.

    回復

主站蜘蛛池模板: 野花日本高清在线观看免费吗| 久久久久久久久a免费| 午夜福利免费视频921000电影| 久久久久亚洲日日精品| 干极品美女| 1973性农场未删减版| 午夜男女爽爽羞羞影院在线观看| 伦理片飘花免费影院| 国产色婷亚洲99精品AV在| av天堂电影网| 在教室轮流被澡高H林萌| 忘忧草高清| 啪啪漫画无遮挡全彩h网站| 精品香蕉99久久久久网站| 放射源分类办法| 99久久精品免费精品国产 | CHINA中国东北GURMA| 亚洲人成网77777色在线播放| 日韩精品无码久久一区二区三| 乱奷XXXXXHD| 九九热精品免费观看| 国产三级在线精品男人的天堂| FREEHDXXXX学生妹| 2020精品国产视| 影音先锋男人资源813.| 亚洲国产综合人成综合网站00| 天天综合网网欲色| 人人干人人插| 男人舔女人的阴部黄色骚虎视频| 娇喘嗯嗯 轻点啊视频福利| 国产久久亚洲美女久久| 高清bblxx手机在线观看| japanese from色系| 4399的视频BD高清在线观看免费| 亚洲综合小说久久另类区| 亚洲黄色在线观看| 亚洲AV无码专区国产乱码网站| 丝袜美腿美女被狂躁在线观看| 秋霞电影伦网理最新在线看片| 欧美激情视频一区二区| 2019中文字幕乱码免费|