STM32F103 は VL53L0X レーザー測距モジュールを駆動します

STM32F103 は VL53L0X レーザー測距モジュールを駆動します

序章

TOFとは、Time-of-Flight(Tlme of Flight)技術の略で、センサーが変調した近赤外光を放射し、物体に遭遇した後に反射される時間を計算することで、測定された物体の距離を計算します。発光と反射の差または位相差。
VL53L0X は、ターゲットの反射率に関係なく正確な距離測定を提供する新世代の飛行時間型 (ToF) レーザー測距モジュールです。2m の絶対距離を測定でき、測距パフォーマンス レベルの新しいベンチマークを設定します。VL53L0X は、最先端の SPAD アレイ (単一光子アバランシェ ダイオード) を統合し、ST の第 2 世代 FlightSense™ 特許技術を組み込みます。
VL53L0X の 940nm VCSEL エミッター (垂直共振器面発光レーザー) は人間の目には完全に見えず、内蔵の物理赤外線フィルターにより、より長い測距距離と周囲光に対する耐性が強化され、光クロストークの安定性が向上しています。
VL53L0X センサーは 4 つの測定モードを提供します。デフォルト測定モード、高精度測定モード、長距離測定モード、高速測定モードです。ST が公式に提供する 4 つの異なる精度モードの特性に従って、具体的なパラメータを次の表に示します。

精度モード S測定時間(ms) 測距性能(m)
デフォルト 30 1.2
高精度 200 1.2 精度<±3%
長距離 33 2
高速 20 1.2 精度 <±5%

表から、精度動作モードが異なると測定時間の長さが異なることがわかります。最も速い測定時間は高速モードで、20ms 以内に 1 回サンプリングできますが、精度には誤差範囲があります。 ±5%。長距離精密モードでは、測距距離は2mに達し、測定時間は33ms以内ですが、暗い場所で測定する必要があります。ユーザーは、実際のニーズに応じて、さまざまなアプリケーション シナリオでさまざまな作業モードを使用できます。
ここに画像の説明を挿入

ピンの定義

ここに画像の説明を挿入
ここに画像の説明を挿入
SCL: IIC インターフェースクロック信号線;
SDA: IIC インターフェースデータ信号線;
VIN: 3.3-5V 電源正極;
GND: 電源負極
XSHUT (リセット): リセット、ロー有効;
GPIO1: 割り込み出力
IIC デバイスアドレス: 0x52
IIC通信周波数:最大400KHz

STM32F103ZET6 開発ボードと VL53L0X モジュール間の配線

STM32F103ZET6 VL53L0X
3.3V VIN
GND GND
PB10 SCL
PB11 SDA
シャット PA4

ここに画像の説明を挿入

テストコード

  1. main 関数と初期化設定
    以下はプログラムの実行フローに従います。コード リスト 1 main 関数 (main.c ファイル)。main 関数では、まず USART シリアル ポートの設定を初期化します。次に、VL53L0X センサー機能テストの段階に入ります。
int main(void)
{
    
    
 /*初始化 USART 配置模式为 115200 8-N-1,中断接收*/
 USART_Config();
 
 printf(" 欢迎使用野火开发板\r\n");
 printf(" 激光测距传感器实验\r\n");
  while (1) {
    
    
 vl53l0x_test();
 }
}

コード リスト 2 VL53L0X センサー テスト (VL53L0X.c ファイル) テスト関数では、VL53L0X センサーが最初に初期化され、初期化が成功すると、while ループ関数を終了してレーザー測距プロセスに入ります (16 行目)。

1 /**
2 * @brief VL53L0X 主测试程序
3 * @param 无
4 * @retval 无
5 */
6 void vl53l0x_test(void)
7 {
    
    
8 /*vl53l0x 初始化*/
9 while (vl53l0x_init(&vl53l0x_dev)) {
    
    
10 printf("初始化失败\r\n");
11 printf("请检查连接\r\n");
12 }
13 printf("初始化成功\r\n");
14 
15 while (1) {
    
    
16 vl53l0x_general_test(&vl53l0x_dev);
17 }
18 }

コードリスト 3 VL53L0X 動作モードテスト関数 (VL53L0X.c ファイル) テスト関数の 8 行目では、scanf 関数を使用して、開発ボードがシリアル ポート デバッグ アシスタントから制御コマンドを取得します。開発ボードが受信したコマンド文字 ch が有効なコマンド (0<=ch<4 の整数) の場合、開発ボードは vl53l0x_general_start(dev,ch) 関数 (17 番目) を通じてセンサーを制御し、対応するレーザー測距モードに入ります。コード行); 受信した文字が無効なコマンドの場合は、それが表示され、ユーザーに正当なコマンドの入力を求めるプロンプトが表示されます。

1 /**
2 * @brief vl53l0x 工作模式测试
3 * @param dev:设备 I2C 参数结构体
4 * @retval 无
5 */
6 void vl53l0x_general_test(VL53L0X_Dev_t *dev)
7 {
    
    
8 uint32_t ch;
9 
10 Show_GenTask_Message(); //显示普通测量模式 UI
11 
12 while (1) {
    
    
13 scanf("%d",&ch);
14 printf("接收到字符:%d\r\n",ch);
15 
16 if ((ch>=0) && (ch<=3)) {
    
    
17 vl53l0x_general_start(dev,ch);
18 Show_GenTask_Message();
19 } else {
    
    
20 /*如果不是指定指令字符,打印提示信息*/
21 printf("请输入合法指令!\r\n");
22 Show_GenTask_Message();
23 }
24 }
25 }

