这段代码通过STM32单片机的GPIO和定时器实现了超声波模块的测距功能:

  1. 初始化GPIO和定时器。

  2. 发送触发信号,启动超声波发射。

  3. 通过定时器测量从发射到接收回波的时间。

  4. 根据时间计算距离。

因为这里只涉及单个模块,所以就没有使用中断函数了;

float Test_Distance(){
	GPIO_SetBits(GPIOB,GPIO_Pin_12);
	Delay_us(20);
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==RESET){
	};
	TIM_Cmd(TIM4, ENABLE);
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==SET){
	};
	TIM_Cmd(TIM4, DISABLE);
	Cnt=TIM_GetCounter(TIM4);
	float distance=(Cnt*1.0/10*0.34)/2;
	TIM4->CNT=0;
	Delay_ms(100);
	return distance;
}

kalman.c文件

#include "stm32f10x.h"                  // Device header
// Kalman.c
#include "kalman.h"

Kalman kfp;

void Kalman_Init(void)
{
    kfp.Last_P = 1; // 初始协方差
    kfp.Now_P = 0;
    kfp.out = 0;    // 初始输出值
    kfp.Kg = 0;     // 初始卡尔曼增益
    kfp.Q = 0.001;  // 过程噪声协方差,可根据需要调整
    kfp.R = 0.1;    // 观测噪声协方差,可根据需要调整
}

float KalmanFilter(Kalman *kfp, float input)
{
    // 预测阶段
    kfp->Now_P = kfp->Last_P + kfp->Q;

    // 更新阶段
    kfp->Kg = kfp->Now_P / (kfp->Now_P + kfp->R);
    kfp->out = kfp->out + kfp->Kg * (input - kfp->out);
    kfp->Last_P = (1 - kfp->Kg) * kfp->Now_P;

    return kfp->out;
}

剩下的就是主函数自己要实现的功能了

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