如题,采用定时器2控制。不喜勿喷。
单片机源程序如下:
- #include "timer.h"
- /**************************************************************************
- 函数功能:定时器3通道3输入捕获初始化
- 入口参数:入口参数:arr:自动重装值 psc:时钟预分频数
- 返回 值:无
- **************************************************************************/
- 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; //设定计数器自动重装值
- TIM2->PSC=psc; //预分频器
-
- TIM2->CCMR1|=1<<0; //选择输入端 1通道配置为输入
- TIM2->CCMR1|=0<<4; //配置输入滤波器 不滤波
- TIM2->CCMR1|=0<<2; //配置输入分频,不分频
- TIM2->CCER|=1<<0; //允许捕获计数器的值到捕获寄存器中
- 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; //允许捕获计数器的值到捕获寄存器中
- 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; //允许捕获计数器的值到捕获寄存器中
- 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; //允许捕获计数器的值到捕获寄存器
- 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);
- }
- /**************************************************************************
- 函数功能:超声波接收回波函数
- 入口参数:无
- 返回 值:无
- **************************************************************************/
- 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; //开启下一次捕获
- }
- }
- /**************************************************************************
- 函数功能:超声波回波脉宽读取中断
- 入口参数:无
- 返回 值:无
- 作 者:平衡小车之家
- **************************************************************************/
- void TIM2_IRQHandler(void)
- {
- u16 tsr;
- tsr=TIM2->SR;
-
- /*******************************************************************
-
- ********************************************************************/
- if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
- {
- if(tsr&0X01)//溢出
- {
- if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
- {
- if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
- {
- TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
- TIM2CH1_CAPTURE_VAL=0XFFFF;
- }else TIM2CH1_CAPTURE_STA++;
- }
- }
- if(tsr&0x02)//捕获1发生捕获事件
- {
- 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; //计数器清空
- TIM2->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
- }
- }
- }
-
- /*************************************************************************/
-
- /*************************************************************************/
- if((TIM2CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
- {
- if(tsr&0X01)//溢出
- {
- if(TIM2CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
- {
- if((TIM2CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
- {
- TIM2CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
- TIM2CH2_CAPTURE_VAL=0XFFFF;
- }else TIM2CH2_CAPTURE_STA++;
- }
- }
- if(tsr&0x04)//捕获2发生捕获事件
- {
- 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; //计数器清空
- TIM2->CCER|=1<<5; //CC1P=1 设置为下降沿捕获
- }
- }
- }
- /***************************************************************************************
-
- ****************************************************************************************/
- if((TIM2CH3_CAPTURE_STA&0X80)==0)//还未成功捕获
- {
- if(tsr&0X01)//溢出
- {
- if(TIM2CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
- {
- if((TIM2CH3_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
- {
- TIM2CH3_CAPTURE_STA|=0X80;//标记成功捕获了一次
- TIM2CH3_CAPTURE_VAL=0XFFFF;
- }else TIM2CH3_CAPTURE_STA++;
- }
- }
- if(tsr&0x08)//捕获1发生捕获事件
- {
- 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; //计数器清空
- TIM2->CCER|=1<<9; //CC1P=1 设置为下降沿捕获
- }
- }
- }
- /***************************************************************************
-
- ****************************************************************************/
- if((TIM2CH4_CAPTURE_STA&0X80)==0)//还未成功捕获
- {
- if(tsr&0X01)//溢出
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
USART_TIM2.rar
(110.91 KB, 下载次数: 42)
|