天天看點

stm32超音波掃頻_求解 stm32 超音波測距 沒出資料

[C] 純文字檢視 複制代碼// USART3_TX PB10 發送

// USART3_RX PB1 接受

#include "usart_csb.h"

u16 msHcCount = 0;

//序列槽和GPIO初始化

void Hcsr04Init(void)

{

GPIO_InitTypeDef GPIO_Inittest;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInittest;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

// IO初始化

GPIO_Inittest.GPIO_Pin = GPIO_Pin_10; //發送電平引腳

GPIO_Inittest.GPIO_OType = GPIO_OType_PP; //推挽輸出

GPIO_Inittest.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_Inittest);

GPIO_ResetBits(GPIOB,GPIO_Pin_10);

GPIO_Inittest.GPIO_Pin = GPIO_Pin_11; //傳回電平引腳

GPIO_Inittest.GPIO_PuPd = GPIO_PuPd_NOPULL; //浮空輸入

GPIO_Init(GPIOB,&GPIO_Inittest);

GPIO_ResetBits(GPIOB,GPIO_Pin_11);

//定時器TIM2初始化

TIM_DeInit(TIM2);

TIM_TimeBaseInittest.TIM_Period=999;//定時周期為1000

TIM_TimeBaseInittest.TIM_Prescaler=71; //分頻系數72

TIM_TimeBaseInittest.TIM_ClockDivision=TIM_CKD_DIV1;//不分頻

TIM_TimeBaseInittest.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInittest);

TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除更新中斷

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //打開定時器更新中斷

hcsr04_NVIC();

TIM_Cmd(TIM2,DISABLE);//關閉定時器使能

}

//設定中斷優先級

void hcsr04_NVIC(void)

{

NVIC_InitTypeDef NVIC_Inittest;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_Inittest.NVIC_IRQChannelPreemptionPriority=0;

NVIC_Inittest.NVIC_IRQChannelSubPriority=0;

NVIC_Inittest.NVIC_IRQChannel=TIM2_IRQn;

NVIC_Inittest.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_Inittest);

}

//中斷

void TIM2_IRQHandler(void)

//中斷,當回響信号很長是,計數值溢出後重複計數,用中斷來儲存溢出次數

{

if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)

{

TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中斷标志overcount++;

}

}

//擷取定時器時間

int GetEchoTimer(void)

{

int t = 0;

t = msHcCount * 1000; //得到MS

t += TIM_GetCounter(TIM2); //得到

TIM2 -> CNT = 0; //将TIM2計數寄存器的計數值清零

delay_ms(50);

return t;

}

//得五次平均值

float Hcsr04GetLength(void)

{

u32 t = 0;

int i = 0;

float lengthTemp = 0;

float sum = 0;

while(i != 5)

{

TRIG_Send = 1; //發送口高電平輸出

delay_us(20);

TRIG_Send = 0;

while (ECHO_Reci == 0); //等待接收口高電平輸出

TIM_Cmd(TIM2,ENABLE); //打開定時器

i = i + 1;

while (ECHO_Reci == 1);

TIM_Cmd(TIM2,DISABLE); //關閉定時器

t = GetEchoTimer(); //擷取時間,分辨率為1US

lengthTemp =((float )t / 58.0); //厘米

sum = lengthTemp + sum;

}

lengthTemp = sum / 5.0;

return lengthTemp;

}