找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16612|回复: 27
收起左侧

TDC-GP22源码与资料分享,pin对pin替代MS1022 用于激光,超声波测距

  [复制链接]
ID:184677 发表于 2018-4-5 12:01 | 显示全部楼层 |阅读模式
MS1022是一款高精度时间测量(TDC)电路,替代ACAM  GP22,是 MS1002的升级产品,与 MS1002 管脚完全兼容,且兼容MS1002的所有功能。
MS1022内部集成了模拟比较器、模拟开关、施密特触发器等器件,从而大大简化了外围电路。同时内部增加了第一波检测功能,使抗干扰能力大大提高。内部比较器的 offset 可编程范围为± 35 mV,可提高采样精度。用户可以读取第一个回波脉冲的相对宽度来判断接收信号强度的提示。通过这个提示可以判断超声波换能器异常、管壁覆盖物增多、水中有气泡等异常检测。通过命令StartTOFRestart 可以完成一次超声波时差(顺流和逆流)的测量和数据的读取,从而大大减少软件的操作和电量的消耗。
0.jpg 0.jpg
测量范围 1:

   双通道单精度模式 75ps
   单通道双精度模式 37ps
   测量范围 3.5ns(0ns)至 2.5μs
   20ns 最小脉冲间隔,最多可接收 4 个脉冲

测量范围 2:
   单通道单精度模式 75ps 分辨率
   双精度模式 37ps,四精度模式 19ps 的分辨率
   测量范围 500ns 至 4ms(4M 高速时钟下)
   可测量 3 个脉冲,并可自动处理 3 个数据

模拟输入电路:
   斩波稳定低漂移比较器,具有可编程偏移电压,±35 mV
   第一波检测
   可测量第一波的脉冲宽度
   内部集成用于输入选择的模拟开关
   外部电路仅需要 2 个电阻和 2 个电容

温度测量单元:
   2 个或 4 个温度传感器,PT500/PT1000 或更高
   内部集成施密特触发器
   应用外部施密特触发器 16 位有效进度,应用内部低噪声触发器 17.5 位有效精度
   超低功耗(每 30 秒测量一次时为 0.8A)
   特殊功能
   脉冲发生器,最多可生成 127 个脉冲
   上升或/和下降沿触发测量
   高精度的 STOP 屏蔽窗口
   低功耗 32K 振荡器(500nA)
   7×32 位的 EEPROM

综述:
   4 线 SPI 通信接口
   工作电压 2.5V 至 3.6V
   工作温度-40℃至+125℃
   QFN32/LQFP32 封装

