如題,采用定時器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
|