久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1510|回復: 0
打印 上一主題 下一主題
收起左側

基于arduino的VL53L0X驅動做的C51適配VL53L0X驅動

[復制鏈接]
跳轉到指定樓層
樓主
1.簡介

在研究了各位大神的代碼后,結合購買模塊時商家提供的arduino的VL53L0X驅動,我修改ardiuno的驅動寫出了兼容C51的VL53L0X驅動。我的測試的單片機是STC8H3K64S4,IIC通信使用的時STC硬件的IIC。大家只需要把我的IIC驅動和顯示代碼修改成自己的,最后添加一個定時1ms的定時器作為VL53L0X的時基,就可以直接拿來用了。
這是本人第一次發帖,做的工作也比較簡單,如果有什么做的不好的還請諒解。

參考的網站:
http://www.zg4o1577.cn/bbs/dpj-167298-1.html

使用上面網站的代碼寫出來的程序,這個代碼只有最基本的測距功能,測距誤差大概在±5%。對我剛剛接觸VL53L0X時啟發很大。
在使用商家提供的arduino的VL53L0X驅動后,由于設置了VL53L0X的相關寄存器,精度可以達到±1%。當然超過模塊的1.2m的測距范圍精度還是會差很多。


2.上代碼

主函數 main.c
人機交互的相關代碼替換成自己的就行了
  1. #include"inc/VL53L0X.h"
復制代碼

VL53L0X的驅動 VL53L0X.c

代碼太多了只顯示一部分,詳情看附件,大家用的時候記得添加時基就行了。

  1. // Most of the functionality of this library is based on the VL53L0X API
  2. // provided by ST (STSW-IMG005), and some of the explanatory comments are quoted
  3. // or paraphrased from the API source code, API user manual (UM2039), and the
  4. // VL53L0X datasheet.

  5. #include "inc/VL53L0X.h"
  6. #include "inc/VL53L0X_IIC.h"
  7. #include "NodeHandler.h"
  8. #include <string.h>


  9. unsigned char stop_variable;
  10. unsigned long measurement_timing_budget_us;
  11. unsigned int io_timeout = 0, timeout_start_ms, t2;
  12. bit did_timeout;


  13. //===================================
  14. //你自己的定時器時基定時1ms
  15. void Time2() interrupt 12
  16. {
  17.         t2++;
  18. }
  19. //==================================================


  20. // Defines /////////////////////////////////////////////////////////////////////

  21. // The Arduino two-wire interface uses a 7-bit number for the address,
  22. // and sets the last bit correctly based on reads and writes
  23. #define ADDRESS_DEFAULT 0x52

  24. // Record the current time to check an upcoming timeout against
  25. #define startTimeout() (timeout_start_ms = t2)

  26. // Check if timeout is enabled (set to nonzero value) and has expired
  27. #define checkTimeoutExpired() (io_timeout > 0 && ((unsigned  int)t2 - timeout_start_ms) > io_timeout)

  28. // Decode VCSEL (vertical cavity surface emitting laser) pulse period in PCLKs
  29. // from register value
  30. // based on VL53L0X_decode_vcsel_period()
  31. #define decodeVcselPeriod(reg_val)      (((reg_val) + 1) << 1)

  32. // Encode VCSEL pulse period register value from period in PCLKs
  33. // based on VL53L0X_encode_vcsel_period()
  34. #define encodeVcselPeriod(period_pclks) (((period_pclks) >> 1) - 1)
復制代碼

