Как обработать сигнал с компаратора

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Я схему видел, а какое максимальное амплитудное с контура имеем?

 

DmitryR
Offline
Зарегистрирован: 12.05.2017

11,5 В

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DmitryR пишет:

11,5 В

не должен умирать компаратор при питании в 15 вольт, тогда что?

Logik
Offline
Зарегистрирован: 05.08.2014

Не факт. Нада в доках проверить допустимое напряжение на входе и допустимую разницу межд входами. К тому же этот компаратор от рождения ОУ был ;)

DmitryR
Offline
Зарегистрирован: 12.05.2017

+/-7В на вход у него по-моему, но причина скорее всего не в нём, собрал компаратор на ОУ,  тоже не проканало, причина в чём-то другом

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DmitryR пишет:

+/-7В на вход у него по-моему, но причина скорее всего не в нём, собрал компаратор на ОУ,  тоже не проканало, причина в чём-то другом

если 7 вольт то умрёт однозначно!
Я бы мерил нескольно иначе, вместо резистора в контуре- INA219 в диагональ выпрямительного вч моста, съём правда по I2C )))
 

DmitryR
Offline
Зарегистрирован: 12.05.2017

Навесной монтаж работает очень не стабильно, развёл плату, жду когда изготовят. Поэтому не могу проверить код. 
Выход компаратора, насколько я понял, подключаем к цифровому входу (D3 или D2)? 
(Компаратор AD8561 по некоторым причинам заменил на компаратор на ОУ, на выходе оу будет от 0,5 до 5В)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

DmitryR пишет:

Навесной монтаж работает очень не стабильно

кривые руки, а не навесной монтаж

DmitryR
Offline
Зарегистрирован: 12.05.2017

//кривые руки, а не навесной монтаж

Вам там наверно ведней, вы же владеете всей информацией

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

DmitryR пишет:

//кривые руки, а не навесной монтаж

Вам там наверно ведней, вы же владеете всей информацией

мне - видней, у меня есть букварь.

DmitryR
Offline
Зарегистрирован: 12.05.2017

Поздравляю, можете с ним идти дальше

Гриша
Offline
Зарегистрирован: 27.04.2014

Клапауций 112 пишет:

DmitryR пишет:

Навесной монтаж работает очень не стабильно

кривые руки, а не навесной монтаж

Во время практики в институте делал (под руководством) фотоприемник на 50-80Мгц (полоса 30МГц) на OPA687, другой делал сам на 30Мгц (AD8001) для дальномера. Сомневаюсь, что у вас полосы шире 10МГц. Мой монтаж на макетке в корпусе (частоты не самые низкие) ни один ни второй не "звенели", потому, что питание было правильно сделано, каскады согласованы. А в соседней лаборатории со смеху помирали от разводки простого УНЧ, который после сборки имел претензии на генератор белого шума. Клапауций хоть и не стесняется в выражениях, но говорит дело. С полосой до 10МГц  монтаж либо есть, либо его нет т.к. он не правильный. Поставьте пузырь, тому, кто плату разводил, если она не загудит или берите букварь. Пример ЧУДО МОНТАЖА по этой ссылке.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

контур работает в ударном режиме, там гармоник должно быть немеряно и чётных и нечётных, так что только экранирование

DmitryR
Offline
Зарегистрирован: 12.05.2017

Код работает

///////////////////////////////////
//
//  Пины копки и сигнала
// должны быть 2 и 3 в любом порядке
//

#define SIGNAL_PIN  3

///////////////////////////////////
//
//  Время ожидания продолжения сигнала в миллисекундах
// Если за это время уровень ни разу не стал LOW, 
// то считаем, что сигнал прекратился
//
#define CONTROL_PERIOD  1ul

///////////////////////////////////
//
// Возможные состояния измерителя
//
enum METER_STATES {
  WAITING_FOR_SIGNAL = 0, // Ждём LOW на сигнальный пин
  MEASURING,  // Измеряем
  READY // Закончили, результат готов
};

//////////////////////////////////
//
//  Переменная для хранени текущего состояния измерителя
// Изначальное состояние - ожидание нажатия кнопки
//
static volatile METER_STATES meterState = WAITING_FOR_SIGNAL;

//////////////////////////////////
//
// Переменные для хранения времени начала отсчёта
// и времени окончания отсчёта (пропадания сигнала)
//
static volatile unsigned long startSignalTime = 0, endSignalTime = 0;

//////////////////////////////////
//
// Функция - обработчик поступающего во 
// время измерения сигнала. Выполняется,
// когда на сигнальном пине появляется HIGH
//
void measureISR(void) {
  endSignalTime = millis(); // просто запоминем время
}

