中级会员
 
- 积分
- 242
- 金钱
- 242
- 注册时间
- 2015-12-28
- 在线时间
- 51 小时
|
5金钱
新手刚玩stm32,修改别人的例程然后写了一个超声波测距的程序,通过中断来记录脉宽的时间进而计算出距离。
主函数
int main(void)
{ float Distance[3],d;
int flag_d=0,i=0;
Stm32_Clock_Init(9); //系统时钟
delay_init(72); //延时
Ultran_Init(); //GPIO初始化ˉ
TIM3_Int_Init(9,7199); //10/(72 000 000/7200) = 1/1 000 = 1ms
EXTIX_Init();
while(1)
{ Trig_Sent();
delay_ms(10);
if(flag)
{ Distance[i++]=170*((Count_Times*10+(TIM3->CNT+1)*1.0)/10000);
Count_Times=0;
TIM3->CNT=0;
if(i==3)
{ i=0;
flag_d=1;
d=(Distance[0]+Distance[1]+Distance[2])/3;
if(((d-Distance[0]<=0.05)||(d-Distance[0]>=-0.05))&&
((d-Distance[1]<=0.05)||(d-Distance[1]>=-0.05))&&
((d-Distance[2]<=0.05)||(d-Distance[2]>=-0.05)));
else //三次数据相差5cm则重新采样
flag_d=0;
}
}
if(d<0.1&&flag_d)
{
PBout(5)=1;
delay_ms(60);
d= 1;
flag_d=0;
}
else if(d<0.2&&flag_d)
{
PEout(5)=1;
delay_ms(60);
d= 1;
flag_d=0;
}
else if(d<0.3&&flag_d)
{
PBout(5)=1;
PEout(5)=1;
delay_ms(60);
d= 1;
flag_d=0;
}
PBout(5)=0;
PEout(5)=0;
}
}
void Trig_Sent(void)
{
TRIG_Send=1;
delay_us(20);
TRIG_Send=0;
}
这个程序是完全可以测量超声波的。
但是我测量平衡传感器的时候就出问题了,测量平衡传感器也是一个脉宽信号,5ms高电平,10ms 的周期。高电平时4v,接上管脚就是3.3v了。
问题就出在中断那里,正常情况下(也就是超声波测距时候)是上升沿一次下降沿一次,但是测量平衡传感器就乱来了。
这是测量平衡时候的主函数
int main(void)
{
float Distance[3],d;
volatile int time_cnt=0;
Stm32_Clock_Init(9);
delay_init(72);
Ultran_Init();
TIM3_Int_Init(9,7199); //10/(72 000 000/7200) = 1/1 000 = 1ms
EXTIX_Init();
while(1)
{
if(flag){ //下降沿中断的标志位
time_cnt= Time_cnt; //Time_cnt为计算脉宽的时间,在中断中计算(先不管那么多了)
}
}
中断函数
void EXTI0_IRQHandler(void)
{
if(GPIOA->IDR&1) //接的是管脚PA0
{
TIM3_Start();
flag=0;
}
if(!(GPIOA->IDR&1))
{ //PEout(5)=1;
TIM3_Stop();
flag=1;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}
大神帮帮看看。
gpio初始化
中断函数
|
|