激光测距单片机源程序如下:
  1. #include <msp430x44x.h>

  2. typedef unsigned char     uint8_t;
  3. typedef unsigned int      uint16_t;
  4. typedef unsigned long     uint32_t;

  5. uint8_t Intn_flag;
  6. uint32_t Result_Reg0,Result_Reg1,Result_Reg2;
  7. //uint8_t time_down_up_flag = 0;
  8. //uint8_t  MS1022_STATE = 0;

  9. #define INIT                     0X01
  10. #define POWER_ON_RESET           0X02
  11. #define START_TOF                0X03
  12. #define START_TEMP               0X04
  13. #define START_CAL_RESONATOR      0X05
  14. #define START_CAL_TDC            0X06
  15. #define START_TOF_RESTART        0X07
  16. #define START_TEMP_RESTART       0X08

  17. #define Init()                   Write_Order(0X70,INIT)
  18. #define Power_On_Reset()         Write_Order(0X50,POWER_ON_RESET)         
  19. #define Start_TOF()              Write_Order(0X01,START_TOF)
  20. #define Start_Temp()             Write_Order(0X02,START_TEMP)
  21. #define Start_Cal_Resonator()    Write_Order(0X03,START_CAL_RESONATOR)
  22. #define Start_Cal_TDC()          Write_Order(0X04,START_CAL_TDC)
  23. #define Start_TOF_Restart()      Write_Order(0X05,START_TOF_RESTART)
  24. #define Start_Temp_Restart()     Write_Order(0X06,START_TEMP_RESTART)

  25. #define SSN_1             P6OUT |= BIT2;
  26. #define SSN_0             P6OUT &= (uint8_t)~BIT2;

  27. #define SCK_1             P6OUT |= BIT0;
  28. #define SCK_0             P6OUT &= (uint8_t)~BIT0;

  29. #define SI_1              P1OUT |= BIT6;
  30. #define SI_0              P1OUT &= (uint8_t)~BIT6;

  31. #define RSTN_1            P3OUT |= BIT1;
  32. #define RSTN_0            P3OUT &= (uint8_t)~BIT1;

  33. #define SO_0_1                  (P1IN&BIT7)                //端口电平查询

  34. #define ACLK_ON            P1SEL |= BIT5;
  35. #define ACLK_OFF           P1SEL &= (uint8_t)~BIT5;


  36. void GPIO_Config(void);
  37. void System_Config(void);
  38. void Delay_1us(unsigned int t);
  39. void Delay_us(uint16_t t);
  40. void Delay_ms(uint16_t t);
  41. void SPI_Init(void);
  42. void SPI_ENABLE(void);
  43. void SPI_DISABLE(void);
  44. void SEND_0(void);
  45. void SEND_1(void);
  46. void SPI_WRITE8(uint8_t wbuf8);
  47. uint8_t SPI_READ8(void);
  48. void SPI_WRITE32(uint32_t wbuf32);
  49. uint32_t SPI_READ32(void);
  50. uint16_t SPI_READ16(void);
  51. void Write_Reg(uint8_t RegNum,uint32_t RegData);
  52. uint32_t Read_Reg(uint8_t RegNum);
  53. uint8_t Read_PW1ST(void);
  54. uint8_t Read_REG_1(void);
  55. void Write_Order(uint8_t Order,uint8_t Order_Num);
  56. void MS1022_Config(void);
  57. void MS1022_PWM(void);


  58. /*****************************************************************
  59. 函数名:
  60. 入口参数:
  61. 参数说明:
  62. 出口参数:
  63. 参数说明:
  64. 功能:  主函数
  65. 代码编制:
  66. ******************************************************************/
  67. void main(void)
  68. {
  69.         WDTCTL = WDTPW + WDTHOLD;         
  70.         System_Config(); //系统初始化
  71.         MS1022_Config(); //MS1002初始化
  72.         ACLK_ON;
  73.         _EINT();//GIE使能  中断使能
  74.         while(1)
  75.         {
  76.                 MS1022_PWM();
  77.         }
  78. }



  79. /*****************************************************************
  80. 函数名:
  81. 入口参数:
  82. 参数说明:
  83. 出口参数:
  84. 参数说明:
  85. 功能:  IO口中断,一个ms1002 intn中断
  86. 代码编制:
  87. ******************************************************************/
  88. #pragma vector=PORT2_VECTOR
  89. __interrupt void Port2_Int(void)
  90. {
  91.         
  92.         LPM3_EXIT;
  93.         if((P2IFG & 0x02) == 0x02)
  94.         {
  95.                 for(unsigned int i = 0;i<300;i++);
  96.                 if((P2IFG & 0x02) == 0x02)
  97.                 {
  98.                         Intn_flag = 1;
  99.                 }
  100.                 P2IFG &= (uint8_t)~BIT1;
  101.         }
  102. }

  103. /*****************************************************************
  104. 函数名:
  105. 入口参数:
  106. 参数说明:
  107. 出口参数:
  108. 参数说明:
  109. 功能:          IO口初始化
  110. 代码编制:
  111. ******************************************************************/
  112. void GPIO_Config(void)
  113. {
  114.     P1DIR = 0X6F;
  115.     P1OUT = 0XFF;
  116.         
  117.     P1IES = 0X08; //高到低转变置标志
  118.     P1IE  = 0X08;
  119.     P1IFG = 0X00;
  120.         
  121.     P2DIR = 0XDD;//P2.4、P2.5、P2.6输出
  122.     P2OUT = 0X32;
  123.         
  124.     P2IES = 0X02; //init
  125.     P2IE  = 0X02;
  126.     P2IFG = 0X00;
  127.         
  128.     P3DIR = 0XFF;
  129.     P3OUT = 0X00;
  130.         
  131.     P4DIR = 0XFd;
  132.     P4OUT = 0X02;
  133.         
  134.     P6DIR = 0XFF;
  135.     P6OUT = 0X01;
  136.             
  137. }



  138. /*****************************************************************
  139. 函数名:
  140. 入口参数:
  141. 参数说明:
  142. 出口参数:
  143. 参数说明:
  144. 功能:  系统初始化
  145. 代码编制:
  146. ******************************************************************/
  147. void System_Config(void)
  148. {
  149.     FLL_CTL0 |= DCOPLUS + XCAP10PF;
  150.     SCFI0 |= FN_2; //
  151.     SCFQCTL = 30; // (121+1) x 32768 x 2 = 7.99 MHz    8m=121, 4M=60;  2M=30
  152.     GPIO_Config();   //IO口初始化
  153. }

  154. /*****************************************************************
  155. 函数名:
  156. 入口参数:
  157. 参数说明:
  158. 出口参数:
  159. 参数说明:
  160. 功能:  延时函数
  161. 代码编制:
  162. ******************************************************************/
  163. void Delay_us(uint16_t t)
  164. {
  165.         while(t--)
  166.         {
  167.                
  168.         }
  169. }

  170. /*****************************************************************
  171. 函数名:
  172. 入口参数:
  173. 参数说明:
  174. 出口参数:
  175. 参数说明:
  176. 功能:  延时函数
  177. 代码编制:
  178. ******************************************************************/
  179. void Delay_ms(uint16_t t)
  180. {
  181.         uint16_t i;
  182.         for(i=0;i<t;i++)
  183.         {
  184.             Delay_us(1000);
  185.         }
  186. }


  187. /*****************************************************************
  188. 函数名:
  189. 入口参数:
  190. 参数说明:
  191. 出口参数:
  192. 参数说明:
  193. 功能:   延时函数
  194. 代码编制:
  195. ******************************************************************/
  196. void Delay_1us(unsigned int t)
  197. {
  198.         while(t--)
  199.         {
  200.         //        _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
  201.         //        _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
  202.         //        _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
  203.         }
  204. }

  205. /*****************************************************************
  206. 函数名:
  207. 入口参数:
  208. 参数说明:
  209. 出口参数:
  210. 参数说明:
  211. 功能:  SPI初始化
  212. 代码编制:
  213. ******************************************************************/
  214. void SPI_Init(void)
  215. {        
  216.         SSN_1;        //SSN置高、关闭与MS1022通讯
  217.         SI_0;   //默认MS1022数据输入为低
  218.         SCK_0;  //默认MS1022时钟为低
  219.         Delay_1us(2);        
  220. }

  221. /*****************************************************************
  222. 函数名:
  223. 入口参数:
  224. 参数说明:
  225. 出口参数:
  226. 参数说明:
  227. 功能:  SPI通讯使能
  228. 代码编制:
  229. ******************************************************************/
  230. void SPI_ENABLE(void)
  231. {
  232.         SSN_0;  //SSN置低、开始与MS1022通讯
  233.         Delay_1us(2);        
  234. }

  235. /*****************************************************************
  236. 函数名:
  237. 入口参数:
  238. 参数说明:
  239. 出口参数:
  240. 参数说明:
  241. 功能:  SPI通讯关闭 0-1-0
  242. 代码编制:
  243. ******************************************************************/
  244. void SPI_DISABLE(void)
  245. {
  246.         SSN_0;
  247.         Delay_1us(1);
  248.         SSN_1;
  249.         Delay_1us(1);
  250.         SSN_0;
  251.         Delay_1us(1);
  252.         SSN_1;        
  253. }
  254. /*****************************************************************
  255. 函数名:
  256. 入口参数:
  257. 参数说明:
  258. 出口参数:
  259. 参数说明:
  260. 功能:  发送位“0”
  261. 代码编制:
  262. ******************************************************************/
  263. void SEND_0(void)
  264. {
  265.         SI_0;
  266.         SCK_1;
  267.         SCK_0;
  268.         //_NOP();
  269. }

  270. /*****************************************************************
  271. 函数名:
  272. 入口参数:
  273. 参数说明:
  274. 出口参数:
  275. 参数说明:
  276. 功能:  发送位“1”
  277. 代码编制:
  278. ******************************************************************/
  279. void SEND_1(void)
  280. {
  281.         SI_1;
  282.         SCK_1;
  283.         SCK_0;
  284.         //_NOP();
  285. }

  286. /*****************************************************************
  287. 函数名:
  288. 入口参数:
  289. 参数说明:
  290. 出口参数:
  291. 参数说明:
  292. 功能:  SPI写一个字节 8位
  293. 代码编制:
  294. ******************************************************************/
  295. void SPI_WRITE8(uint8_t wbuf8)
  296. {
  297.         uint8_t cnt,MSB8 = 0x80;
  298.         //SPI_ENABLE();
  299.         SCK_0;
  300.         for(cnt = 8;cnt > 0;cnt--)
  301.         {
  302.                 if(wbuf8 & MSB8)
  303.                    SEND_1();
  304.                 else
  305.                    SEND_0();
  306.                 wbuf8 <<= 1;
  307.         }
  308. }

  309. /*****************************************************************
  310. 函数名:
  311. 入口参数:
  312. 参数说明:
  313. 出口参数:
  314. 参数说明:
  315. 功能:  SPI读一个字节 8位
  316. 代码编制:
  317. ******************************************************************/
  318. uint8_t SPI_READ8(void)
  319. {
  320.         uint8_t cnt;
  321.         uint8_t LSB8 = 0x01;
  322.         uint8_t rbuf8 = 0x00;
  323.         
  324.         for(cnt = 8;cnt > 0;cnt--)
  325.         {
  326.                 rbuf8 <<= 1;
  327.                 SCK_1;
  328.                 //_NOP();
  329.                 if( SO_0_1 )
  330.                    rbuf8 |= LSB8;
  331.                 //_NOP();
  332.                 SCK_0;
  333.                 //_NOP();
  334.         }
  335.         return rbuf8;
  336. }

  337. /*****************************************************************
  338. 函数名:
  339. 入口参数:
  340. 参数说明:
  341. 出口参数:
  342. 参数说明:
  343. 功能:  SPI写4个字节 32位
  344. 代码编制:
  345. ******************************************************************/
  346. void SPI_WRITE32(uint32_t wbuf32)
  347. {
  348.         uint8_t  cnt;
  349.         uint32_t MSB32 = 0x80000000;
  350.         for(cnt=32;cnt>0;cnt--)
  351.         {
  352.                 if(wbuf32 & MSB32)
  353.                    SEND_1();
  354.                 else
  355.                    SEND_0();
  356.                 wbuf32 <<= 1;
  357.         }
  358. }

  359. /*****************************************************************
  360. 函数名:
  361. 入口参数:
  362. 参数说明:
  363. 出口参数:
  364. 参数说明:
  365. 功能:  SPI都4个字节,32位
  366. 代码编制:
  367. ******************************************************************/
  368. uint32_t SPI_READ32(void)
  369. {
  370.         uint8_t cnt;
  371.         uint32_t LSB32 = 0x00000001;
  372.         uint32_t rbuf32 = 0x00000000;
  373.         
  374.         for(cnt=32;cnt>0;cnt--)
  375.         {
  376.                 rbuf32 <<=1;
  377.                 SCK_1;
  378.                 //_NOP();
  379.                 if( SO_0_1 )
  380.                 rbuf32 |= LSB32;
  381.                 //_NOP();
  382.                 SCK_0;
  383.                 //_NOP();
  384.         }
  385.         return rbuf32;
  386. }

  387. /*****************************************************************
  388. 函数名:
  389. 入口参数:
  390. 参数说明:
  391. 出口参数:
  392. 参数说明:
  393. 功能:  SPI读2个字节,16位
  394. 代码编制:
  395. ******************************************************************/
  396. uint16_t SPI_READ16(void)
  397. {
  398.         uint8_t cnt;
  399.         uint16_t LSB16 = 0x0001;
  400.         uint16_t rbuf16 = 0x0000;
  401.         
  402.         for(cnt=16;cnt>0;cnt--)
  403.         {
  404.                 rbuf16 <<=1;
  405.                 SCK_1;
  406.                 //_NOP();
  407.                 if( SO_0_1 )
  408.                    rbuf16 |= LSB16;
  409.                 //_NOP();
  410.                 SCK_0;
  411.                 //_NOP();
  412.         }
  413.         return rbuf16;
  414. }

  415. /*****************************************************************
  416. 函数名:
  417. 入口参数:
  418. 参数说明: RegNum 寄存器号:0、1~7;RegData 往寄存器内写的数据
  419. 出口参数:
  420. 参数说明:
  421. 功能:  写寄存器
  422. 代码编制:
  423. ******************************************************************/
  424. void Write_Reg(uint8_t RegNum,uint32_t RegData)
  425. {
  426.         SPI_Init();
  427.         SPI_ENABLE();
  428.         SPI_WRITE8(0x80|RegNum);
  429.         SPI_WRITE32(RegData);
  430.         SPI_DISABLE();
  431. }
  432. /*****************************************************************
  433. 函数名:
  434. 入口参数:
  435. 参数说明: RegNum 寄存器号 0-7
  436. 出口参数:
  437. 参数说明:ReadData 寄存器数据
  438. 功能:  读寄存器
  439. 代码编制:
  440. ******************************************************************/
  441. uint32_t Read_Reg(uint8_t RegNum)
  442. {
  443.     uint32_t ReadData = 0;
  444.         SPI_Init();
  445.         SPI_ENABLE();
  446.         SPI_WRITE8(0xB0|RegNum);
  447.         ReadData = SPI_READ32();
  448.         SPI_DISABLE();
  449.         return ReadData;
  450. }

  451. /*****************************************************************
  452. 函数名:
  453. 入口参数:
  454. 参数说明:
  455. 出口参数:
  456. 参数说明:ReadData PW1ST寄存器数据
  457. 功能:  读PW1ST寄存器
  458. 代码编制:
  459. ******************************************************************/
  460. uint8_t Read_PW1ST(void)
  461. {
  462.     uint8_t ReadData = 0;
  463.         SPI_Init();
  464.         SPI_ENABLE();
  465.         SPI_WRITE8(0xB8);
  466.         ReadData = SPI_READ8();
  467.         SPI_DISABLE();
  468.         return ReadData;
  469. }

  470. /*****************************************************************
  471. 函数名:
  472. 入口参数:
  473. 参数说明:
  474. 出口参数:ReadData 寄存器数据
  475. 参数说明:
  476. 功能:  读寄存器1的高8位
  477. 代码编制:
  478. ******************************************************************/
  479. uint8_t Read_REG_1(void)
  480. {
  481.         uint8_t ReadData = 0;
  482.         SPI_Init();
  483.         SPI_ENABLE();
  484.         SPI_WRITE8(0xB5);
  485.         ReadData = SPI_READ8();
  486.         SPI_DISABLE();
  487.         return ReadData;
  488. }

  489. /*****************************************************************
  490. 函数名:
  491. 入口参数:Order 命令;Order_Num 命令序号 用作其他程序用(自定义的)
  492. 参数说明:
  493. 出口参数:
  494. 参数说明:
  495. 功能:  写命令,如0x02 温度测量
  496. 代码编制:
  497. ******************************************************************/
  498. void Write_Order(uint8_t Order,uint8_t Order_Num)
  499. {
  500.         SPI_Init();
  501.         SPI_ENABLE();
  502.         SPI_WRITE8(Order);
  503.         SPI_DISABLE();
  504.         //MS1022_STATE = Order_Num;
  505. }

  506. /*****************************************************************
  507. 函数名:
  508. 入口参数:
  509. 参数说明:
  510. 出口参数:
  511. 参数说明:
  512. 功能:  MS1022 6个寄存器初始化
  513. 代码编制:
  514. ******************************************************************/
  515. void MS1022_Config(void)
  516. {
  517.         uint32_t REG0,REG1,REG2,REG3,REG4,REG5,REG6;
  518.         REG0=0x03456801;
  519. ……………………

  520. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

MSP430单片机代码:
激光测距.7z (5.2 MB, 下载次数: 484)
回复

使用道具 举报

ID:332500 发表于 2018-5-17 21:23 | 显示全部楼层
请问, 最快采集周期是多少?
回复

使用道具 举报

ID:380850 发表于 2018-7-30 14:25 | 显示全部楼层
精度能到多少?
回复

使用道具 举报

ID:93667 发表于 2018-12-4 13:49 | 显示全部楼层
谢谢分享!!!!!!!!!!!!!!!!
回复

使用道具 举报

ID:246780 发表于 2018-12-5 06:50 | 显示全部楼层
这颗料看pdf是不错 不知道用起来怎么样
回复

使用道具 举报

ID:252826 发表于 2018-12-14 10:20 | 显示全部楼层
不错,不知性能如何
回复

使用道具 举报

ID:427773 发表于 2019-1-2 22:02 | 显示全部楼层
好用的芯片,便宜实惠!
回复

使用道具 举报

ID:262182 发表于 2019-4-8 16:11 | 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

ID:421254 发表于 2019-7-11 15:28 | 显示全部楼层
可以接200kHZ探头吗?
回复

使用道具 举报

ID:598598 发表于 2019-8-9 21:56 | 显示全部楼层
有没有更纤详细点的资料,急求
回复

使用道具 举报

ID:111953 发表于 2019-8-13 13:52 | 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

ID:282095 发表于 2019-8-13 15:43 | 显示全部楼层
看起来应该还是蛮不错的
回复

使用道具 举报

ID:282095 发表于 2019-8-13 15:52 | 显示全部楼层
应该还是蛮不错的哈
回复

使用道具 举报

ID:282095 发表于 2019-8-13 16:22 | 显示全部楼层
感谢楼主分享哦
回复

使用道具 举报

ID:282817 发表于 2019-12-12 15:45 | 显示全部楼层
这是个好资料,
回复

使用道具 举报

ID:282817 发表于 2019-12-12 15:46 | 显示全部楼层
这是个好资料,
回复

使用道具 举报

ID:664346 发表于 2019-12-15 15:36 | 显示全部楼层
学习了,谢谢楼主!
回复

使用道具 举报

ID:561649 发表于 2020-1-2 15:10 | 显示全部楼层
第一个主是PDF啊
回复

使用道具 举报

ID:599717 发表于 2020-4-22 13:22 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:72563 发表于 2020-6-2 13:26 | 显示全部楼层
支持楼主,支持楼主,厉害厉害
回复

使用道具 举报

ID:283833 发表于 2020-11-8 23:08 | 显示全部楼层
精度还是比较唏嘘,一般用途还是够的。
回复

使用道具 举报

ID:376314 发表于 2020-11-26 16:07 | 显示全部楼层
楼主又带电路又带算法,一定要点赞
回复

使用道具 举报

ID:264289 发表于 2020-12-25 21:59 | 显示全部楼层
精度能达到多少?
回复

使用道具 举报

ID:588772 发表于 2021-3-22 09:26 | 显示全部楼层
不知道这颗料用的效果如何,用过的人来反馈一下
回复

使用道具 举报

ID:978350 发表于 2021-11-5 17:00 | 显示全部楼层
所以实测精度能达到多少?假如我测一个1ms的间距
回复

使用道具 举报

ID:998319 发表于 2021-12-29 17:25 | 显示全部楼层

这颗料看pdf是不错 不知道用起来怎么样
回复

使用道具 举报

ID:22621 发表于 2022-10-22 15:25 | 显示全部楼层
正好用到,下來研究下,謝樓主分享!
回复

使用道具 举报

ID:821429 发表于 2023-8-19 10:47 | 显示全部楼层
感谢分享,不过程序在我这里还是得不到我需要的结果。最终还是按照官网的手册解决问题,目前信号源测量能到10ns了,信号源给出最小脉宽了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表