新手上路
- 积分
- 24
- 金钱
- 24
- 注册时间
- 2018-4-14
- 在线时间
- 1 小时
|
1金钱
#include "timer.h"
/**************************************************************************
oˉêy1|Äü£o¶¨ê±Æ÷3í¨μà3êäèë2¶»ñ3õê¼»ˉ
èë¿ú2Îêy£oèë¿ú2Îêy£oarr£o×Ô¶ˉ֨װÖμ psc£oê±ÖóÔ¤·ÖÆμêy
* ó2¼tᬽó£o------------------
* | PB1 - TRIG |
* | PB0 - ECHO |
* ------------------
·μ»Ø Öμ£oÎT
**************************************************************************/
void TIM3_Cap_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1; //TIM3ê±Öóê1Äü
RCC->APB2ENR|=1<<3; //ê1ÄüPORTBê±Öó
GPIOB->CRL&=0XFFFFFF00;
GPIOB->CRL|=0X00000038;// PB.0 êäèë PB.1êä3ö
TIM3->ARR=arr; //é趨¼ÆêyÆ÷×Ô¶ˉ֨װÖμ
TIM3-> SC=psc; //Ô¤·ÖÆμÆ÷
TIM3->CCMR2|=1<<0; //Ñ¡Ôñêäèë¶Ë
TIM3->CCMR2|=0<<4; // ÅäÖÃêäèëÂË2¨Æ÷ 2»ÂË2¨
TIM3->CCMR2|=0<<2; //ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
TIM3->CCER|=0<<9; //éÏéyÑØ2¶»ñ
TIM3->CCER|=1<<8; //ÔêDí2¶»ñ¼ÆêyÆ÷μÄÖμμ½2¶»ñ¼Ä′æÆ÷ÖD
TIM3->DIER|=1<<3; //ÔêDí2¶»ñÖD¶Ï
TIM3->DIER|=1<<0; //ÔêDí¸üDÂÖD¶Ï
TIM3->CR1|=0x01; //ê1Äü¶¨ê±Æ÷3
MY_NVIC_Init(2,1,TIM3_IRQn,2);
}
/**************************************************************************
oˉêy1|Äü£o3¬éù2¨½óêÕ»Ø2¨oˉêy
èë¿ú2Îêy£oÎT
·μ»Ø Öμ£oÎT
**************************************************************************/
u16 TIM3CH3_CAPTURE_STA,TIM3CH3_CAPTURE_VAL;//êäèë2¶»ñ×′쬡¢êäèë2¶»ñÖμ-óÃà′¼Ç¼2¶»ñμ½Ï½μÑØê±£¬TIM2_CNTμÄÖμ
void Read_Distane(void)
{
PBout(1)=1;
delay_us(10);
PBout(1)=0;
if(TIM3CH3_CAPTURE_STA&0X80)//3é1|2¶»ñμ½áËò»′θßμçÆ½
{
Distance=TIM3CH3_CAPTURE_STA&0X3F;
Distance*=65536; //òç3öê±¼ä×üoí
Distance+=TIM3CH3_CAPTURE_VAL; //μÃμ½×üμĸßμçÆ½ê±¼ä
Distance=Distance*170/1000;
printf("Distance:%d \r\n",Distance);
// OLED_ShowNumber(5,20,98,6,12);
// OLED_ShowNumber(30,20,Distance,6,12);
TIM3CH3_CAPTURE_STA=0; //¿aÆôÏÂò»′Î2¶»ñ
}
}
/**************************************************************************
oˉêy1|Äü£o3¬éù2¨»Ø2¨Âö¿í¶áè¡ÖD¶Ï
èë¿ú2Îêy£oÎT
·μ»Ø Öμ£oÎT
×÷ ÕߣoƽoaD¡3μÖ®¼ò
**************************************************************************/
void TIM3_IRQHandler(void)
{
u16 tsr;
tsr=TIM3->SR;
if((TIM3CH3_CAPTURE_STA&0X80)==0)//»1Î′3é1|2¶»ñ
{
if(tsr&0X01)//òç3ö
{
if(TIM3CH3_CAPTURE_STA&0X40)//òѾ-2¶»ñμ½¸ßμçÆ½áË
{
if((TIM3CH3_CAPTURE_STA&0X3F)==0X3F)//¸ßμçÆ½ì«3¤áË
{
TIM3CH3_CAPTURE_STA|=0X80;//±ê¼Ç3é1|2¶»ñáËò»′Î
TIM3CH3_CAPTURE_VAL=0XFFFF;
}else TIM3CH3_CAPTURE_STA++;
}
}
if(tsr&0x08)//2¶»ñ3·¢éú2¶»ñê¼t
{
if(TIM3CH3_CAPTURE_STA&0X40) //2¶»ñμ½ò»¸öϽμÑØ
{
TIM3CH3_CAPTURE_STA|=0X80; //±ê¼Ç3é1|2¶»ñμ½ò»′θßμçÆ½Âö¿í
TIM3CH3_CAPTURE_VAL=TIM3->CCR3; //»ñè¡μ±Ç°μÄ2¶»ñÖμ.
TIM3->CCER&=~(1<<9); //CC1P=0 éèÖÃÎaéÏéyÑØ2¶»ñ
}
else //»1Î′¿aê¼,μúò»′Î2¶»ñéÏéyÑØ
{
TIM3CH3_CAPTURE_STA=0; //Çå¿Õ
TIM3CH3_CAPTURE_VAL=0;
TIM3CH3_CAPTURE_STA|=0X40; //±ê¼Ç2¶»ñμ½áËéÏéyÑØ
TIM3->CNT=0; //¼ÆêyÆ÷Çå¿Õ
TIM3->CCER|=1<<9; //CC1P=1 éèÖÃÎaϽμÑØ2¶»ñ
}
}
}
printf("TIM3CH3_CAPTURE_VAL:%d \r\n",TIM3CH3_CAPTURE_VAL);
TIM3->SR=0;//Çå3yÖD¶Ï±ê־λ
}
这个是超声波的程序,但是只有第一次数据可以检测到,之后就一直都为0,请问各位大神,这个如何处理 |
|