基于stm32的超声波数据(卡尔曼滤波处理数据)

本文介绍了基于STM32的超声波测距系统设计,包括超声波模块的使用、定时器输入捕获测距、串口通信接收最小距离设置以及卡尔曼滤波提升精度。系统要求实现毫米级测距、实时显示、报警功能,并通过串口将数据发送至电脑。在调试过程中,作者强调了程序流程设计、备份和逐步优化的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "beep.h"
#include "bmp.h"
#include "oled.h"

u8 table1[]={0X03,0XFC};//µ÷²¨ÉèÖÃ
u8 table2[]={0XFC,0X03};

extern u8  TIM5CH1_CAPTURE_STA;		//ÊäÈë²¶»ñ״̬		    				
extern u32	TIM5CH1_CAPTURE_VAL;	//ÊäÈë²¶»ñÖµ  
long long temp=0;//²â¾àʱ¼ä
long long S=0,s1=0,t=0,Sm=0,Sa=0;//¾àÀë²ÎÊý
int table[]={1,10,100,1000};
/*************½ÓÊÕÊý¾Ý******************
len ´®¿Ú½ÓÊÕµ½µÄÊý¾Ý³¤¶È
s1  ¾­¹ýASIICÂëת»»ºóµÃµ½µÄÊý×Ö£¨·§Öµ£©  
t   ´«µÝÖµ£¬½«s1¸³¸øt£¬È¥Ö´ÐÐÆäËû³ÌÐò
***************************************/
float recevie()
{
	u8 i;
	u8 len;	 
	if(USART_RX_STA&0x8000)//Èç¹û½ÓÊÕµ½Êý¾Ý
		{					   
			len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
			for(i=0;i<len;i++)
			{
			   s1+=(USART_RX_BUF[len-1-i]-48)*table[i];
			}
			t=s1;//½«½ÓÊÕµ½µÄÊý¾Ý¸øµ½t
			s1=0;//s1³õʼ»¯
			USART_RX_STA=0;//״̬λÇåÁã
		}
		printf("\r\nÉèÖõÄ×îС¾àÀëΪ:%lld\r\n",t);
		return t;
}

/***************ÅжϺ¯Êý****************
S  ²âÁ¿µÃµ½µÄ¾àÀë
t  ͨ¹ý´®¿ÚÉèÖõķ§Öµ
***************************************/
float judge()
{ 
	  if(S<t)
		{
			 printf("\r\nÉèÖõÄ×îС¾àÀëΪ:%lld\r\n",t);
		   printf("\r\n error!!!¡\\n");
			 LED1=!LED1;//³¬¹ý·§Öµ£¬±¨¾¯
			 delay_ms(5);
		}
		else
		{   
			  printf("\r\nÉèÖõÄ×îС¾àÀëΪ:%lld\r\n",t);
		    printf("distance:%lld mm\r\n",Sm);//´òÓ¡¾àÀë
			  delay_ms(5);
		}
		return t;
}

/*******************¼ÆËã¾àÀë*****************
temp  ͨ¹ýÊäÈë²¶»ñµÃµ½µÄ¸ßµçƽ³ÖÐøÊ±¼ä
S     ¾àÀë
*********************************************/
float Count()
{
	 long long a=0;
   if(TIM5CH1_CAPTURE_STA&0X80)        //³É¹¦²¶»ñµ½ÁËÒ»´Î¸ßµçƽ
		{
			temp=TIM5CH1_CAPTURE_STA&0X3F; 
			temp*=0XFFFFFFFF;		 		         //Òç³öʱ¼ä×ܺÍ
			temp+=TIM5CH1_CAPTURE_VAL;		   //µÃµ½×ÜµÄ¸ßµçÆ½Ê±¼ä
			a=temp;
			S=0.17*a;
			Sa=S;
			TIM5CH1_CAPTURE_STA=0;	//״̬λÇåÁã
     }
		return S;
}
/************¿¨¶ûÂüÂ˲¨***************
z_measure  ËͽøÀ´´¦ÀíµÄÊý¾Ý
Sm   ´¦ÀíºóµÄÊý¾Ý
*************************************/
void kalmanfilter(long long  z_measure)
{
	static float x_mid,x_last=0,p_mid,p_last=0,p_now,Q=0.018,kg,R=0.0542;
	x_mid=x_last;
	p_mid=p_last+Q;
	kg=p_mid/(p_mid+R);
	//z_measure=z_real+rand()*0.03;
	Sm=(long)x_mid+kg*(z_measure-x_mid);
	p_now=(1-kg)*p_mid;
	p_last=p_now;
	x_last=Sm;
}
//µ÷²¨º¯Êý
void send_data(long long x,long long y)
{
   u8 i=0,j=0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值