//////////////////////////////////
//
// Функция 
//
void waitingISR(void) {
  startSignalTime = endSignalTime = millis(); // запоминаем время
  detachInterrupt(SIGNAL_PIN - 2);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, measureISR, FALLING);
  meterState = MEASURING; // Изменяем состояние на "измеряем"
}

void setup(void) {
  Serial.begin(115200);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, waitingISR, RISING);
}

void loop(void) {
  if (meterState == MEASURING) {
      //
      // Проверяем, что с момент последнего HIGH 
      // прошло >= CONTROL_PERIOD миллисекунд
      //
      if (millis() - endSignalTime >= CONTROL_PERIOD) {
        //
        // если прошло, то заканчиваем измерения
        //
        detachInterrupt(SIGNAL_PIN - 2);
      meterState = READY; // закончили
      Serial.print("Result is: ");
      Serial.print(endSignalTime - startSignalTime);
      Serial.println(" milliseconds");
      }
  }
}

Выдаёт результат с точностью 1 млсек, однако время всего сигнала всего 6 млсек, как исправить точность измерений до мксек?
сам попробовал, получил не корректные данные 

Гриша
Offline
Зарегистрирован: 27.04.2014

DmitryR пишет:

Код работает

///////////////////////////////////
//
//  Пины копки и сигнала
// должны быть 2 и 3 в любом порядке
//

#define SIGNAL_PIN  3

///////////////////////////////////
//
//  Время ожидания продолжения сигнала в миллисекундах
// Если за это время уровень ни разу не стал LOW, 
// то считаем, что сигнал прекратился
//
#define CONTROL_PERIOD  1ul

///////////////////////////////////
//
// Возможные состояния измерителя
//
enum METER_STATES {
  WAITING_FOR_SIGNAL = 0, // Ждём LOW на сигнальный пин
  MEASURING,  // Измеряем
  READY // Закончили, результат готов
};

//////////////////////////////////
//
//  Переменная для хранени текущего состояния измерителя
// Изначальное состояние - ожидание нажатия кнопки
//
static volatile METER_STATES meterState = WAITING_FOR_SIGNAL;

//////////////////////////////////
//
// Переменные для хранения времени начала отсчёта
// и времени окончания отсчёта (пропадания сигнала)
//
static volatile unsigned long startSignalTime = 0, endSignalTime = 0;

//////////////////////////////////
//
// Функция - обработчик поступающего во 
// время измерения сигнала. Выполняется,
// когда на сигнальном пине появляется HIGH
//
void measureISR(void) {
  endSignalTime = millis(); // просто запоминем время
}

//////////////////////////////////
//
// Функция 
//
void waitingISR(void) {
  startSignalTime = endSignalTime = millis(); // запоминаем время
  detachInterrupt(SIGNAL_PIN - 2);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, measureISR, FALLING);
  meterState = MEASURING; // Изменяем состояние на "измеряем"
}

void setup(void) {
  Serial.begin(115200);
  pinMode(SIGNAL_PIN, INPUT);
  attachInterrupt(SIGNAL_PIN - 2, waitingISR, RISING);
}

void loop(void) {
  if (meterState == MEASURING) {
      //
      // Проверяем, что с момент последнего HIGH 
      // прошло >= CONTROL_PERIOD миллисекунд
      //
      if (millis() - endSignalTime >= CONTROL_PERIOD) {
        //
        // если прошло, то заканчиваем измерения
        //
        detachInterrupt(SIGNAL_PIN - 2);
      meterState = READY; // закончили
      Serial.print("Result is: ");
      Serial.print(endSignalTime - startSignalTime);
      Serial.println(" milliseconds");
      }
  }
}

Выдаёт результат с точностью 1 млсек, однако время всего сигнала всего 6 млсек, как исправить точность измерений до мксек?
сам попробовал, получил не корректные данные 

строки с 9 по 16 - с этим контроллером и кодом - никак, даже с micros()

показали бы времена еще в посте 7(на графиках), уже тогда ответили бы. В посте 16, в коде, строка 11 - чего тогда вопрос не задали???

DmitryR
Offline
Зарегистрирован: 12.05.2017

// строки с 9 по 16 - с этим контроллером и кодом - никак, даже с micros()

не понял смысл предложения.
// показали бы времена еще в посте 7(на графиках), уже тогда ответили бы. В посте 16, в коде, строка 11 - чего тогда вопрос не задали???

Когда моделировал, не знал, какой длительность сигнала будет, думал в милллисекундах.
Когда собрал в железе, оказалось микро