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