IIC驅動
有人喜歡模擬IIC,有人喜歡硬件IIC,他們各有各的優點,大家按照自己的喜好替換調我的IIC驅動就行了
  1. #define VL53L0X_address                         0x52

  2. //IIC寫8位數據
  3. void VL53L0X_Write(unsigned char address, unsigned char value)
  4. {
  5.         P_SW2 = 0xB0;
  6.         Start();
  7.         SendData(VL53L0X_address);
  8.         RecvACK();
  9.         SendData(address);
  10.         RecvACK();
  11.         SendData(value);
  12.         RecvACK();
  13.         Stop();
  14.         Delay();
  15.         P_SW2 = 0x00;
  16. }

  17. //IIC寫16位數據
  18. void VL53L0X_Write16Bit(unsigned char address, unsigned int value)
  19. {
  20.         P_SW2 = 0xB0;
  21.         VL53L0X_Write(address++, (value >> 8) & 0xFF);
  22.         VL53L0X_Write(address++, value & 0xFF);
  23.         P_SW2 = 0x00;
  24. }

  25. //IIC寫32位數據
  26. //void VL53L0X_Write32Bit(unsigned char address, unsigned long value)
  27. //{
  28. //        Start();
  29. //        SendData(VL53L0X_address);
  30. //        RecvACK();
  31. //        SendData(address);
  32. //        RecvACK();
  33. //        SendData((value >> 24) & 0xFF);
  34. //        RecvACK();
  35. //        SendData((value >> 16) & 0xFF);
  36. //        RecvACK();
  37. //        SendData((value >> 8) & 0xFF);
  38. //        RecvACK();
  39. //        SendData(value & 0xFF);
  40. //        RecvACK();
  41. //        Stop();
  42. //         Delay();
  43. //}

  44. //寫多位數據
  45. void VL53L0X_WriteMulti(unsigned char address, unsigned char const * src, unsigned char count)
  46. {
  47.         P_SW2 = 0xB0;        
  48.         while(count--)
  49.         {
  50.                 VL53L0X_Write(address++, *(src++));
  51.         }
  52.         P_SW2 = 0x00;
  53. }

  54. //IIC讀8位數據
  55. unsigned char VL53L0X_Read(unsigned char address)
  56. {
  57.         unsigned char receive;
  58.         P_SW2 = 0xB0;
  59.         Start();
  60.         SendData(VL53L0X_address);
  61.         RecvACK();
  62.         SendData(address);
  63.         RecvACK();
  64.         
  65.         Start();
  66.         SendData(VL53L0X_address + 1);
  67.         RecvACK();
  68.         receive = RecvData();
  69.         SendNAK();
  70.         Stop();
  71.         Delay();
  72.         P_SW2 = 0x00;
  73.         
  74.         return receive;
  75. }

  76. //IIC讀16位數據
  77. unsigned int VL53L0X_Read16Bit(unsigned char address)
  78. {
  79.         unsigned int receive;
  80.         P_SW2 = 0xB0;
  81.         receive = VL53L0X_Read(address++) << 8;
  82.         receive |= VL53L0X_Read(address);
  83.         P_SW2 = 0x00;
  84.         
  85.         return receive;
  86. }

  87. //IIC讀多位數據
  88. void VL53L0X_ReadMulti(unsigned char address, unsigned char * dst, unsigned char count)
  89. {
  90.         while(count--)
  91.         {
  92.                 *(dst++) = VL53L0X_Read(address++);
  93.         }
  94.         P_SW2 = 0x00;
  95. }
復制代碼

3.其他
說一個我的IIC編程遇到的問題,我在IIC連續讀SDA的數據的時候會存在有時讀到的數據不穩定的情況
連續讀的時候,如下讀兩個字節
  1. //IIC讀16位數據
  2. unsigned int VL53L0X_Read16Bit(unsigned char address)
  3. {
  4.         unsigned int receive;
  5.         IICStart();
  6.         IICSendData(VL53L0X_address);
  7.         IICWaitACK();
  8.         IICSendData(address);
  9.         IICWaitACK();
  10.         IICStop();
  11.         
  12.         IICStart();
  13.         IICSendData(VL53L0X_address + 1);
  14.         IICWaitACK();
復制代碼
VL53L0X的內部寄存器索引會在讀完一個寄存器后自加1,索引加1后讀下一個寄存器的數據。
那么如果這個自加1的索引自加的速度跟不上你IIC讀取的速度呢。
這樣IIC讀取的數據就會不可靠。
連續讀兩個字節,我修改成連續兩次讀一個字節后,數據的讀取就穩定許多了

  1. //IIC讀16位數據
  2. unsigned int VL53L0X_Read16Bit(unsigned char address)
  3. {
  4.         unsigned int receive;
  5.         P_SW2 = 0xB0;
  6.         receive = VL53L0X_Read(address++) << 8;     //兩個字節分兩次讀取
  7.         receive |= VL53L0X_Read(address);
  8.         P_SW2 = 0x00;
  9.         
  10.         return receive;
  11. }
復制代碼
或者大家有更好的見解也可以告訴我,畢竟我也是剛剛開始研究IIC,對IIC的認識也可能有錯誤(說不定我的程序就是建立在BUG上的

4.結果





5.工程源碼及附件
MRC048A-GY-VL53L0XV2 資料.rar (696.82 KB, 下載次數: 5)

VL53L0X -硬件IIC(發帖).rar (210.5 KB, 下載次數: 5)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线视频播放 | 成人免费大片黄在线播放 | 欧美日韩国产一区二区三区 | 成年人网站在线观看视频 | 精品一区二区三区四区五区 | 无人区国产成人久久三区 | 丁香六月伊人 | 99亚洲精品| 久久久精品影院 | 超碰av在线 | 国产精品久久久久久久久久三级 | 久久av一区 | 欧美自拍另类 | 日韩a在线| 亚洲精品www久久久 www.蜜桃av | av大片| 久久中文高清 | 亚洲高清视频一区二区 | 国产精品伦一区二区三级视频 | 成人免费精品视频 | 黄免费在线 | 欧美黄页 | av中文字幕在线观看 | a a毛片 | 国内自拍第一页 | 日韩中文字幕一区二区三区 | av一级| 精品福利在线 | 久久一 | 久久99精品视频 | 在线看一区二区 | 视频精品一区 | 国产成人精品免高潮在线观看 | 免费成人高清 | av天天干 | 国产露脸对白88av | 欧美日韩一二区 | 国产在线观看一区二区三区 | 国产精品久久久久久久久免费丝袜 | 亚洲国产精品视频 | 欧美理论片在线 |