標題:
STM32之TIM2收發(fā)四路超聲波(寄存器版)
[打印本頁]
作者:
東方南明
時間:
2017-11-17 12:06
標題:
STM32之TIM2收發(fā)四路超聲波(寄存器版)
如題,采用定時器2控制。不喜勿噴。
單片機源程序如下:
#include "timer.h"
/**************************************************************************
函數(shù)功能:定時器3通道3輸入捕獲初始化
入口參數(shù):入口參數(shù):arr:自動重裝值 psc:時鐘預分頻數(shù)
返回 值:無
**************************************************************************/
void TIM2_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2時鐘使能
RCC->APB2ENR|=1<<2; //使能PORTB時鐘
GPIOA->CRL&=0X00000000;
GPIOA->CRL|=0X22228888;
TIM2->ARR=arr; //設定計數(shù)器自動重裝值
TIM2->PSC=psc; //預分頻器
TIM2->CCMR1|=1<<0; //選擇輸入端 1通道配置為輸入
TIM2->CCMR1|=0<<4; //配置輸入濾波器 不濾波
TIM2->CCMR1|=0<<2; //配置輸入分頻,不分頻
TIM2->CCER|=1<<0; //允許捕獲計數(shù)器的值到捕獲寄存器中
TIM2->CCER|=0<<1; //上升沿捕獲
TIM2->DIER|=1<<1; //允許捕獲中斷
TIM2->CCMR1|=1<<8; //選擇輸入端 2通道配置為輸入
TIM2->CCMR1|=0<<12; //配置輸入濾波器 不濾波
TIM2->CCMR1|=0<<10; //配置輸入分頻,不分頻
TIM2->CCER|=1<<4; //允許捕獲計數(shù)器的值到捕獲寄存器中
TIM2->CCER|=0<<5; //上升沿捕獲
TIM2->DIER|=1<<2; //允許捕獲中斷
TIM2->CCMR2|=1<<0; //選擇輸入端 3通道配置為輸入
TIM2->CCMR2|=0<<4; //配置輸入濾波器 不濾波
TIM2->CCMR2|=0<<2; //配置輸入分頻,不分頻
TIM2->CCER|=1<<8; //允許捕獲計數(shù)器的值到捕獲寄存器中
TIM2->CCER|=0<<9; //上升沿捕獲
TIM2->DIER|=1<<3; //允許捕獲中斷
TIM2->CCMR2|=1<<8; //0選擇輸入端 4通道配置為輸入
TIM2->CCMR2|=0<<12; //4配置輸入濾波器 不濾波
TIM2->CCMR2|=0<<10; //2配置輸入分頻,不分頻
TIM2->CCER|=1<<12; //允許捕獲計數(shù)器的值到捕獲寄存器
TIM2->CCER|=0<<13; //CH4上升沿捕獲
TIM2->DIER|=1<<4; //允許捕獲中斷
TIM2->DIER|=1<<0; //允許更新中斷
TIM2->CR1|=0x01; //使能定時器3
MY_NVIC_Init(1,3,TIM2_IRQn,1);
}
/**************************************************************************
函數(shù)功能:超聲波接收回波函數(shù)
入口參數(shù):無
返回 值:無
**************************************************************************/
u16 TIM2CH1_CAPTURE_STA,TIM2CH1_CAPTURE_VAL;
void ReadT2C1_Distane(void)
{
PAout(4)=1;
delay_us(15);
PAout(4)=0;
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
{
DisT2C1=TIM2CH1_CAPTURE_STA&0X3F;
DisT2C1*=65536; //溢出時間總和
DisT2C1+=TIM2CH1_CAPTURE_VAL; //得到總的高電平時間
DisT2C1=DisT2C1*170/1000;
printf("DIST2C1:%d\n",DisT2C1);
TIM2CH1_CAPTURE_STA=0; //開啟下一次捕獲
}
}
u16 TIM2CH2_CAPTURE_STA,TIM2CH2_CAPTURE_VAL;
void ReadT2C2_Distane(void)
{
PAout(5)=1;
delay_us(15);
PAout(5)=0;
if(TIM2CH2_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
{
DisT2C2=TIM2CH2_CAPTURE_STA&0X3F;
DisT2C2*=65536; //溢出時間總和
DisT2C2+=TIM2CH2_CAPTURE_VAL; //得到總的高電平時間
DisT2C2=DisT2C2*170/1000;
printf("DIST2C2:%d\n",DisT2C2);
TIM2CH2_CAPTURE_STA=0; //開啟下一次捕獲
}
}
u16 TIM2CH3_CAPTURE_STA,TIM2CH3_CAPTURE_VAL;
void ReadT2C3_Distane(void)
{
PAout(6)=1;
delay_us(15);
PAout(6)=0;
if(TIM2CH3_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
{
DisT2C3=TIM2CH3_CAPTURE_STA&0X3F;
DisT2C3*=65536; //溢出時間總和
DisT2C3+=TIM2CH3_CAPTURE_VAL; //得到總的高電平時間
DisT2C3=DisT2C3*170/1000;
printf("DIST2C3:%d\n",DisT2C3);
TIM2CH3_CAPTURE_STA=0; //開啟下一次捕獲
}
}
u16 TIM2CH4_CAPTURE_STA,TIM2CH4_CAPTURE_VAL;
void ReadT2C4_Distane(void)
{
PAout(7)=1;
delay_us(15);
PAout(7)=0;
if(TIM2CH4_CAPTURE_STA&0X80)//成功捕獲到了一次高電平
{
DisT2C4=TIM2CH4_CAPTURE_STA&0X3F;
DisT2C4*=65536; //溢出時間總和
DisT2C4+=TIM2CH4_CAPTURE_VAL; //得到總的高電平時間
DisT2C4=DisT2C4*170/1000;
printf("DIST2C4:%d\n",DisT2C4);
TIM2CH4_CAPTURE_STA=0; //開啟下一次捕獲
}
}
/**************************************************************************
函數(shù)功能:超聲波回波脈寬讀取中斷
入口參數(shù):無
返回 值:無
作 者:平衡小車之家
**************************************************************************/
void TIM2_IRQHandler(void)
{
u16 tsr;
tsr=TIM2->SR;
/*******************************************************************
********************************************************************/
if((TIM2CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲
{
if(tsr&0X01)//溢出
{
if(TIM2CH1_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
{
TIM2CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}else TIM2CH1_CAPTURE_STA++;
}
}
if(tsr&0x02)//捕獲1發(fā)生捕獲事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM2CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬
TIM2CH1_CAPTURE_VAL=TIM2->CCR1; //獲取當前的捕獲值.
TIM2->CCER&=~(1<<1); //CC1P=0 設置為上升沿捕獲
}else //還未開始,第一次捕獲上升沿
{
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM2CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
TIM2->CNT=0; //計數(shù)器清空
TIM2->CCER|=1<<1; //CC1P=1 設置為下降沿捕獲
}
}
}
/*************************************************************************/
/*************************************************************************/
if((TIM2CH2_CAPTURE_STA&0X80)==0)//還未成功捕獲
{
if(tsr&0X01)//溢出
{
if(TIM2CH2_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
{
if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
{
TIM2CH2_CAPTURE_STA|=0X80;//標記成功捕獲了一次
TIM2CH2_CAPTURE_VAL=0XFFFF;
}else TIM2CH2_CAPTURE_STA++;
}
}
if(tsr&0x04)//捕獲2發(fā)生捕獲事件
{
if(TIM2CH2_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM2CH2_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬
TIM2CH2_CAPTURE_VAL=TIM2->CCR2; //獲取當前的捕獲值.
TIM2->CCER&=~(1<<5); //CC1P=0 設置為上升沿捕獲
}else //還未開始,第一次捕獲上升沿
{
TIM2CH2_CAPTURE_STA=0; //清空
TIM2CH2_CAPTURE_VAL=0;
TIM2CH2_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
TIM2->CNT=0; //計數(shù)器清空
TIM2->CCER|=1<<5; //CC1P=1 設置為下降沿捕獲
}
}
}
/***************************************************************************************
****************************************************************************************/
if((TIM2CH3_CAPTURE_STA&0X80)==0)//還未成功捕獲
{
if(tsr&0X01)//溢出
{
if(TIM2CH3_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
{
if((TIM2CH3_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
{
TIM2CH3_CAPTURE_STA|=0X80;//標記成功捕獲了一次
TIM2CH3_CAPTURE_VAL=0XFFFF;
}else TIM2CH3_CAPTURE_STA++;
}
}
if(tsr&0x08)//捕獲1發(fā)生捕獲事件
{
if(TIM2CH3_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM2CH3_CAPTURE_STA|=0X80; //標記成功捕獲到一次高電平脈寬
TIM2CH3_CAPTURE_VAL=TIM2->CCR3; //獲取當前的捕獲值.
TIM2->CCER&=~(1<<9); //CC1P=0 設置為上升沿捕獲
}else //還未開始,第一次捕獲上升沿
{
TIM2CH3_CAPTURE_STA=0; //清空
TIM2CH3_CAPTURE_VAL=0;
TIM2CH3_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
TIM2->CNT=0; //計數(shù)器清空
TIM2->CCER|=1<<9; //CC1P=1 設置為下降沿捕獲
}
}
}
/***************************************************************************
****************************************************************************/
if((TIM2CH4_CAPTURE_STA&0X80)==0)//還未成功捕獲
{
if(tsr&0X01)//溢出
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
USART_TIM2.rar
(110.91 KB, 下載次數(shù): 42)
2017-11-17 20:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
szyinbo
時間:
2019-4-9 08:30
你好,你這程序超聲波引腳沒有定義?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1