Виртуальный осциллограф.
- Войдите на сайт для отправки комментариев
Ср, 24/07/2019 - 20:17
Приветствую всех !
Столкнулся в проекте круиз-контроля для автомобиля с помехами на линии от датчика скорости. (Как только включаешь зажигание - начинают сыпаться внешние прерывания, как будто авто рывками движется с приличной скоростью.) Решил увидеть что же там такое творится ... Осциллографа под рукой не оказалось. Пришлось обойтись подручными средствами.
Использовал Arduino Pro Micro 5v 16MHz на чипе 32U4.
В качестве щупа - резистор на 10КОм.
На схеме "щуп" подключен к D3, на котором в скетче формируется тестовый сигнал.
/*
* Осциллограф на A0
* Processor: ATmega32U4
* Board: Arduino Pro Micro 5V 16MHz
* Compiler: Arduino AVR
* Для просмотра графика сигнала надо открыть в Arduino IDE окно Инструменты/Плоттер по последовательному соединению
* Для смены "развертки" закрыть окно с графиком, открыть Инструменты/Монитор порта, отправить в порт число от 1 до 7,
* закрыть Монитор порта и снова открыть окно с графиком
*/
uint8_t buff[2048];
void setup() {
Serial.begin(921600);
DDRD &= ~_BV(PD5); DDRB &= ~_BV(PB0); //гасим RX, TX (лично меня отвлекает мигание)
while (!Serial);
pinMode(3, OUTPUT); //тестовый сигнал на PD0 (D3) (просто соедините D3 и A0)
analogWrite(3,128); //(128 можно менять в пределах 1-254 тем самым меняется скважность тестового сигнала
ADMUX = 0B01100111; //подготовка АЦП три младших бита отвечают за выбор канала 111 это A0
ADCSRA = 0B11100111; //...
ADCSRB = 0B10000000; //...
}
void loop() {
while (true) {
for (uint16_t i=0; i<2048; i++) { //заполням буфер
while ((ADCSRA&_BV(ADIF))==0); //ждем окончания очередного измерения
buff[i]=ADCH; //сохраняем
ADCSRA |= _BV(ADIF); //запускаем очередное измерение
};
for (uint16_t i=0; i<2048; i++) Serial.println(buff[i]); //выводим буфер
if (Serial.available()) { //проверяем нет ли чего от пользователя
uint8_t ch=Serial.read(); //если пользователь ввел число от 1 до 7, то
if ((ch>=0x31) && (ch<=0x37)) ADCSRA =((ADCSRA&0B11111000)|(ch&0B00000111)); //меняем предделитель АЦП (меняем развертку)
}
}
}
Для просмотра графика сигнала надо открыть в Arduino IDE окно Инструменты/Плоттер по последовательному соединению.
Для смены "развертки" закрыть окно с графиком, открыть Инструменты/Монитор порта, отправить в порт число от 1 до 7, закрыть Монитор порта и снова открыть окно с графиком

Если подключить "щуп" к D3 (источник тестового сигнала).
Надеюсь что данный материал будет многим полезен.
Молодец! ))
Так-то https://www.google.com/search?q=arduino+oscilloscope их много :) мне нравится вот такой: https://sourceforge.net/projects/scopino/
такой: https://sourceforge.net/projects/scopino/
analogRead - путь в ад
я пытался выжать максимум скорости из процесса захвата сигнала - так как охотился на помехи, длительность которых крайне мала.
Вы что-нибудь слышали про low pass filter?
Или вы программист?
я пытался выжать максимум скорости из процесса захвата сигнала - так как охотился на помехи, длительность которых крайне мала.
Это как экскаватором ловить мышей. Прерывания легко срабатывают от наносекундных импульсов, такое не каждому промышленному осциллоскопу по плечу :)
Обязательно учту это ценное замечание :)
trembo Мы тут не об этом сейчас.
trembo вам намекнул, что можно бы и срезать эти ваши лишние "внешние прерывания", а dimax о том, что раз уж хотите ловить входящие импульсы, то можно трактовать их, как цифру, и ловить в прерывании, а потом таймером насчитывать время между ними, коль скоро волна не нужна. :)
dimax Я помотрел как сигнал идет на плате в ЭБУ и на плате в приборной панели - диод, подтяжка к плюсу и всё. Делаю так же - ложные прервания одолевают. Пришлось поставить RC фильтр первого порядка. Надо было убедиться что с фронтами всё в порядке. Подстраивал резистор, что бы пропали выбросы, но фронты не залегли. Без визуализации это делать сложно - вот и родился данный материал. Хоть импульсы и короткие, но видно когда они есть и когда их нет.