本文介紹基于STM32F407的KS103超聲波模塊的使用,包含使用注意事項(xiàng)以及代碼配置,同時(shí)會附上本人在開發(fā)時(shí)遇到的問題以及解決方法。
KS103模塊使用串口/IIC接口與主機(jī)通信,自動(dòng)響應(yīng)主機(jī)的iic/串口控制指令。
包含溫度補(bǔ)償?shù)木嚯x探測,同時(shí)可以在1ms內(nèi)檢測光強(qiáng)。
探測范圍 1cm~800cm及 1cm~1000cm(10 米)
5s 未收到 I2C 控制指令自動(dòng)進(jìn)入 uA 級休眠,并可隨時(shí)被主機(jī) I2C 控制指令喚醒
TTL串口模式
在 KS103 上連線引腳上標(biāo)識有:VCC、SDA/TX、SCL/RX、GND 及 MODE。模塊在上電之前,MODE 需要接 0V 地,上電后模塊將工作于 TTL 串口模式。如果KS103在上電后再將 MODE 引腳接 0V 地,模塊將仍然工作于 I2C 模式。因此,TTL 串口模式時(shí)需要 5 根線來控制,其中 VCC 用于連接+5V(3.0~5.5V 范圍均可)電源(1),GND用于連接電源地,SDA/TX 連接 MCU 或 USB 轉(zhuǎn) TTL 模塊的 RXD,SCL/RX 引腳連接 MCU 或USB 轉(zhuǎn) TTL 模塊的 TXD 。
在使用時(shí)最好使用5V標(biāo)準(zhǔn)電壓,電壓低會影響量程。
新到手的模塊默認(rèn)串口地址是0xE8,可修改。
這里本人被坑了,因?yàn)槲业绞值哪K是別人用過的,被修改了地址但是不和我說,就是調(diào)試不出來。
當(dāng)然也是我偷懶了,模塊在上電的時(shí)候背面的LED會閃爍,告訴用戶自身的地址,我沒在意。上電后快閃兩下是代表二進(jìn)制的“1”,慢閃一下代表“0”,一共八位,盯著記錄就能獲得其地址。
串口模式很占用串口資源,我并沒有使用該模式進(jìn)行開發(fā),僅僅使用了官方的上位機(jī)進(jìn)行測試,鑒定模組的好壞。
確認(rèn)模組沒問題,選用IIC接口進(jìn)行開發(fā),這樣一條總線可以掛載多個(gè)模塊,只需要總線尋址便可。
I2C 模式
在使用iic模式時(shí),硬件需要注意幾點(diǎn):
SCL 及 SDA 線均需要由主機(jī)接一個(gè) 4.7K(阻值 1~10K 均可)電阻到 VCC ;I2C 通信速率建議不要高于 100kbit/s (因?yàn)槟K的iic最大速率只有100K)。
直接從代碼開始:
因?yàn)閷λ俣纫蟛桓撸覟榱艘浦卜奖?,采用軟?a href="http://www.delux-kingway.cn/analog/" target="_blank">模擬iic。其實(shí)為了偷懶,模擬簡單呀。
老規(guī)矩,初始化iic。
void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB時(shí)鐘 //GPIOB8,B9初始化設(shè)置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化 IIC_SCL=1; IIC_SDA=1; }
寫iic控制函數(shù),老掉牙的東西,全網(wǎng)都有。
//產(chǎn)生IIC起始信號 void IIC_Start(void){ SDA_OUT(); //sda線輸出 IIC_SDA=1; IIC_SCL=1; delay_us(10); IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(10); IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) } //產(chǎn)生IIC停止信號 void IIC_Stop(void){ SDA_OUT();//sda線輸出 IIC_SCL=0; IIC_SDA=0;//STOP:when CLK is high DATA change form low to high delay_us(10); IIC_SCL=1; IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號 delay_us(10); } //等待應(yīng)答信號到來 //返回值:1,接收應(yīng)答失敗 // 0,接收應(yīng)答成功 u8 IIC_Wait_Ack(void){ u8 ucErrTime=0; SDA_IN(); //SDA設(shè)置為輸入 IIC_SDA=1;delay_us(6); IIC_SCL=1;delay_us(6); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } IIC_SCL=0;//時(shí)鐘輸出0 return 0; } //產(chǎn)生ACK應(yīng)答 void IIC_Ack(void){ IIC_SCL=0; SDA_OUT(); IIC_SDA=0; delay_us(10); IIC_SCL=1; delay_us(10); IIC_SCL=0; } //不產(chǎn)生ACK應(yīng)答 void IIC_NAck(void){ IIC_SCL=0; SDA_OUT(); IIC_SDA=1; delay_us(10); IIC_SCL=1; delay_us(10); IIC_SCL=0; } //IIC發(fā)送一個(gè)字節(jié) //返回從機(jī)有無應(yīng)答 //1,有應(yīng)答 //0,無應(yīng)答 void IIC_Send_Byte(u8 txd){ u8 t; SDA_OUT(); IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸 for(t=0;t<8;t++) { IIC_SDA=(txd&0x80)>>7; txd<<=1; delay_us(10); //對TEA5767這三個(gè)延時(shí)都是必須的 IIC_SCL=1; delay_us(10); IIC_SCL=0; delay_us(10); } } //讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK u8 IIC_Read_Byte(unsigned char ack){ unsigned char i,receive=0; SDA_IN();//SDA設(shè)置為輸入 for(i=0;i<8;i++ ) { IIC_SCL=0; delay_us(10); IIC_SCL=1; receive<<=1; if(READ_SDA)receive++; delay_us(5); } if (!ack) IIC_NAck();//發(fā)送nACK else IIC_Ack(); //發(fā)送ACK return receive; }
寫KS103的控制函數(shù)
u8 KS103_ReadOneByte(u8 address, u8 reg) { u8 temp=0; IIC_Start(); IIC_Send_Byte(address); //發(fā)送低地址 IIC_Wait_Ack(); IIC_Send_Byte(reg); //發(fā)送低地址 IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(address + 1); //進(jìn)入接收模式 IIC_Wait_Ack(); delay_us(50); //增加此代碼通信成功?。?! temp=IIC_Read_Byte(0); //讀寄存器3 IIC_Stop();//產(chǎn)生一個(gè)停止條件 return temp; } void KS103_WriteOneByte(u8 address,u8 reg,u8 command) { IIC_Start(); IIC_Send_Byte(address); //發(fā)送寫命令 IIC_Wait_Ack(); IIC_Send_Byte(reg);//發(fā)送高地址 IIC_Wait_Ack(); IIC_Send_Byte(command); //發(fā)送低地址 IIC_Wait_Ack(); IIC_Stop();//產(chǎn)生一個(gè)停止條件 }
這里依照了模塊的指令發(fā)送流程:
探測指令從 0x01 到 0x2f,數(shù)值越大,信號增益越大。
獲取距離數(shù)據(jù)
KS103_WriteOneByte(0XD2,0X02,0XB0); delay_ms(100); range1 = KS103_ReadOneByte(0xD2, 0x02); range2 = KS103_ReadOneByte(0xD2, 0x03);
每一幀的探測指令格式為:
KS103_WriteOneByte(0XD2,0X02,0XB0);中,0xd2為模塊的地址,02為寄存器地址,0xB0為控制命令。
在發(fā)送探測指令后需要等待一段時(shí)間才可通過iic總線獲取數(shù)據(jù),過早的查詢總線會獲得0XFF。在讀取總線數(shù)據(jù)時(shí)除了需要發(fā)送模塊iic的地址,還需要將模塊iic的地址加1,而且在之后必須要等待,才能獲取完整的數(shù)據(jù)。因?yàn)榉祷氐氖?6位數(shù)據(jù),所以這里我采用執(zhí)行兩次KS103_ReadOneByte()函數(shù)。
在這些都處理完之后我將采集到的數(shù)據(jù)輸出到串口,發(fā)現(xiàn)并不能成功,range1和range2的值并不變。最后發(fā)現(xiàn)我是用的是0xBC探測指令,最大耗時(shí)87MS,而我只延時(shí)50ms。通過修改探測指令和延時(shí)時(shí)間均可解決問題。
編輯:jq
-
超聲波測距
+關(guān)注
關(guān)注
5文章
246瀏覽量
38028 -
STM32F407
+關(guān)注
關(guān)注
15文章
188瀏覽量
29669 -
KS103
+關(guān)注
關(guān)注
3文章
2瀏覽量
7960
原文標(biāo)題:STM32F407+KS103超聲波模塊測距
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
【CW32模塊使用】US-016超聲波測距傳感器
![【CW32<b class='flag-5'>模塊</b>使用】US-016<b class='flag-5'>超聲波</b><b class='flag-5'>測距</b>傳感器](https://file1.elecfans.com//web3/M00/00/44/wKgZPGdH602AfIZLAAAuAFA24Bs131.jpg)
RK3568教學(xué)實(shí)驗(yàn)箱_操作案例:5-19 超聲波測距實(shí)驗(yàn)
超聲波和次聲波的頻率范圍和應(yīng)用
STM32最小系統(tǒng)板與ESP01S接入機(jī)智云教程
![<b class='flag-5'>STM32</b>最小系統(tǒng)板與ESP01S接入機(jī)智云教程](https://file.elecfans.com/web2/M00/40/03/pYYBAGJrSWqAb-nSAAAXmKtCFeo833.jpg)
PGA460超聲波模塊硬件和軟件優(yōu)化
![PGA460<b class='flag-5'>超聲波模塊</b>硬件和軟件優(yōu)化](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
第16章-超聲波跟隨功能 基于STM32的三路超聲波自動(dòng)跟隨小車 畢業(yè)設(shè)計(jì) 課程設(shè)計(jì)
![第16章-<b class='flag-5'>超聲波</b>跟隨功能 基于<b class='flag-5'>STM32</b>的三路<b class='flag-5'>超聲波</b>自動(dòng)跟隨小車 畢業(yè)設(shè)計(jì) 課程設(shè)計(jì)](https://file1.elecfans.com/web2/M00/02/F2/wKgZoma-03mAHxTrAADsArOm4Gg838.png)
AFE5812超聲波模擬前端數(shù)據(jù)表
![AFE5812<b class='flag-5'>超聲波模</b>擬前端數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
AFE5818 16通道超聲波模擬前端數(shù)據(jù)表
![AFE5818 16通道<b class='flag-5'>超聲波模</b>擬前端數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論