Виртуальный осциллограф.

Komandir
Offline
Зарегистрирован: 18.08.2018

Приветствую всех !

Столкнулся в проекте круиз-контроля для автомобиля с помехами на линии от датчика скорости. (Как только включаешь зажигание - начинают сыпаться внешние прерывания, как будто авто рывками движется с приличной скоростью.) Решил увидеть что же там такое творится ... Осциллографа под рукой не оказалось. Пришлось обойтись подручными средствами.

Использовал 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, закрыть Монитор порта и снова открыть окно с графиком
Komandir
Offline
Зарегистрирован: 18.08.2018

Если подключить "щуп" к D3 (источник тестового сигнала).

Надеюсь что данный материал будет многим полезен.

negavoid
Онлайн
Зарегистрирован: 09.07.2016

Молодец! ))

Так-то https://www.google.com/search?q=arduino+oscilloscope их много :) мне нравится вот такой: https://sourceforge.net/projects/scopino/

Komandir
Offline
Зарегистрирован: 18.08.2018

negavoid пишет:

такой: https://sourceforge.net/projects/scopino/

analogRead - путь в ад

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вы что-нибудь слышали про low pass filter?
Или вы программист?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Komandir пишет:

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

Это как экскаватором ловить мышей. Прерывания легко срабатывают от наносекундных импульсов, такое  не каждому промышленному осциллоскопу по плечу :)

negavoid
Онлайн
Зарегистрирован: 09.07.2016

Komandir пишет:
analogRead - путь в ад

Обязательно учту это ценное замечание :)

Komandir
Offline
Зарегистрирован: 18.08.2018

trembo Мы тут не об этом сейчас.

negavoid
Онлайн
Зарегистрирован: 09.07.2016

trembo вам намекнул, что можно бы и срезать эти ваши лишние "внешние прерывания", а dimax о том, что раз уж хотите ловить входящие импульсы, то можно трактовать их, как цифру, и ловить в прерывании, а потом таймером насчитывать время между ними, коль скоро волна не нужна. :)

Komandir
Offline
Зарегистрирован: 18.08.2018

dimax Я помотрел как сигнал идет на плате в ЭБУ и на плате в приборной панели - диод, подтяжка к плюсу и всё. Делаю так же - ложные прервания одолевают. Пришлось поставить RC фильтр первого порядка. Надо было убедиться что с фронтами всё в порядке. Подстраивал резистор, что бы пропали выбросы, но фронты не залегли. Без визуализации это делать сложно - вот и родился данный материал. Хоть импульсы и короткие, но видно когда они есть и когда их нет.