標(biāo)題:
STM32超聲波測試程序(卡爾曼濾波)
[打印本頁]
作者:
linzi1998
時間:
2019-3-10 20:08
標(biāo)題:
STM32超聲波測試程序(卡爾曼濾波)
最近嘗試做出來的超聲波測試(卡爾曼濾波)
單片機源程序如下:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "math.h"
#include "usart.h"
#include "timer.h"
#include "can.h"
#include "wheelControl.h"
#include "encoder.h"
#include "coordinate.h"
#include "monition_control.h"
#include "pwm.h"
#include "exti.h"
#include "stm32f10x_exti.h"
#include "lidar.h"
#include "spi.h"
#include "24l01.h"
#include "QIANG.h"
#include "text.h"
#include "bsp_rcc.h"
#include "key.h"
#include "chaosheng.h"
#include "lb.h"
int speed=3000;
extern float zygj; //估計值
extern float sjjc; //檢測值
float s;//碼盤偏差糾正
extern coordinitioate_Struct World_Coordinate_system_Position/*世界坐標(biāo)系--位置*/
,World_Coordinate_system_Velocity/*世界坐標(biāo)系--速度*/
,Velocity_Coordinate_system/*速度坐標(biāo)系*/
,Robot_Coordinate_system/*機器人車身坐標(biāo)系*/
,TargetLine_Coordinate_system/*目標(biāo)線坐標(biāo)系,相當(dāng)于在速度坐標(biāo)系下的位置*/;
float data_tosend[6];
ROBOT_Status_Struct ROBOT_Status;
extern int flag_ea;
extern float targetY;
extern distancel distance_angle;
char start_flag=0;
extern int flag_dingwei;
extern float gyroIntegral_tri;
extern PID_Struct Angle_PID,Abjust_PID;
//extern int32_t motorSpeed_1, motorSpeed_2, motorSpeed_3, motorSpeed_4;
int main(void)
{
// HSE_SetSysClock(RCC_PLLMul_15);
delay_init(); //延時函數(shù)初始化
NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
qigang_init();
KEY_Init();
NRF24L01_Init();
NRF24L01_TX_Mode();
CAN_Configuration(); //can初始化
CAN_SetMsg_1(0x110);
delay_ms(100);
CAN_SetMsg_1(0x210);
delay_ms(100);
CAN_SetMsg_1(0x310);
delay_ms(100);
CAN_SetMsg_1(0x410);
delay_ms(100);
CAN_SetMsg_2(0x111);
delay_ms(100);
CAN_SetMsg_2(0x211);
delay_ms(100);
CAN_SetMsg_2(0x311);
delay_ms(100);
CAN_SetMsg_2(0x411);
delay_ms(100);
usart1_init(115200);
delay_ms(300);
TIM5_Configuration(49,7199);//10Khz的計數(shù)頻率,計數(shù)到5000為500ms
TIM3_Cap_Init(0XFFFF,72-1);
while(!Key_Scan())//等待按鍵初始化完成
{
}
while(Key_Scan())//等待按鍵按下
{
}
ROBOT_Status.Target_Angle.angle_reg=0; // 機器人姿態(tài)角不
ROBOT_Status.Target_Angle.angle_deg=0;
ROBOT_Status.angular_velocity=0; // 車身運動時姿態(tài)角不變
ROBOT_Status.Start_Speed=1000;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type= 0 ;
ROBOT_Status.Target.x=1196.6;
ROBOT_Status.Target.y=943.92;
ROBOT_Status.Slow_accelerated_speed=3000; // 減速加速度
ROBOT_Status.Speedup_accelerated_speed=5000;
ROBOT_Status.Target_Speed=speed; // 末端速度
ROBOT_Status.Stop_length =0;
while(Robot_control_line(&ROBOT_Status)>50);
ROBOT_Status.angular_velocity=0;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type=2;
ROBOT_Status.angle_reg_Sum=3.1415926*103.46/180;
ROBOT_Status.R=600;
ROBOT_Status.Heart.x=825;
ROBOT_Status.Heart.y=1415;
ROBOT_Status.Slow_accelerated_speed=3000; // 減速加速度
ROBOT_Status.Target_Speed=speed;
ROBOT_Status.Stop_length = 10;
while(Robot_control_Circle(&ROBOT_Status)>50);
ROBOT_Status.Start_Speed=speed;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type= 0 ;
ROBOT_Status.Target.x=464.91;
ROBOT_Status.Target.y=2435.07;
ROBOT_Status.Slow_accelerated_speed=3000; // 減速加速度
ROBOT_Status.Speedup_accelerated_speed=5000;
ROBOT_Status.Target_Speed=speed; // 末端速度
ROBOT_Status.Stop_length =0;
while(Robot_control_line(&ROBOT_Status)>50);
ROBOT_Status.angular_velocity=0;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type=1;
ROBOT_Status.angle_reg_Sum=3.1415926*106.24/180;
ROBOT_Status.R=600;
ROBOT_Status.Heart.x=825;
ROBOT_Status.Heart.y=2915;
ROBOT_Status.Slow_accelerated_speed=1000; // 減速加速度
ROBOT_Status.Target_Speed=speed;
ROBOT_Status.Stop_length = 10;
while(Robot_control_Circle(&ROBOT_Status)>20);
ROBOT_Status.Start_Speed=speed;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type= 0 ;
ROBOT_Status.Target.x=1185;
ROBOT_Status.Target.y=3935;
ROBOT_Status.Slow_accelerated_speed=3000; // 減速加速度
ROBOT_Status.Speedup_accelerated_speed=5000;
ROBOT_Status.Target_Speed=speed; // 末端速度
ROBOT_Status.Stop_length =10;
while(Robot_control_line(&ROBOT_Status)>20);
ROBOT_Status.angular_velocity=0;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type=2;
ROBOT_Status.angle_reg_Sum=3.1415926*127/180;
ROBOT_Status.R=600;
ROBOT_Status.Heart.x=825;
ROBOT_Status.Heart.y=4415;
ROBOT_Status.Slow_accelerated_speed=3000; // 減速加速度
ROBOT_Status.Target_Speed=speed;
ROBOT_Status.Stop_length = 10;
while(Robot_control_Circle(&ROBOT_Status)>50);
Abjust_PID.KP=5;
Angle_PID.KP=10;
ROBOT_Status.angular_velocity=0;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type=1;
ROBOT_Status.angle_reg_Sum=3.1415926*83/180;
ROBOT_Status.R=170.0840;
ROBOT_Status.Heart.x=995.0840;
ROBOT_Status.Heart.y=5170.0000;
ROBOT_Status.Slow_accelerated_speed=1000; // 減速加速度
ROBOT_Status.Target_Speed=0;
ROBOT_Status.Stop_length = 10;
while(Robot_control_Circle(&ROBOT_Status)>20)
{
delay_ms(500);
break;
}
while(1)
{
if(zygj>850)
{
CAN_SetMsg(-500,0x114);
CAN_SetMsg(-500,0x214);
CAN_SetMsg(500,0x314);
CAN_SetMsg((int32_t) 500/17.8*12,0x414);
}
else if(zygj<800)
{
CAN_SetMsg(500,0x114);
CAN_SetMsg(500,0x214);
CAN_SetMsg(-500,0x314);
CAN_SetMsg((int32_t)-500/17.8*12,0x414);
}
else if(zygj<850&zygj>800)
{
break;
}
}
ROBOT_Status.Start_Speed=1000;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type= 0 ;
ROBOT_Status.Target.x=750;
ROBOT_Status.Target.y=7920;
ROBOT_Status.Slow_accelerated_speed=300; // 減速加速度
ROBOT_Status.Speedup_accelerated_speed=1000;
ROBOT_Status.Target_Speed=speed; // 末端速度
ROBOT_Status.Stop_length =0;
while(Robot_control_line(&ROBOT_Status)>5);
//過橋后
Angle_PID.KP=10;
Angle_PID.KD=0;
ROBOT_Status.angular_velocity=0;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type=1;
ROBOT_Status.angle_reg_Sum=3.1415926*85/180;
ROBOT_Status.R=585.0000;
ROBOT_Status.Heart.x=1360;//775+585=1360
ROBOT_Status.Heart.y=7920;
ROBOT_Status.Slow_accelerated_speed=3000; // 減速加速度
ROBOT_Status.Target_Speed=speed;
ROBOT_Status.Stop_length = 10;
while(Robot_control_Circle(&ROBOT_Status)>20);
ROBOT_Status.Start_Speed=speed;
ROBOT_Status.Max_speed=speed;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type= 0 ;
ROBOT_Status.Target.x=3963.8097;
ROBOT_Status.Target.y=8505;
ROBOT_Status.Slow_accelerated_speed=500; // 減速加速度
ROBOT_Status.Speedup_accelerated_speed=1000;
ROBOT_Status.Target_Speed=1500; // 末端速度
ROBOT_Status.Stop_length =0;
while(Robot_control_line(&ROBOT_Status)>20);
ROBOT_Status.angular_velocity=0;
ROBOT_Status.Max_speed=1500;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type=1;
ROBOT_Status.angle_reg_Sum=3.1415926*90/180;
ROBOT_Status.R=510.0000;
ROBOT_Status.Heart.x=3964.0000;
ROBOT_Status.Heart.y=8020.0000;
ROBOT_Status.Slow_accelerated_speed=500; // 減速加速度
ROBOT_Status.Target_Speed=700;
ROBOT_Status.Stop_length = 10;
while(Robot_control_Circle(&ROBOT_Status))
{
if(lb_level!=1)
break;
}
//交接令牌
Angle_PID.KP=0;
Angle_PID.KI=0;
Angle_PID.KD=0;
Abjust_PID.KP=1;
Abjust_PID.KI=0;
Abjust_PID.KD=0;
while(1)
{
if(lb_level==1)
{
CAN_SetMsg(-500,0x114);
CAN_SetMsg( 500,0x214);
CAN_SetMsg(500,0x314);
CAN_SetMsg((int32_t) -500/17.8*12,0x414);
}
else
{
ROBOT_Status.Start_Speed=700;
ROBOT_Status.Max_speed=700;
ROBOT_Status.NewState=ENABLE;
ROBOT_Status.Robot_type= 0 ;
ROBOT_Status.Target.x=7450;
ROBOT_Status.Target.y=8020.0000-20;
ROBOT_Status.Slow_accelerated_speed=500; // 減速加速度
ROBOT_Status.Speedup_accelerated_speed=1000;
ROBOT_Status.Target_Speed=0; // 末端速度
ROBOT_Status.Stop_length =0;
while(Robot_control_line(&ROBOT_Status))
{
if(lb_level==1)
break;
}
}
}
}
復(fù)制代碼
所有資料51hei提供下載:
超聲波測試1.3(卡爾曼濾波).7z
(238.41 KB, 下載次數(shù): 43)
2019-3-11 02:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2019-3-11 02:01
本帖需要重新編輯補全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
作者:
DBGB123
時間:
2019-3-11 11:07
樓主:不給原理圖大家怎么玩呀
作者:
LHM
時間:
2019-7-31 20:47
float R = MeasureNoise_R; // R:測量噪聲,R增大,動態(tài)響應(yīng)變慢,收斂穩(wěn)定性變好
float Q = ProcessNiose_Q; // Q:過程噪聲,Q增大,動態(tài)響應(yīng)變快,收斂穩(wěn)定性變壞
大佬這些值是怎么給的,設(shè)定這些值有什么要求啊,是怎么算出來的
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1