|
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
|
|