1. 程式人生 > >STM32的超聲波測距程式

STM32的超聲波測距程式


/*設定中斷優先順序*/
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructer;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructer.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructer.NVIC_IRQChannel=TIM2_IRQn;
NVIC_InitStructer.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructer);
}

/*初始化模組的GPIO以及初始化定時器TIM2*/
void CH_SR04_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructer;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/*TRIG觸發訊號*/
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOB, &GPIO_InitStructer);

/*ECOH迴響訊號*/
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_9;
GPIO_Init(GPIOB, & GPIO_InitStructer);

/*定時器TIM2初始化*/
TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period=999;//定時週期為1000
TIM_TimeBaseInitStructer.TIM_Prescaler=71; //分頻係數72
TIM_TimeBaseInitStructer.TIM_ClockDivision=TIM_CKD_DIV1;//不分頻
TIM_TimeBaseInitStructer.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//開啟更新中斷
NVIC_Config();
TIM_Cmd(TIM2,DISABLE);//關閉定時器使能

}



float Senor_Using(void)
{
float length=0,sum=0;
u16 tim;
uint i=0;
/*測5次資料計算一次平均值*/
while(i!=5)
{
PBout(8)=1; //拉高訊號,作為觸發訊號
delay_us(20); //高電平訊號超過10us
PBout(8)=0;
/*等待迴響訊號*/
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==RESET);
TIM_Cmd(TIM2,ENABLE);//迴響訊號到來,開啟定時器計數

i+=1;//每收到一次迴響訊號+1,收到5次就計算均值
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==SET);//迴響訊號消失
TIM_Cmd(TIM2,DISABLE);//關閉定時器

tim=TIM_GetCounter(TIM2);//獲取計TIM2數暫存器中的計數值,一邊計算迴響訊號時間

length=(tim+overcount*1000)/58.0;//通過迴響訊號計算距離

sum=length+sum;
TIM2->CNT=0; //將TIM2計數暫存器的計數值清零
overcount=0; //中斷溢位次數清零
delay_ms(100);
}
length=sum/5;
return length;//距離作為函式返回值
}



void TIM2_IRQHandler(void)//中斷,當迴響訊號很長是,計數值溢位後重復計數,用中斷來儲存溢位次數
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
  {
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除中斷標誌
overcount++;

  }
}

2017年6月9日
這篇文章已經很久了,很多同學問了問題,我沒有來得及回,是在抱歉。上面的程式碼是超聲波測距的程式碼,cs.h是標頭檔案,內容如下: