Прошу вашему вниманию самый простой осциллограф на Aduino.
Подходят только китайские Arduino ценой не более 1,5$/шт.
Схема предусматривает измерение отрицательного сигнала.
Администраторов прошу не наказывать. Текст мой и код мой, просто лень для нескольких форумов все наново переписывать. Передрал и все тут.
Удалось достичь максимальной частоты которую позволяет АЦП контроллера.
20kHz выглядят так:

Програмка: https://yadi.sk/d/ww1kQopXm8LA2

Схема:

Скетч:
Код:
//Осциллограф ©RasyakRoman
#include <CyberLib.h>
unsigned long currentTime;
unsigned long loopTime;
byte N = 0;
byte Rb = 255;
uint8_t MyBuff[255];
void setup()
{
UART_Init(256000);
ADCSRA = (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (0 << ADIF) | (1 << ADIE) | (0 << ADPS2) | (1 << ADPS1) | (0 << ADPS0);
ADMUX = (0 << REFS1) | (0 << REFS0) | (1 << ADLAR) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (0 << MUX0) ;
}
void loop()
{
currentTime = millis();
if (currentTime >= (loopTime +100)) // сравниваем текущий таймер с переменной loopTime + 1 секунда
{
ADCSRA &= ~(1 << ADIE); //Выключить
UART_SendByte(15); UART_SendByte(0); UART_SendByte(15);
UART_SendArray(MyBuff, 255);
UART_SendByte(OCR1A); //Не используются
UART_SendByte(OCR1B); //Не используются
UART_SendByte(N); //Начальная точка
UART_SendByte(1); UART_SendByte(15);UART_SendByte(1);
ADCSRA |= (1 << ADIE); // Включить прерывание
loopTime = currentTime;
}
if (UART_ReadByte(Rb)) {
ADCSRA = (ADCSRA >> 3) << 3 | Rb ;
};
}
ISR(ADC_vect)
{
MyBuff[N] = ADCH;
N++;
}
В строке:
if (currentTime >= (loopTime +100))
Можно изменить частоту выборок. В представленом варианте производится 10 выборок в секунду. Можно поставить больше.
Обяснение по интерфейсу:
"Open" - открывает порт.
"Старт" - включает/останавливает отрисовку.
"Стабілізація" - пытается стабилизировать график сдвигая его на десятые доли выборок вправо или влево.
"AVG проходи" - усредняет значение отрисовки с предварительніми выборками. Число означает количество усреднений. 1 - рисует живой график.
"Дільник" - делитель прерываний АЦП. Онже частота выборок.
"Калибровка" - Я этот пункт оставил для ручных настроек. Количество настроек можно добавлять войдя в вкладку "Режими". После правок можно сохранитьнастройки. Я не делал калибровочных замеров (лень). Буду благодарен за предоставленную информацию для каждого из режимов делителя.
Принцип работы:
Ацп отталкивается от стабилизированного выхода 3,2В и считает его максимумом. Входная шкала составляет 8 бит, тоесть 0 - 254.
Примитивный делитель делит 3,2/2=1,6В на два плеча. Такую схему нельзя использовать если масса ПК и измеряемой модели соединены. Идеальный вариант, как делал я, использовать ноутбук.
Итого 1,6В на входе А0 будет равно 127 - вход это первый столбец параметров "Калибровка". После вход масштабируется в соответствии с вторым столбцом "Калибровка".
Ячейка, что размещена отдельно в параметрах "Калибровка" отвечает за горизонтальную шкалу.
Исходный код предоставлять не вижу смысла, ибо использовалисть платные библиотеки EhLib (честно купленные). С энтузиастами могу поделится в личке.
Немножко кривой калибровки

И несколько тестов: