标题:
TDC-GP22源码与资料分享,pin对pin替代MS1022 用于激光,超声波测距
[打印本页]
作者:
chengong510
时间:
2018-4-5 12:01
标题:
TDC-GP22源码与资料分享,pin对pin替代MS1022 用于激光,超声波测距
MS1022是一款高精度时间测量(TDC)电路,替代ACAM GP22,是 MS1002的升级产品,与 MS1002 管脚完全兼容,且兼容MS1002的所有功能。
MS1022内部集成了模拟比较器、模拟开关、施密特触发器等器件,从而大大简化了外围电路。同时内部增加了第一波检测功能,使抗干扰能力大大提高。内部比较器的 offset 可编程范围为± 35 mV,可提高采样精度。用户可以读取第一个回波脉冲的相对宽度来判断接收信号强度的提示。通过这个提示可以判断超声波换能器异常、管壁覆盖物增多、水中有气泡等异常检测。通过命令StartTOFRestart 可以完成一次超声波时差(顺流和逆流)的测量和数据的读取,从而大大减少软件的操作和电量的消耗。
0.jpg
(14.66 KB, 下载次数: 212)
下载附件
2018-4-5 17:08 上传
0.jpg
(14.92 KB, 下载次数: 191)
下载附件
2018-4-5 17:08 上传
测量范围 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 封装
激光测距单片机源程序如下:
#include <msp430x44x.h>
typedef unsigned char uint8_t;
typedef unsigned int uint16_t;
typedef unsigned long uint32_t;
uint8_t Intn_flag;
uint32_t Result_Reg0,Result_Reg1,Result_Reg2;
//uint8_t time_down_up_flag = 0;
//uint8_t MS1022_STATE = 0;
#define INIT 0X01
#define POWER_ON_RESET 0X02
#define START_TOF 0X03
#define START_TEMP 0X04
#define START_CAL_RESONATOR 0X05
#define START_CAL_TDC 0X06
#define START_TOF_RESTART 0X07
#define START_TEMP_RESTART 0X08
#define Init() Write_Order(0X70,INIT)
#define Power_On_Reset() Write_Order(0X50,POWER_ON_RESET)
#define Start_TOF() Write_Order(0X01,START_TOF)
#define Start_Temp() Write_Order(0X02,START_TEMP)
#define Start_Cal_Resonator() Write_Order(0X03,START_CAL_RESONATOR)
#define Start_Cal_TDC() Write_Order(0X04,START_CAL_TDC)
#define Start_TOF_Restart() Write_Order(0X05,START_TOF_RESTART)
#define Start_Temp_Restart() Write_Order(0X06,START_TEMP_RESTART)
#define SSN_1 P6OUT |= BIT2;
#define SSN_0 P6OUT &= (uint8_t)~BIT2;
#define SCK_1 P6OUT |= BIT0;
#define SCK_0 P6OUT &= (uint8_t)~BIT0;
#define SI_1 P1OUT |= BIT6;
#define SI_0 P1OUT &= (uint8_t)~BIT6;
#define RSTN_1 P3OUT |= BIT1;
#define RSTN_0 P3OUT &= (uint8_t)~BIT1;
#define SO_0_1 (P1IN&BIT7) //端口电平查询
#define ACLK_ON P1SEL |= BIT5;
#define ACLK_OFF P1SEL &= (uint8_t)~BIT5;
void GPIO_Config(void);
void System_Config(void);
void Delay_1us(unsigned int t);
void Delay_us(uint16_t t);
void Delay_ms(uint16_t t);
void SPI_Init(void);
void SPI_ENABLE(void);
void SPI_DISABLE(void);
void SEND_0(void);
void SEND_1(void);
void SPI_WRITE8(uint8_t wbuf8);
uint8_t SPI_READ8(void);
void SPI_WRITE32(uint32_t wbuf32);
uint32_t SPI_READ32(void);
uint16_t SPI_READ16(void);
void Write_Reg(uint8_t RegNum,uint32_t RegData);
uint32_t Read_Reg(uint8_t RegNum);
uint8_t Read_PW1ST(void);
uint8_t Read_REG_1(void);
void Write_Order(uint8_t Order,uint8_t Order_Num);
void MS1022_Config(void);
void MS1022_PWM(void);
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: 主函数
代码编制:
******************************************************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
System_Config(); //系统初始化
MS1022_Config(); //MS1002初始化
ACLK_ON;
_EINT();//GIE使能 中断使能
while(1)
{
MS1022_PWM();
}
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: IO口中断,一个ms1002 intn中断
代码编制:
******************************************************************/
#pragma vector=PORT2_VECTOR
__interrupt void Port2_Int(void)
{
LPM3_EXIT;
if((P2IFG & 0x02) == 0x02)
{
for(unsigned int i = 0;i<300;i++);
if((P2IFG & 0x02) == 0x02)
{
Intn_flag = 1;
}
P2IFG &= (uint8_t)~BIT1;
}
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: IO口初始化
代码编制:
******************************************************************/
void GPIO_Config(void)
{
P1DIR = 0X6F;
P1OUT = 0XFF;
P1IES = 0X08; //高到低转变置标志
P1IE = 0X08;
P1IFG = 0X00;
P2DIR = 0XDD;//P2.4、P2.5、P2.6输出
P2OUT = 0X32;
P2IES = 0X02; //init
P2IE = 0X02;
P2IFG = 0X00;
P3DIR = 0XFF;
P3OUT = 0X00;
P4DIR = 0XFd;
P4OUT = 0X02;
P6DIR = 0XFF;
P6OUT = 0X01;
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: 系统初始化
代码编制:
******************************************************************/
void System_Config(void)
{
FLL_CTL0 |= DCOPLUS + XCAP10PF;
SCFI0 |= FN_2; //
SCFQCTL = 30; // (121+1) x 32768 x 2 = 7.99 MHz 8m=121, 4M=60; 2M=30
GPIO_Config(); //IO口初始化
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: 延时函数
代码编制:
******************************************************************/
void Delay_us(uint16_t t)
{
while(t--)
{
}
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: 延时函数
代码编制:
******************************************************************/
void Delay_ms(uint16_t t)
{
uint16_t i;
for(i=0;i<t;i++)
{
Delay_us(1000);
}
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: 延时函数
代码编制:
******************************************************************/
void Delay_1us(unsigned int t)
{
while(t--)
{
// _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
// _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
// _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
}
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI初始化
代码编制:
******************************************************************/
void SPI_Init(void)
{
SSN_1; //SSN置高、关闭与MS1022通讯
SI_0; //默认MS1022数据输入为低
SCK_0; //默认MS1022时钟为低
Delay_1us(2);
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI通讯使能
代码编制:
******************************************************************/
void SPI_ENABLE(void)
{
SSN_0; //SSN置低、开始与MS1022通讯
Delay_1us(2);
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI通讯关闭 0-1-0
代码编制:
******************************************************************/
void SPI_DISABLE(void)
{
SSN_0;
Delay_1us(1);
SSN_1;
Delay_1us(1);
SSN_0;
Delay_1us(1);
SSN_1;
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: 发送位“0”
代码编制:
******************************************************************/
void SEND_0(void)
{
SI_0;
SCK_1;
SCK_0;
//_NOP();
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: 发送位“1”
代码编制:
******************************************************************/
void SEND_1(void)
{
SI_1;
SCK_1;
SCK_0;
//_NOP();
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI写一个字节 8位
代码编制:
******************************************************************/
void SPI_WRITE8(uint8_t wbuf8)
{
uint8_t cnt,MSB8 = 0x80;
//SPI_ENABLE();
SCK_0;
for(cnt = 8;cnt > 0;cnt--)
{
if(wbuf8 & MSB8)
SEND_1();
else
SEND_0();
wbuf8 <<= 1;
}
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI读一个字节 8位
代码编制:
******************************************************************/
uint8_t SPI_READ8(void)
{
uint8_t cnt;
uint8_t LSB8 = 0x01;
uint8_t rbuf8 = 0x00;
for(cnt = 8;cnt > 0;cnt--)
{
rbuf8 <<= 1;
SCK_1;
//_NOP();
if( SO_0_1 )
rbuf8 |= LSB8;
//_NOP();
SCK_0;
//_NOP();
}
return rbuf8;
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI写4个字节 32位
代码编制:
******************************************************************/
void SPI_WRITE32(uint32_t wbuf32)
{
uint8_t cnt;
uint32_t MSB32 = 0x80000000;
for(cnt=32;cnt>0;cnt--)
{
if(wbuf32 & MSB32)
SEND_1();
else
SEND_0();
wbuf32 <<= 1;
}
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI都4个字节,32位
代码编制:
******************************************************************/
uint32_t SPI_READ32(void)
{
uint8_t cnt;
uint32_t LSB32 = 0x00000001;
uint32_t rbuf32 = 0x00000000;
for(cnt=32;cnt>0;cnt--)
{
rbuf32 <<=1;
SCK_1;
//_NOP();
if( SO_0_1 )
rbuf32 |= LSB32;
//_NOP();
SCK_0;
//_NOP();
}
return rbuf32;
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: SPI读2个字节,16位
代码编制:
******************************************************************/
uint16_t SPI_READ16(void)
{
uint8_t cnt;
uint16_t LSB16 = 0x0001;
uint16_t rbuf16 = 0x0000;
for(cnt=16;cnt>0;cnt--)
{
rbuf16 <<=1;
SCK_1;
//_NOP();
if( SO_0_1 )
rbuf16 |= LSB16;
//_NOP();
SCK_0;
//_NOP();
}
return rbuf16;
}
/*****************************************************************
函数名:
入口参数:
参数说明: RegNum 寄存器号:0、1~7;RegData 往寄存器内写的数据
出口参数:
参数说明:
功能: 写寄存器
代码编制:
******************************************************************/
void Write_Reg(uint8_t RegNum,uint32_t RegData)
{
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0x80|RegNum);
SPI_WRITE32(RegData);
SPI_DISABLE();
}
/*****************************************************************
函数名:
入口参数:
参数说明: RegNum 寄存器号 0-7
出口参数:
参数说明:ReadData 寄存器数据
功能: 读寄存器
代码编制:
******************************************************************/
uint32_t Read_Reg(uint8_t RegNum)
{
uint32_t ReadData = 0;
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0xB0|RegNum);
ReadData = SPI_READ32();
SPI_DISABLE();
return ReadData;
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:ReadData PW1ST寄存器数据
功能: 读PW1ST寄存器
代码编制:
******************************************************************/
uint8_t Read_PW1ST(void)
{
uint8_t ReadData = 0;
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0xB8);
ReadData = SPI_READ8();
SPI_DISABLE();
return ReadData;
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:ReadData 寄存器数据
参数说明:
功能: 读寄存器1的高8位
代码编制:
******************************************************************/
uint8_t Read_REG_1(void)
{
uint8_t ReadData = 0;
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(0xB5);
ReadData = SPI_READ8();
SPI_DISABLE();
return ReadData;
}
/*****************************************************************
函数名:
入口参数:Order 命令;Order_Num 命令序号 用作其他程序用(自定义的)
参数说明:
出口参数:
参数说明:
功能: 写命令,如0x02 温度测量
代码编制:
******************************************************************/
void Write_Order(uint8_t Order,uint8_t Order_Num)
{
SPI_Init();
SPI_ENABLE();
SPI_WRITE8(Order);
SPI_DISABLE();
//MS1022_STATE = Order_Num;
}
/*****************************************************************
函数名:
入口参数:
参数说明:
出口参数:
参数说明:
功能: MS1022 6个寄存器初始化
代码编制:
******************************************************************/
void MS1022_Config(void)
{
uint32_t REG0,REG1,REG2,REG3,REG4,REG5,REG6;
REG0=0x03456801;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
MSP430单片机代码:
激光测距.7z
(5.2 MB, 下载次数: 509)
2023-6-5 15:20 上传
点击文件名下载附件
下载积分: 黑币 -5
MS10222资料.pdf
(1.96 MB, 下载次数: 366)
2023-6-5 15:19 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
WINGTECH
时间:
2018-5-17 21:23
请问, 最快采集周期是多少?
作者:
jacobzhg
时间:
2018-7-30 14:25
精度能到多少?
作者:
cgc2003
时间:
2018-12-4 13:49
谢谢分享!
作者:
kk00aa
时间:
2018-12-5 06:50
这颗料看pdf是不错 不知道用起来怎么样
作者:
xinyang666
时间:
2018-12-14 10:20
不错,不知性能如何
作者:
854619267
时间:
2019-1-2 22:02
好用的芯片,便宜实惠!
作者:
梦幻2呱呱
时间:
2019-4-8 16:11
谢谢楼主分享!!!
作者:
li3007liuu
时间:
2019-7-11 15:28
可以接200kHZ探头吗?
作者:
MACwxiang
时间:
2019-8-9 21:56
有没有更纤详细点的资料,急求
作者:
gbf0871
时间:
2019-8-13 13:52
谢谢楼主分享!!!
作者:
鹏博士PBs
时间:
2019-8-13 15:43
看起来应该还是蛮不错的
作者:
鹏博士PBs
时间:
2019-8-13 15:52
应该还是蛮不错的哈
作者:
鹏博士PBs
时间:
2019-8-13 16:22
感谢楼主分享哦
作者:
lanlanzhilian
时间:
2019-12-12 15:45
这是个好资料,
作者:
lanlanzhilian
时间:
2019-12-12 15:46
这是个好资料,
作者:
oceanx
时间:
2019-12-15 15:36
学习了,谢谢楼主!
作者:
zjc31415926
时间:
2020-1-2 15:10
第一个主是PDF啊
作者:
kky_123
时间:
2020-4-22 13:22
谢谢分享
作者:
markbob123
时间:
2020-6-2 13:26
支持楼主,支持楼主,厉害厉害
作者:
Macro_Chan
时间:
2020-11-8 23:08
精度还是比较唏嘘,一般用途还是够的。
作者:
shaobobox
时间:
2020-11-26 16:07
楼主又带电路又带算法,一定要点赞
作者:
bncnqp
时间:
2020-12-25 21:59
精度能达到多少?
作者:
netzhang
时间:
2021-3-22 09:26
不知道这颗料用的效果如何,用过的人来反馈一下
作者:
bwxz
时间:
2021-11-5 17:00
所以实测精度能达到多少?假如我测一个1ms的间距
作者:
JON0115
时间:
2021-12-29 17:25
这颗料看pdf是不错 不知道用起来怎么样
作者:
zhangfei
时间:
2022-10-22 15:25
正好用到,下來研究下,謝樓主分享!
作者:
liixaofei5
时间:
2023-8-19 10:47
感谢分享,不过程序在我这里还是得不到我需要的结果。最终还是按照官网的手册解决问题,目前信号源测量能到10ns了,信号源给出最小脉宽了。
作者:
angeloliou
时间:
2024-10-25 11:34
謝謝分享,不知道測距效果好不好。
作者:
ledjer
时间:
2025-7-4 16:16
各位大佬请教一下,按照程序配置,使用逻辑分析仪可以正常抓取单片机发送MS1022芯片SPI通信数据,但是没有MS1022回复的波形数据,是什么问题?
作者:
ledjer
时间:
2025-7-4 16:20
请教各位大佬,按照程序配置完成,使用逻辑分析仪可以正常抓取单片机给MS1022芯片发送的SPI数据,但是MS1022回复总线MSIO没有任何波形数据,测试指令是读取ID,是什么问题?而且MS1022芯片SPI通信使用的是四种模式中的哪一种?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1