前言
气压传感器供应商较多,如霍尼韦尔,first sensor,TE,CFsensor,西人马等。本文介绍一种适用于移液枪中气压传感器,霍尼韦尔的RSC 系列 – 高分辨率,高精度,带温度补偿。
一、原理图
市场中的移液枪如hamilton,其内部气压传感器使用First seneor差压式。本次使用霍尼韦尔的RSC系列,成本较高但性能好。
气压传感器
• 绝压式:1.6mbar-10bar;0-15psi
• 差压式:1.6mbar-4bar
• 医疗用:0-50°C
• 精度:+/-0.1%FSS
• 供电:2.7-5V
• 数字接口:SPI,I2C
• 功能:气压监测
• 供应商:霍尼韦尔,TE,First sensor
RSC系列气压传感器减少转换要求以及直接连接至微处理器加快输出速度。易于设计集成,相比于许多同类传感器,它的封装尺寸非常小,因此在PCB板上的占据空间更小。它提供多种端口和外壳选项,简化了集成设计过程。
• 按照传感器重新设计PCB,加接插端子,插拔
• SPI数字接口
• 哈美顿气压传感器:RSCDJJM010MDSE3
高分辨率,双列直插,单径向倒钩端口,医疗用,差压+/-10mbar,SPI接口,外部运算,3.3V供电
二、代码
代码如下(示例):
/*
--------------------------------------------------------------------------------
Global Function Definitions
--------------------------------------------------------------------------------
*/
/*! \fn Compensate_Pressure_Init
* \brief Functional To Initialize the Compensate Pressure module.
* \details Functional To Initialize the Compensate Pressure module,
* By validating EEPROM map and extracting the coefficients.
* \param u8EEPROM_ptr - Pointer to EEPROM image which is read bytewise
* in a contiguous memory buffer.
* \return CompStatus_Enum
* COMPINIT_OK - Compensation init successful
* COMPINIT_NOK - Compensation init failure
*
* \verbatim
* \endverbatim
*/
CompStatus_Enum Compensate_Pressure_Init(unsigned char *u8EEPROM_ptr)
{
unsigned char u8i;
unsigned short int u16k = 0u;
unsigned short int CRC16_Computed = 0xFFFF;
unsigned long int u32temp;
/*! Copy EEPROM Contents */
/*! Copy Part number from EEPROM MAP */
for(u8i = 0u; u8i < PART_NO_SIZE; u8i++)
{
EEPROM_MAP.au8PartNumber[u8i] = (unsigned char)*((unsigned char *)u8EEPROM_ptr + PARTNUMBER_ADDRESS + u8i);
}
/*! Copy Serial number from EEPROM MAP */
for(u8i = 0u; u8i < SERIAL_NO_SIZE; u8i++)
{
EEPROM_MAP.au8SerialNumber[u8i] = (unsigned char)*((unsigned char *)u8EEPROM_ptr + SERIALNUMBER_ADDRESS + u8i);
}
/*! Copy Pressure Range from EEPROM MAP */
u32temp = READ32_ADV((unsigned char *)u8EEPROM_ptr + PRESSURERANGE_ADDRESS);
EEPROM_MAP.f32Pressure_Range = *((float*)&u32temp);
/*! Copy Pressure Offset from EEPROM MAP */
u32temp = READ32_ADV((unsigned char *)u8EEPROM_ptr + PRESSUREOFFSET_ADDRESS);
EEPROM_MAP.f32PressureOffset = *((float*)&u32temp);
/*! Copy Pressure unit from EEPROM MAP */
for(u8i = 0u; u8i < PRESSURE_UNIT_SIZE; u8i++)
{
EEPROM_MAP.au8PressureUnit[u8i] = (unsigned char)*((unsigned char *)u8EEPROM_ptr + PRESSUREUNITS_ADDRESS + u8i);
}
/*! Copy Pressure reference from EEPROM MAP */
EEPROM_MAP.u8PressureReference = (unsigned char)*((unsigned char *)u8EEPROM_ptr + PRESSUREREFERENCE_ADDRESS);
/*! Copy ADC default configuration data from EEPROM MAP */
for(u8i = 0u, u16k = 0u; u8i < 4u; u8i++, u16k += 2u)
{
EEPROM_MAP.au16ADC_Config[u8i] = (unsigned short int)READ16_ADV(((unsigned char *)u8EEPROM_ptr + ADCCONFIG_ADDRESS + u16k));
// printf(" %#x \r\n",EEPROM_MAP.au16ADC_Config[u8i]);
}
/*! Copy coefficients set 1 from EEPROM MAP */
for(u8i = 0u, u16k = 0u; u8i < DEGREE_POLYNOMIAL; u8i++, u16k += 4u)
{
u32temp = READ32_ADV((unsigned char *)u8EEPROM_ptr + COEFF1_ADDRESS + u16k);
EEPROM_MAP.af32Coeff1[u8i] = *((float*)&u32temp);
}
/*! Copy coefficients set 2 from EEPROM MAP */
for