💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
📚2 运行结果
🎉3 参考文献
🌈4 Matlab代码及讲解
💥1 概述
本文包括两部分中的第一部分:第一部分设计与仿真;第2部分实际系统实现。它旨在演示如何使用Matlab/Simulink与Rapid STM32块集和ARM Cortex-M3处理器(STM32)一起开发数字信号处理系统;使用倾斜传感器作为案例研究。它涵盖了从设计、仿真、硬件在环测试到创建独立嵌入式系统的开发过程。内容应该尽可能的简单。
在第一部分中,解释了使用Simulink进行嵌入式系统开发的动机。然后,建立了倾斜传感器系统的简化模型。
总结了卡尔曼滤波和Unscented卡尔曼滤波(UKF)理论。然后提供图形说明,以指导您完成实现Simulink模型的整个过程,以设计,模拟和评估UKF用于倾斜传感器系统的性能。
在第二部分中,提供图形说明,以指导您完成将您的设计从Simulink模型转移到基于Rapid STM32 - R1邮票板的现实世界独立倾斜传感器系统的过程。
目录:
从概念上讲,微控制器(uC)就像我们大多数人每天使用的个人电脑(PC)。uC与PC的不同之处在于,所有东西都是由一个小手指大小的集成电路(硅芯片)构建的,而PC可能由主板和几个附加卡组成。PC可能有大量的外设选择,如COM端口,USB, Wifi,键盘,鼠标,显示器等。uC的外设更有限,通常包括定时器,SPI, USART, i2c, ADC等。一台PC可能使用64位架构,运行在千兆赫兹的速度与数百千兆字节的硬盘和RAM。uC是8位、16位或32位,运行频率不超过几百MHz,内存只有几十或几百KB。
uC通常用于自动控制独立系统,如洗衣机、带LCD显示屏的冰箱或mp3播放器。在一辆更现代的汽车里,可能会有数百个uC;一个用于监测和控制自动燃油喷射,一个用于监测ABS,一个用于监测和控制机舱温度,等等。像个人电脑一样,要使用uC,我们需要开发程序来告诉它做什么、什么时候做以及如何做。uC编程已经从像汇编这样的低级语言发展到像c这样更流行的高级编程语言。然而,在程序正常运行之前,可能需要手工编写和调试数百或数千行代码,更不用说低级编程和设备驱动程序的调试了。
在第一部分中:
1. 解释了使用 Simulink 进行嵌入式系统开发的动机。
2. 开发了一种简化的倾斜传感器系统模型。
3. 总结了卡尔曼滤波和无迹卡尔曼滤波(UKF)理论。
4. 然后提供图形说明,指导您完成实施 Simulink 模型的整个过程,以设计、仿真和评估倾斜传感器系统 UKF 的性能。注意:还提供了源代码,用于执行基于 Simulink 模型的蒙特卡罗模拟,以使用协方差分析评估 UKF 性能。
在第二部分中,将提供图形说明,指导您将设计从 Simulink 模型转移到基于 Rapid STM32 - R1 印章板的实际独立倾斜传感器系统的过程。
📚2 运行结果
部分代码:
% Generate random seeds to drive the Band-Limited White Noise Block in
% the Accelerometer Sensor Subsystem
% the seed is picked from a uniform random variable between begin_bound and
% end_bound
RandStream.setDefaultStream(RandStream('mt19937ar','seed',sum(100*clock))); % set random seed based on clock
begin_bound = 0;
end_bound = 10000;
seed_vec = floor(begin_bound + (end_bound - begin_bound).*rand(2,final_run));
for k = 1:final_run
seed1 = seed_vec(1,k);
seed2 = seed_vec(2,k);
disp(['Run' num2str(k)])
sim('tilt_system',[start stop]); % This line of code starts and stops Simulink simulation automatically.
if (k == 1)
% First run
% initialise record buffer
true_roll_error_deg_rec = repmat(error_variance.signals(1).values(:,1),1,final_run);
theoretical_roll_error_deg_rec = repmat(error_variance.signals(1).values(:,2),1,final_run);
true_pitch_error_deg_rec = repmat(error_variance.signals(2).values(:,1),1,final_run);
theoretical_pitch_error_deg_rec = repmat(error_variance.signals(2).values(:,2),1,final_run);
else
% Other runs
% Import data from saved work space data
true_roll_error_deg_rec(:,k) = error_variance.signals(1).values(:,1);
theoretical_roll_error_deg_rec(:,k) = error_variance.signals(1).values(:,2);
true_pitch_error_deg_rec(:,k) = error_variance.signals(2).values(:,1);
theoretical_pitch_error_deg_rec(:,k) = error_variance.signals(2).values(:,2);
end
end
time = error_variance.time;
mean_true_roll_error_deg = mean(true_roll_error_deg_rec,2);
mean_theoretical_roll_error_deg = mean(theoretical_roll_error_deg_rec,2);
mean_true_pitch_error_deg = mean(true_pitch_error_deg_rec,2);
mean_theoretical_pitch_error_deg = mean(theoretical_pitch_error_deg_rec,2);
std_true_roll_error_deg = std(true_roll_error_deg_rec,0,2);
std_true_pitch_error_deg = std(true_pitch_error_deg_rec,0,2);
% Plot results
subplot(2,1,1)
plot(time,mean_true_roll_error_deg,'r-',time,mean_theoretical_roll_error_deg,'b-',time,...
std_true_roll_error_deg,'g-')
ylabel('Roll Errors (deg)'), xlabel('time (sec)')
legend('Mean errors','\surd(P_{11})','Error std')
subplot(2,1,2)
plot(time,mean_true_pitch_error_deg,'r-',time,mean_theoretical_pitch_error_deg,'b-',time,...
std_true_pitch_error_deg,'g-')
ylabel('Pitch Errors (deg)'), xlabel('time (sec)')
legend('Mean errors','\surd(P_{22})','Error std')
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。
[1]李开龙,胡柏青,高敬东,方轩.鲁棒四元数无味卡尔曼滤波算法在组合导航姿态估计中的应用[J].海军工程大学学报,2015,27(01):6-10.
[2]Krisada Sangpetchsong (2023). Introduction to Unscented Kalman Filtering