Matlab 绘制arduino实时信号的移动轴
我是matlab新手,我发现很难定义一个参数来绘制运动轴,尤其是带有xlim的x轴。我从arduino那里得到一个实时信号,我想用时间来描绘它。请看下面我的代码:Matlab 绘制arduino实时信号的移动轴,matlab,arduino,matlab-figure,arduino-uno,Matlab,Arduino,Matlab Figure,Arduino Uno,我是matlab新手,我发现很难定义一个参数来绘制运动轴,尤其是带有xlim的x轴。我从arduino那里得到一个实时信号,我想用时间来描绘它。请看下面我的代码: clear all; clc; clf; %a=arduino('/dev/tty.usbmodem1a12211'); dt = 0.02; %sec. %adjusted_dt = dt; plot_window = 50; N_timesteps = 1000; a = arduino(
clear all; clc; clf;
%a=arduino('/dev/tty.usbmodem1a12211');
dt = 0.02; %sec.
%adjusted_dt = dt;
plot_window = 50;
N_timesteps = 1000;
a = arduino('COM3');
a.pinMode(15,'input'); % z
a.pinMode(16,'input'); % y
a.pinMode(17,'input'); % x
a.pinMode(18,'output');
a.pinMode(19,'output');
a.digitalWrite(18,0);
a.digitalWrite(19,1);
x=zeros();
y=zeros();
z=zeros();
t=zeros();
%For Calibration.====================
x_p_1g = 614.7500; x_n_1g = 392.1351;
y_p_1g = 612.6383; y_n_1g = 387.7179;
z_p_1g = 615.0000; z_n_1g = 421.5684;
%%%%%%%%==============================
x_0g = (x_p_1g + x_n_1g) / 2.0 ;
y_0g = (y_p_1g + y_n_1g) / 2.0 ;
z_0g = (z_p_1g + z_n_1g) / 2.0 ;
x_sntv = (x_p_1g - x_n_1g) / 2.0;
y_sntv = (y_p_1g - y_n_1g) / 2.0;
z_sntv = (z_p_1g - z_n_1g) / 2.0;
elapsed_time_from_t_0 = 0.0;
%toc =0;
%tic;
for i=1:N_timesteps
tic;
t(i,1) = elapsed_time_from_t_0;
pause(dt); %toc;
% fprintf('dt = %10.7f; (realtime dt)/(simul. time dt) = %5.2f \n',dt, toc/dt);
%Simulation time is different from real time.
% t(i,1) = i*dt; % < = this is no longer valid.
x(i,1)=a.analogRead(3);
y(i,1)=a.analogRead(2);
z(i,1)=a.analogRead(1);
%Calbiration --------------------------
x=(x(i,1) - x_0g)/x_sntv;
y=(y(i,1) - y_0g)/y_sntv;
z=(z(i,1) - z_0g)/z_sntv;
%Additional calibration code --------------------------
x(i,1)=a.analogRead(3);
y(i,1)=a.analogRead(2);
z(i,1)=a.analogRead(1);
x=(x(i,1) - x_0g)/x_sntv;
y=(y(i,1) - y_0g)/y_sntv;
z=(z(i,1) - z_0g)/z_sntv;
NEED EXTRA CODE/ARGUMENT TO CAUSE X AXIS TO MOVE/SHIFT TO PLOT THE LATEST 100 DATA
clf;
subplot(3,1,1); grid on; hold on;
ylim([-2 2]);
xlim([ ]); need help
plot(t,z,'b-o');
xlabel('t[sec]');
ylabel('z [g]');
title('z');
end
subplot(3,1,2); grid on; hold on;
ylim([-2 2]);
xlim([ ]); need help
plot(t,x,'b-o');
xlabel('t[sec]');
ylabel('x [g]');
title('x');
end
subplot(3,1,3); grid on; hold on;
ylim([-2 2]);
xlim([ ]); need help
plot(t,y,'b-o');
xlabel('t[sec]');
ylabel('y [g]');
title('y');
end
toc;
elapsed_time_from_t_0 = elapsed_time_from_t_0 + toc;
end
当您在循环中绘图时,绘图为“坏”。它再现了整个过程,而您只尝试重新绘制其中的几个点。更好的做法是:
h = plot(NaN);
for k = 1:N
set(h,'YData',data,'XData',time);
axis([time(k-100) time(k)+1 min(data)*1.1 max(data)*1.1]);
redraw;
end
限制的另一个选项:
% symmetrical y limits
xlim([time(k-100) time(k)+1]);
if (k > 102)
border = max(abs(data(k-100:end))) *1.1;
ylim([-border border]);
else
ylim([ min(data) max(data)]);
end
此方法仅替换绘图中的数据。axis语句先取x,然后取y限制。左下限bot是100个样本之前的时间,右下限为+1秒。我将最小值和最大值设置为比最大值/最小值高/低10%。请随意在这里玩。
有关使用matlab/arduino进行二进制数字传输的完整示例,请参见:
首先我看到一个问题:你不仅仅是在绘制最后100个点的t,x,y等等。你所有的绘图命令都使用完整的向量。你能删掉所有不相关的部分吗?谢谢。但我实际上不想要最后100个数据。我希望将100个最新数据视为x轴移动,以动态容纳下一个100个数据。我的意思是,随着绘图的增长,移动x=轴以查看最新的采样数据,就像100个截断数据一样,一次只显示最新的100个数据,这意味着每次前100个数据不会出现在窗口中