ペリフェラルドライバーライブラリ開発ノート16:MS5536C圧力トランスミッタードライバー

圧力検出も頻繁に発生する要件です。たとえば、周囲圧力や低圧ガスなどは圧力検出を使用します。このタイプの検出圧力は比較的低く、一般に大気圧を超えず、場合によっては負圧ですらあります。この記事で説明するMS5536Cは、このタイプのデバイスに属しています。次に、MS5536Cドライバーを設計および実装します。

1.機能の概要

MS5536Cは、工場で校正された高解像度の圧力センサーのシリーズです。このデバイスには、3線式SPIインターフェースを使用したピエゾ抵抗圧力センサーとADCが含まれています。このデバイスは、16ビットのデータワードの形式でデジタル圧力および温度情報を提供します。構造図は次のとおりです。

MS5536Cには、ピエゾ抵抗センサーとセンサーインターフェイスICが含まれていますMS5536Cの主な機能は、ピエゾ抵抗圧力センサーのアナログ出力電圧を16ビットのデジタル値に変換し16ビットの温度センサーを提供することです。MS5536Cは、SPIインターフェイスを介して外界とのデジタル通信を実行します。ピンの定義は次のとおりです。

圧力センサーの出力電圧は温度とプロセスの許容誤差に大きく依存するため、これらの影響を補正する必要があります。各モジュールは、2つの温度と2つの圧力で個別に校正されます。したがって、プロセスの変化と温度の変化を補正するために6つの必要な係数が計算され、各モジュールの64ビットPROM格納されます4ワードのビットシーケンスの組み合わせは、次のように6つの有効係数です。

ためMS5536Cの場合ゲージ圧センサ、MCUは、信号を送信し、クロックの立ち上がりエッジが使用されたとき、MCUはデータを受信し、クロックの立ち下がりエッジが使用されています。

2.ドライブの設計と実装

MS5536C圧力センサーの基本的な状況を理解しました次に、これに基づいてMS5536C圧力センサードライバーを設計および実装します

2.1 、オブジェクト定義

オブジェクトを使用する前に、オブジェクトを取得する必要があります。同様に、MS5536C圧力センサーが必要な場合は、最初にMS5536C圧力センサーのオブジェクトを定義する必要があります

2.1.1 、オブジェクトの抽象化

MS5536C圧力センサーオブジェクトを取得するには、最初にその基本特性を分析する必要があります。一般的に、オブジェクトには、属性と操作という少なくとも2つの特性が含まれています。次にMS5536C圧力センサーの目的をこれら2つの側面から考えます

オブジェクトの特性を識別または記録するには属性を使用する必要があるため、最初に属性を検討してください。MS5536C圧力センサーのオブジェクトプロパティを考えてみましょうまず、各MS5536Cデバイスには6つのキャリブレーション係数があり、各測定に使用する必要があるため、それらを属性として保存します。一方、測定された温度と圧力のデータは、MS5536C動作状態を示しているため、これも属性と見なします。

次にMS5536C圧力センサーオブジェクトの動作も考慮する必要があります。データを取得するMS5536Cのレジスタにアクセスする必要があり、MS5536Cとの間でデータを送受信する必要がありますが、読み取りと書き込みの操作は通常特定のハードウェアプラットフォームに依存するため、読み取りと書き込みの動作をオブジェクト操作と見なします。MS5536Cアクセスする場合、データの送信と受信はそれぞれクロックの立ち上がりエッジと立ち下がりエッジを使用するため、ハードウェアプラットフォームにも関連するSPIポートのモードを変更する必要があるため、オブジェクトの操作として定義します。さらに、制御シーケンスは遅延を処理する必要があり、遅延の実現も特定のソフトウェアおよびハードウェアプラットフォームに依存するため、オブジェクト操作として遅延も使用します。

上記によれば、分析MS5536Cの圧力センサ、我々は定義することができるのオブジェクトタイプMS5536Cを次のように圧力センサ。

//定义MS5536C对象类型
typedef struct MS5536cObject {
  uint16_t coef1;        //校准系数C1
  uint16_t coef2;        //校准系数C2
  uint16_t coef3;        //校准系数C3
  uint16_t coef4;        //校准系数C4
  uint16_t coef5;        //校准系数C5
  uint16_t coef6;        //校准系数C6
 
  int32_t pressure;     //压力100倍整数值
  int32_t temperature;  //温度100倍整数值
 
  float fPressure;     //压力浮点数值
  float fTemperature;  //温度浮点数值
 
  void (*ReadWriteMS)(uint8_t *txData,uint8_t *rxData,uint16_t number);
  void (*Delayms)(volatile uint32_t Delay);
  void (*SetPhase)(MS5536cPhaseType phase);
}MS5536cObjectType;

2.1.2 、オブジェクトの初期化