コードリスト 4 VL53L0X 測定モード設定関数(VL53L0X.c ファイル) 測定モード設定関数では、精度モードの切り替えが頻繁に行われるため、収集される距離データが不正確になる可能性がありますので、使用前に VL53L0X センサーをリセットしてください(18 行目)コード ) を使用して、VL53L0X_StaticIni() 関数を使用してセンサー パラメーターをデフォルトに戻します。また、精度モードの構成は関数パラメータのmode変数によって決まり、モード値は、記述に従って0:デフォルト、1:高精度、2:長距離、3:高速に対応します。グローバル配列 Mode_data[] 変数を使用して、さまざまな精度モード構成を実現します。

1 /**
2 * @brief VL53L0X 测量模式配置
3 * @param dev:设备 I2C 参数结构体
4 * @param mode: 0:默认;1:高精度;2:长距离
5 * @retval 状态信息
6 */
7 VL53L0X_Error vl53l0x_set_mode(VL53L0X_Dev_t *dev,uint8_t mode)
8 {
    
    
9 VL53L0X_Error status = VL53L0X_ERROR_NONE;
10 uint8_t VhvSettings;
11 uint8_t PhaseCal;
12 uint32_t refSpadCount;
13 uint8_t isApertureSpads;
14 
15 /*复位 vl53l0x(频繁切换工作模式容易导致采集距离数据不准,需加上这一代码)*/
18 vl53l0x_reset(dev);
19 status = VL53L0X_StaticInit(dev);
20 
21 /*已校准好了,写入校准值*/
22 if (AjustOK!=0) {
    
    
23 /*设定 Spads 校准值*/
24 status= VL53L0X_SetReferenceSpads(dev,Vl53l0x_data.refSpadCount,
25 Vl53l0x_data.isApertureSpads);
26 if (status!=VL53L0X_ERROR_NONE) goto error;
27 delay_ms(2);
28 
29 /*设定 Ref 校准值*/
30 status= VL53L0X_SetRefCalibration(dev,Vl53l0x_data.VhvSettings,
31 Vl53l0x_data.PhaseCal);
32 if (status!=VL53L0X_ERROR_NONE) goto error;
33 delay_ms(2);
34 
35 /*中间省略代码*/
36 .......
37
38 
39 /*设定 VCSEL 脉冲周期*/
40 status = VL53L0X_SetVcselPulsePeriod(dev,
41 VL53L0X_VCSEL_PERIOD_PRE_RANGE, 
Mode_data[mode].preRangeVcselPeriod);
43 if (status!=VL53L0X_ERROR_NONE) goto error;
44 delay_ms(2);
45 
46 /*设定 VCSEL 脉冲周期范围*/
47 status = VL53L0X_SetVcselPulsePeriod(dev,
 VL53L0X_VCSEL_PERIOD_FINAL_RANGE,
 Mode_data[mode].finalRangeVcselPeriod);
50 
51 error:/*错误信息*/
52 if (status!=VL53L0X_ERROR_NONE) {
    
    
53 print_pal_error(status);
54 return status;
55 }
56 return status;
57}

コードリスト 5 VL53L0X シングル距離測定関数 (VL53L0X.c ファイル) この関数では、VL53L0X_PerformSingleRangingMeasurement() 関数 (コード 15 行目) を呼び出すことによってシングル測定を開始します。この関数はブロック関数です。データは保存されます。 pdata 測定データ構造体に入力し、最後に測定構造体から取得した測定データをグローバル変数 Distance_data に代入します (24 行目) Distance_data 変数の値を読み取ることで、測定距離を知ることができます。

1 /**
2 * @brief VL53L0X 单次距离测量函数
3 * @param dev:设备 I2C 参数结构体
4 * @param pdata:保存测量数据结构体
5 * @retval 状态信息
6 */
7 VL53L0X_Error vl53l0x_start_single_test(VL53L0X_Dev_t *dev, 
VL53L0X_RangingMeasurementData_t *pdata,
9 char *buf)
10 {
    
    
11 VL53L0X_Error status = VL53L0X_ERROR_NONE;
12 uint8_t RangeStatus;
13 
14 /*执行单次测距并获取测距测量数据*/
15 status = VL53L0X_PerformSingleRangingMeasurement(dev, pdata);
16 if (status !=VL53L0X_ERROR_NONE) 
return status;
17 
18 /*获取当前测量状态*/
19 RangeStatus = pdata->RangeStatus;
20 memset(buf,0x00,VL53L0X_MAX_STRING_LENGTH);
21 /*根据测量状态读取状态字符串*/
22 VL53L0X_GetRangeStatusString(RangeStatus,buf);
23 /*保存最近一次测距测量数据*/
24 Distance_data = pdata->RangeMilliMeter;
25 
26 return status;
27 }

実験結果

シリアル ポート アシスタント ソフトウェアが測距モードに対応する番号を入力すると、レーザー測距センサーはセンシング情報を取得し、結果を開発バージョン usart1 シリアル ポートを介してシリアル ポート デバッグ アシスタント ソフトウェアに出力して表示します。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42250136/article/details/131668293