Виртуальный осциллограф.
- Войдите на сайт для отправки комментариев
Ср, 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 фильтр первого порядка. Надо было убедиться что с фронтами всё в порядке. Подстраивал резистор, что бы пропали выбросы, но фронты не залегли. Без визуализации это делать сложно - вот и родился данный материал. Хоть импульсы и короткие, но видно когда они есть и когда их нет.