オブジェクトは宣言にのみ使用できないことがわかっているので、最初にオブジェクトを初期化する必要があるため、ここではMS5536C圧力センサーオブジェクトの初期化関数について検討します。一般的に、初期化関数はいくつかの側面を処理する必要があります。1つ目は、入力パラメーターが適切かどうかを確認することです。2つ目は、オブジェクトのプロパティに初期値を割り当てることです。3つ目は、オブジェクトに必要な初期構成を作成することです。したがって、MS5536C圧力センサーオブジェクトの初期化関数を次のように設計します。

/* 对MS5536C对象进行初始化 */
void Ms5536cInitialization(MS5536cObjectType *ms,
                           MS5536cReadWriteMS readwrite,
                           MS5536cSetPhase setPhase,
                           MS5536cDelayms delayms
                           )
{
  if((ms==NULL)||(readwrite==NULL)||(setPhase==NULL)||(delayms==NULL))
  {
     return;
  }
  ms->ReadWriteMS=readwrite;
  ms->SetPhase=setPhase;
  ms->Delayms=delayms;
      
  ms->coef1=0;
  ms->coef2=0;
  ms->coef3=0;
  ms->coef4=0;
  ms->coef5=0;
  ms->coef6=0;
 
  ms->pressure=0;
  ms->fPressure=0.0;
 
  ms->temperature=0;
  ms->fTemperature=0.0;
 
  //复位
  Ms5336cSoftwareReset(ms);
 
  ms->Delayms(10);
 
  //获取修正系数
  GetCoefficientForMs5536c(ms);
}

2.2オブジェクト操作

MS5536C圧力センサーオブジェクトタイプ定義とオブジェクト初期化関数の設計が完了しましたしかし、私たちの主な目標はオブジェクトの情報を取得することであり、MS5536C圧力センサーのさまざまな操作を実装する必要があります。

2.2.1 、測定データの読み取り

MS5536C我々はそれらを一緒に検討するよう、圧力データの操作、温度データ及び校正係数ゲッターは似ている、我々は、応答レジスタを操作する必要があります。

MS5536Cでは、圧力データは16ビットデータであり、コマンドの送信時とデータの受信時に、読み取りのタイミングに異なるクロックエッジが必要です。

MS5536Cでは、温度データは16ビットデータです。温度データを読み取るタイミングは圧力データと同じであり、コマンドの送信とデータの受信には異なるクロックエッジが必要です。

データ変換には時間がかかるため、コマンドを送信してから33ミリ秒待つ必要があります。上記のタイミング図に従って、変換されたデータを読み取る操作を次のように分析および設計できます。

/* 读取测量数据 */
static uint16_t ReadMeasureData(MS5536cObjectType *ms,uint16_t command)
{
  uint8_t txData[2];
  uint8_t rxData[2];
  uint16_t result=0;
 
  txData[0]=(uint8_t)(command>>8);
  txData[1]=(uint8_t)command;
  ms->ReadWriteMS(txData,rxData,2);
 
  ms->Delayms(23);
  ms->SetPhase(MS5536_SCLK_FALL);
  ms->Delayms(10);
 
  txData[0]=0x00;
  txData[1]=0x00;
  ms->ReadWriteMS(txData,rxData,2);

  result=(rxData[0]<<8)+rxData[1];

  ms->SetPhase(MS5536_SCLK_RISE);
  ms->Delayms(10);
  return result;
}

2.2.2 、レジスタ読み取り

MS5536Cでは、補正係数は4ワードで構成されており、実際には6係数です。この形式は以前に導入されています。これらのデータを読み取るタイミングでも、コマンドの送信時とデータの受信時に異なるクロックエッジが必要です。ワード1とワード3のタイミング図は次のとおりです。

ワード2とワード4読み取るタイミング図は次のとおりです。

上記のタイミング図に従って、レジスタを読み取る操作を次のように分析および設計できます。

/* 读取寄存器值 */
static uint16_t ReadRegister(MS5536cObjectType *ms,uint16_t command)
{
  uint8_t txData[2];
  uint8_t rxData[2];
  uint16_t result=0;
 
  txData[0]=(uint8_t)(command>>8);
  txData[1]=(uint8_t)command;
  ms->ReadWriteMS(txData,rxData,2);

  ms->SetPhase(MS5536_SCLK_FALL);

  txData[0]=0x00;
  txData[1]=0x00;
  ms->ReadWriteMS(txData,rxData,2);
  result=(rxData[0]<<8)+rxData[1];
 
  ms->SetPhase(MS5536_SCLK_RISE);
  ms->Delayms(1);
  return result;
}

2.2.3 、システムリセット

リセット信号のシーケンスは、その固有のパターンがどの状態でもモジュールによって認識されるため、特別です。したがって、マイクロコンピュータMS5536Cの間の同期が失われた場合、それを使用して再起動できます。このシーケンスは21ビット長です。このシーケンス中にDOUT信号が変化する場合があります。電気的干渉が発生した場合にプロトコルが永続的に中断されないように、最初の変換シーケンスの前にリセットシーケンスを送信することをお勧めします。シーケンス図は次のとおりです。

/*对MS5336C进行软件复位*/
void Ms5336cSoftwareReset(MS5536cObjectType *ms)
{
  //命令为21位:10101010 10101010 00000
  uint8_t command[3]={170,170,0};
  uint8_t rxDate[3];
 
  ms->ReadWriteMS(command,rxDate,3);
}

