Аналоговое считывание не дает правильной формы сигнала, как у осциллографа

У меня есть этот код, который извлекает аналоговые входные значения с клемм A0, A1 и A2 Arduino mega 2560. Но когда я рисую данные, он не дает нужной формы сигнала. Желаемая форма сигнала параллельно измеряется на цифровом запоминающем осциллографе. Я думал использовать Arduino mega 2560 в качестве осциллографа, который может иметь 16 каналов. Потому что у DSO всего 4 и для проекта мне срочно нужно 16 каналов. Было бы здорово, если бы люди из сообщества что-то предложили. Спасибо. Данные, считываемые интерфейсом Arduino-MATLAB

Ниже приведены нужные данные осциллографа, измеренные параллельно, чтобы избежать путаницы со схемой. Искомые данные, измеренные параллельно осциллографом

%Это скрипт, который будет отображать значения аналогового считывания Arduino в режиме реального времени.
%Изменено с http://billwaa.wordpress.com/2013/07/10/matlab-real-time-serial-data-logger/
%Код с этого сайта берет данные из Serial

clear all
close all
clc

%User Defined Properties 
a = arduino('Com5')             % define the Arduino Communication port
arduino=serial('COM5','BaudRate',9600);
s1 = serial('COM5');                                                       % Define here YOUR serial port
s1.BaudRate=9600;   


plotTitle = 'Arduino Data Log';  % plot title
xLabel = 'Time (s)';     % x-axis label
yLabel = 'Voltage (V)';      % y-axis label
legend1 = 'Voltage 1'
legend2 = 'Voltage 2'
legend3 = 'Voltage 3'
yMax  = 5                           %y Maximum Value
yMin  = 0                       %y minimum Value
plotGrid = 'on';                 % 'off' to turn off grid
min = 0;                         % set y-min
max = 5;                        % set y-max
delay = .01;                     % make sure sample faster than resolution 

%Define Function Variables
time = 0;
data = 0;
data1 = 0;
data2 = 0;
count = 0;

%Set up Plot
plotGraph = plot(time,data,'-r' )  % every AnalogRead needs to be on its own Plotgraph
hold on                            %hold on makes sure all of the channels are plotted
plotGraph1 = plot(time,data1,'-b')
plotGraph2 = plot(time, data2,'-g' )
title(plotTitle,'FontSize',15);
xlabel(xLabel,'FontSize',15);
ylabel(yLabel,'FontSize',15);
legend(legend1,legend2,legend3)
axis([yMin yMax min max]);
grid(plotGrid);

tic

while ishandle(plotGraph) %Loop when Plot is Active will run until plot is closed

%          dat = readVoltage(a,'A0')* 0.48875855327; %Data from the arduino
%          dat1 = readVoltage(a,'A1')* 0.48875855327; 
%          dat2 = readVoltage(a,'A2')* 0.48875855327;       

         dat = readVoltage(a,'A0')* 1; %Data from the arduino
         dat1 = readVoltage(a,'A1')* 1; 
         dat2 = readVoltage(a,'A2')*1; 
         
         count = count + 1;    
         time(count) = toc;    

         data(count) = dat(1);         
         data1(count) = dat1(1)
         data2(count) = dat2(1)

         %This is the magic code 
         %Using plot will slow down the sampling time.. At times to over 20
         %seconds per sample!
         set(plotGraph,'XData',time,'YData',data);
         set(plotGraph1,'XData',time,'YData',data1);
         set(plotGraph2,'XData',time,'YData',data2);

          axis([0 time(count) min max]);

          %Update the graph
          %pause(delay);
  end

delete(a);

disp('Plot Closed and arduino object has been deleted');`

, 👍2

Обсуждение

Какой скетч вы используете на Arduino? Вы используете что-то вроде Firmata? Откуда взялась функция readVoltage()? Его нет нигде в ссылке, откуда вы изменили код. Из ваших изображений видно, что вы слишком медленно сэмплируете, чтобы увидеть форму волны., @chrisl

Вы пытаетесь семплировать сигнал с частотой ≈ 12 сэмплов/с, что соответствует частоте около 3 кГц. Вы должны прочитать о [теореме выборки Найквиста-Шеннона] (https://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem)., @Edgar Bonet

почему вы сэмплируете 3 канала? ... сначала определите, может ли один канал захватить данные, затем попробуйте два канала и т. д., @jsotola


1 ответ


3

Ваша частота дискретизации слишком низкая для анализируемых сигналов; вы не получаете достаточно точек данных для рисования чего-то похожего на исходный сигнал.

Аналоговый метод Read() библиотеки Arduino, хотя и медленный, может работать лучше, примерно до 9000 выборок в секунду; АЦП в atmega2560 в автономном режиме может выполнять около 75000 отсчетов/с при 8-битном разрешении. Это потребует программирования на уровне регистров.

У нас только один АЦП, поэтому, если вы хотите 16 каналов, на каждый канал остается около 4700 отсчетов/с. Однако в этой конфигурации первые измерения недействительны, и следует использовать вторые, что еще больше снижает частоту дискретизации на канал примерно до 2300 выборок/с.

С фильтром идеальной реконструкции это ограничит вас измерением сигналов только до 1150 Гц.

Все это даже не учитывает время, необходимое для хранения или передачи результатов.

Итак, Arduino mega 2560 не подойдет для создания пригодного для использования 16-канального осциллографа для ваших сигналов; это даже не близко.

,