【實驗目的】
學習STM32的M0系列芯片的使用
學習MDK開發軟件的使用方法,如仿真調試
通過本實驗掌握stm32F0xx的ADC使用方法
【實驗環境】
Wi-Fi超聲波測距傳感器模塊
MDK開發工具和相應的仿真器
PC機 XP、Window7/8
【實驗內容】:
編寫超聲波實驗程序,實現STM32F0xx芯片采集到超聲波測距長度的AD值,并把AD值通過串口Wi-Fi模塊(STA)傳輸給服務端Wi-Fi模塊(AP),在PC上的串口調試助手顯示數據。
【實驗原理】
聲波是一種能在氣體、液體和固體中傳播的機械波。根據振動頻率的不同,可分為次聲波、聲波、超聲波和微波等。
( 1 ) 次聲波:振動頻率低于l6Hz的機械波。
( 2 ) 聲波:振動頻率在16—20KHz之間的機械波,在這個頻率范圍內能為人耳所聞。
( 3 ) 超聲波:高于20KHz的機械波。
超聲波與一般聲波比較,它的振動頻率高,而且波長短,因而具有束射特性,方向性強,可以定向傳播,其能量遠遠大于振幅相同的一般聲波,并且具有很高的穿透能力。例如,在鋼材中甚至可穿透10米以上。超聲波在均勻介質中按直線方向傳播,但到達界面或者遇到另一種介質時,也像光波一樣產生反射和折射,并且服從幾何光學的反射、折射定律。超聲波在反射、折射過程中,其能量及波型都將發生變化。超聲波在界面上的反射能量與透射能量的變化。取決于兩種介質聲阻抗特性。和其他聲波一樣,兩介質的聲阻抗特性差愈大,則反射波的強度愈大。例如,鋼與空氣的聲阻抗特性相差10萬倍,故超聲波幾乎不通過空氣與鋼的介面,全部反射。超聲波在介質中傳播時,隨著傳播距離的增加,能量逐漸衰減,能量的衰減決定于波的擴散、散射(或漫射)及吸收。擴散衰減,是超聲波隨著傳播距離的增加,在單位面積內聲能的減弱;散射衰減,是由于介質不均勻性產生的能量損失;超聲波被介質吸收后,將聲能直接轉換為熱能,這是由于介質的導熱性、粘滯性及彈性造成的。
超聲波傳感器的測距原理:超聲波發射器向某一方向發射超聲波,在發射時刻的同時開始 計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。設超聲波在空氣中的傳播速度為340m/s,根據計時器記錄的時間t,就可以計算出發射點距障礙物的距離S ,即 S=340t/2。需要說明的是,超聲波傳感器發射的波束比較窄(<10°),反射后仍然很窄,如果被測物體被旋轉放置,有可能反射波束會偏離出接收探頭的位置,導致探頭接收不到反射波信號,測距將失敗。
第 2 章 圖 超聲波傳感器測量物體距離原理示意圖
超聲波測距傳感器包括有發射超聲波和接收超聲波的兩部分裝置,習慣上稱為超聲波換能器或超聲波探頭。常用的超聲波傳感器有兩種,即壓電式超聲波傳感器和磁致式超聲波傳感器。本實驗采用的是壓電式超聲波傳感器, 主要由超聲波發射器(或稱發射探頭)和超聲波接收器(或稱接收探頭)兩部分組成,它們都是利用壓電材料(如石英、壓電陶瓷等)的壓電效應進行工作的。利用逆壓電效應將高頻電振動轉換成高頻機械振動,產生超聲波,以此作為超聲波的發射器。而利用正壓電效應將接收的超聲振動波轉換成電信號,以此作為超聲波的接收器。
HCC--SSRR0044超聲波測距模塊可提供2cm--400cm的非接觸式距離感測功能,測距精度可達高到3mm;模塊包括超聲波發射器、接收器與控制電路。
HC--SR04的時序圖:
以上時序圖表明你只需要提供一個10uS以上脈沖觸發信號,該模塊內部將發出8個40kHz周期電平并檢測回波。一旦檢測到有回波信號則輸出回響信號;仨懶盘柕拿}沖寬度與所測的距離成正比。由此通過發射信號到收到的回響信號時間間隔可以計算得到距離。公式:uS/58=厘米或者uS/148=英寸;或是:距離= 高電平時間*聲速(340M/S)/2;建議測量周期為60ms以上,以防止發射信號對回響信號的影響。
基本工作原理:
采用IO口TRIG觸發測距,給少10us的高電平信呈;
模塊自動發送8個40khz的方波,自動檢測是否有信號返回;
有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲;
波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2;
圖 超聲波原理圖
圖 超聲波實物圖
有原理圖可知,超聲波的觸發引腳和PB_9相連,回響信號與PB_8引腳相連;仨懶盘柺浅暡òl出波與接收到回波的時間。
【實驗步驟】
完成第3章節"RealView MDK4.22a集成開發環境",就可以做傳感器實驗了,首先打開光盤中的傳感器工程文件。
右鍵解壓程序源碼 v1.rar, 選擇解壓到當前文件夾。
工程源碼路徑:華清遠見-網絡拓撲圖資料光盤\無線傳感模塊\低功耗Wi-Fi部分-STM32F051\程序源碼\STM23F051 超聲波測距傳感器(OK)\MDK-ARM
編譯下載超聲波程序(先編譯后下載)
如果需要調試的話,應先下載程序,再點擊右上方的調試按鈕進入調試界面。
超聲波模塊連接
上圖連接說明,AP模式的Wi-Fi是通過串口直接和PC機相連接。串口Wi-Fi接收到數據,以串口的形式輸出到PC的串口調試助手上顯示。
【實驗結果】
利用串口調試工具做實驗,打開串口調試工具,波特率115200、串口號(你的電腦的端口號)、點擊打開。 接收到的數據如下,
可以通過串口發送21 57 04 00 53 00 02 C0 00 00 38 FA控制繼電器的開。
21 51: 為字符'!W'
04 00 :設備地址 注意:04為低八位地址,00為高八位地址
53 :設備類型 'S' ,是超聲波傳感器
00 02 C0: 采集到的超聲波與障礙之間的距離(單位:mm)。02 為高八位,C0 第八位。轉成十進制704 mm
38:當前電池電量
FA :校驗和。
【實驗參考代碼】
Main.c函數
COBOL Code
int main(void)
{
uint8_t Send_buf[11]={0};
uint8_t result = 0,i;
uint8_t flag = 0;
uint32_t distance;
SystemInit(); //系統時鐘初始化
/* Configure LED6 */
STM_EVAL_LEDInit(LED6);
Systick_Init(); //滴答定時初始化
GPIO_Configuration_Init();
USART_Cfig_Init(); //串口初始化
NVIC_Configuration();
SR04_Config();
USART_RX_IntteruptEnable(COM1); //USART1 接收中斷使能
USART_RX_IntteruptEnable(COM2); //USART2 接收中斷使能
//初始化定時器
TIM_INT_Config();
//初始化中斷
// STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI);
Send_buf[0] = 0x21;
Send_buf[1] = 'W';
Send_buf[2] = 0x04; //地址 低字節
Send_buf[3] = 0x00; //地址 高字節
Send_buf[4] = 'S';
while(1)
{
STM_EVAL_LEDOn(LED6);
distance = Sensor_using();
Send_buf[6] = distance >> 8;
Send_buf[7] = distance;
for(i=0;i<(11-2);i++)
{
result ^= Send_buf[i+1];
}
Send_buf[10] = result; //存儲校驗結果
UART_Send(USART2,Send_buf,11);
result = 0;
STM_EVAL_LEDOff(LED6);
printf("distance :%d\n",distance);
Delay(1000);
}
}
采集回響時間并轉換成距離(單位mm)
COBOL Code
/*返回值 單位 毫米*/
uint32_t Sensor_using(void)
{
uint32_t distanceval =0;
uint16_t TIM=0,TIMS=0;
uint8_t i,j=0;
// for(i=0;i<5;i++)
// {
GPIO_SetBits(GPIOB,GPIO_Pin_9); //輸出10us以上觸發
delay_us(100);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
TIM_SetCounter(TIM2,0);
while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)&& overflow==0); //檢測到高電平
TIM_Cmd(TIM2, ENABLE); //開啟定時器
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) && overflow==0); //檢測到低電平
TIM_Cmd(TIM2, DISABLE);
if(overflow!=0)
{
overflow=0;
return 0.0;
}
TIM = TIM_GetCounter(TIM2); //讀取當前值
distanceval = ((TIM *340)/2/10) - 50; //50 誤差數值
//printf("\r\ndistance:%x mm\r\n",distanceval);
return(distanceval);
}