3.ドライバーの使用

MS5536C圧力センサーのドライバーを設計および実装しました。ドライバーの設計が正しいかどうかを確認するには、簡単なアプリケーションを設計する必要があります。次に、ドライバーに基づいてアプリケーションを設計します。

3.1 、オブジェクトを宣言して初期化します

オブジェクトベースの操作を使用するには、最初にこのオブジェクトを取得する必要があるため、最初に、前に定義したMS5536C圧力センサーオブジェクトタイプを使用してMS5536C圧力センサーオブジェクト変数宣言する必要があります。具体的な操作形式は次のとおりです。

MS5536cObjectType ms5536;

このオブジェクト変数はすぐには使用できないと宣言されています。また、ドライバーで定義された初期化関数を使用してこの変数を初期化する必要があります。この初期化関数に必要な入力パラメーターは次のとおりです。

MS5536cObjectType * ms MS5536オブジェクト

MS5536cReadWriteMS読み取り/書き込み、読み取り、および書き込み操作

MS5536cSetPhase setPhase 、位相設定操作

MS5536cDelayms delayms 、遅延操作

これらのパラメーターについて、オブジェクト変数を定義しました。考慮すべき主なことは、いくつかの関数を定義し、パラメーターとして関数ポインターを使用する必要があるということです。これらの関数のタイプは次のとおりです。

typedef void (*MS5536cReadWriteMS)(uint8_t *txData,uint8_t *rxData,uint16_t number);

typedef void (*MS5536cDelayms)(volatile uint32_t Delay);

typedef void (*MS5536cSetPhase)(MS5536cPhaseType phase);

これらの機能については、スタイルに応じて定義できます。特定の操作は、使用するハードウェアプラットフォームに関連している場合があります。特定の機能は次のように定義されています。

/* 通过SPI端口发送数据 */
static void ReadWriteBySPI(uint8_t *txData,uint8_t *rxData,uint16_t number)
{
  HAL_SPI_TransmitReceive(&ms5536hspi,txData,rxData,number,1000);
}

/* SPI1 初始化配置 */
static void MS5536_SPI_Configuration(MS5536cPhaseType phase)
{
  /* SPI1 端口参数配置*/
  ms5536hspi.Instance = SPI1;
  ms5536hspi.Init.Mode = SPI_MODE_MASTER;
  ms5536hspi.Init.Direction = SPI_DIRECTION_2LINES;
  ms5536hspi.Init.DataSize = SPI_DATASIZE_8BIT;
  ms5536hspi.Init.CLKPolarity = SPI_POLARITY_LOW;
  if(phase==MS5536_SCLK_RISE)
  {
    ms5536hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
  }
  else
  {
    ms5536hspi.Init.CLKPhase = SPI_PHASE_2EDGE;
  }
  ms5536hspi.Init.NSS = SPI_NSS_SOFT;
  ms5536hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  ms5536hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
  ms5536hspi.Init.TIMode = SPI_TIMODE_DISABLE;
  ms5536hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  ms5536hspi.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&ms5536hspi) != HAL_OK)
  {
  }
}

さまざまな方法で遅延機能を実現できます。使用するSTM32プラットフォームとHALライブラリHAL_Delay()関数を直接使用できます。したがって、次のように初期化関数を呼び出すことができます。

Ms5536cInitialization(&ms5536、ReadWriteBySPI、MS5536_SPI_Configuration、HAL_Delay);

3.2オブジェクトに基づく操作

オブジェクト変数を定義し、初期化関数を使用して初期化しました。次に、このオブジェクトを操作して、必要なデータを取得することを検討します。ドライブでは、データを取得して変換値の比率値に変換し、次にこのドライブを使用してアプリケーション例を作成します。

/*压力数据处理*/
void PresDataProcess(void)
{
  float pressure=0.0;
  float temperature=0.0;
      
  GetMeasureForMs5536c(&ms5536);
 
  pressure=ms5536.fPressure;
  temperature=ms5536.fTemperature;
}

4.アプリケーションの概要

MS5536C圧力センサーのドライバーを設計し、それを検証するための簡単なアプリケーションを設計しました。実際、私たちは以前プロジェクトでMS5536C圧力センサーを使用し、必要なデータを正しく取得しました。

使用する場合、MS5536C圧力センサーはSPIインターフェースを使用しますが、チップ選択信号がないことに注意してください信号を送信するときは、高レベルとして3から始めます。MCUが信号を送信するときは、クロックの立ち上がりエッジが使用されます。MCUがデータを受信するときは、クロックの立ち下がりエッジが使用されます。立ち上がりエッジと立ち下がりエッジの間の遷移に特別な注意を払う必要があります。そうしないと、読み取られたデータが正しくありません。

ソースコードがリリースされました:https //github.com/foxclever/ExPeriphDriver

注意を払うことを歓迎します:

 

おすすめ

転載: blog.csdn.net/foxclever/article/details/109275928