Attiny85 - метод отбрасывания задержек ADC?

У меня есть проблема, которую мне нужно решить, поэтому я просто буду как можно больше.

В основном существует система с микроконтроллером, где он считывает 2 датчика. Эти 2 датчика имеют тип переменного сопротивления, так как их измеряемое значение выводится как разное сопротивление. Например, один датчик давления, где при 0psi датчик имеет значение 20 Ом на землю, а для 100psi он имеет значение 120ohms. Датчик подключается между заземлением и резистором с фиксированным значением, поэтому выход действует как делитель напряжения.

Микроконтроллер, по-видимому, мультиплексируется путем переключения между двумя датчиками (возможно, из-за использования одного АЦП), в случайное время (поскольку микроконтроллер выполняет другие функции), но прибл. каждые 80 мс для каждого датчика и около 40 мс между каждым датчиком. Таким образом, при 0 мс он считывает один датчик, через 40 мс другой датчик, и на 80 мс обратно на первый датчик и так далее. Я понятия не имею, почему они не использовали фиксированное подтягивание, но подтягивание выполняется только тогда, когда контроллер хочет прочитать датчик только около 120us.

Я хотел прочитать эти датчики для ввода в ECU, не затрагивая оригинальное устройство. Таким образом, самое простое решение, которое я мог бы придумать, поскольку подтягивание не всегда велико для выполнения чтения, заключалось в том, чтобы добавить еще один микроконтроллер (в моем случае Digispark, основанный на ATtiny85, работающий на 16,5 МГц). В качестве альтернативы я мог бы открыть устройство и изменить его, чтобы использовать фиксированное подтягивание, но, допустим, я хочу избежать этого маршрута. Digispark по существу считывает оба выхода датчика, и когда он видит напряжение над землей, он выводит его в ЭБУ. С тех пор я обновил программу, чтобы проверить значения АЦП, которые он считывает, чтобы он находился между номинальным диапазоном датчика. И в то время как это работает, бывают случаи, когда АЦП будет считывать неправильное значение и выводит его в ECU, который выглядит как случайные всплески и провалы в данных.

Посмотрите на мой следующий код:

  const int oil_in = 0; //P5
  const int temp_in = 1; //P2
  const int oil_out = 1; //P1
  const int temp_out = 4; //P4
  int oil_value = 0;
  int oil_value_good = 0;
  int temp_value = 0;
  int temp_value_good = 0;

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(oil_out, OUTPUT);
  pinMode(temp_out, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  oil_value = analogRead(oil_in);
  if (oil_value > 106 && oil_value < 466)
  {
    oil_value_good=oil_value;
    analogWrite (oil_out, oil_value_good/4);
  }

    temp_value = analogRead(temp_in);
  if (temp_value > 113 && temp_value < 920)
 {
    temp_value_good=temp_value;
    analogWrite (temp_out, temp_value_good/4);
  }
}

Каждый вывод ADC имеет диапазон допустимых значений. Они соответствуют номинальным значениям MIN AND MAX для каждого датчика. Однако бывают случаи, когда АЦП будет считываться в неподходящее время и будет выдавать значение MIN или MAX в зависимости от условия. Я могу воспроизвести это на макете, указав входной сигнал АЦП на номинальное значение, и, закоротив его на землю или VCC (5 В), я иногда могу обмануть АЦП, чтобы прочитать значение MIN или MAX. И поскольку следующее измерение будет выполнено через некоторое время, выход будет производить эти всплески. Поскольку между показаниями нет никакой синхронизации, эти данные ошибки иногда могут выводиться в течение 1-1,5 секунд.

Я пробовал много думать об этой проблеме, но я не уверен в определенном решении, которое устранит эту проблему. АЦП прерывает, изменяет предварительный сканер ADC, фильтрует данные, проблема в том, что окно чтения действительно мало (100-120us).

Также номинальные входные значения АЦП для каждого датчика находятся между 0,56 В-2,33 В для одного датчика и 0,6 В-4,68 В для другого датчика. Не уверен, что прерывание может быть даже активировано при таком низком напряжении.

Как вы думаете, я должен продолжить?

С уважением

2 голоса | спросил TnF 10 AM00000010000003631 2017, 01:47:36

1 ответ


3
  

Я понятия не имею, почему они не использовали фиксированное подтягивание, но подтягивание   выполняется только тогда, когда контроллер хочет прочитать датчик только   около 120us.

Если вы хотите получить хорошее разрешение при измерении сопротивления, сопротивление вашего подтягивания должно быть в том же диапазоне, что и сопротивление вашего датчика. Если ваши датчики имеют низкое сопротивление, это означает, что делитель напряжения будет потреблять значительный ток. Чтобы сэкономить энергию, имеет смысл задействовать делитель напряжения только тогда, когда вы выполняете измерение.

  

окно чтения действительно мало (100-120us).

Это действительно так. Если вы analogRead() один канал в плотном loop, вы получите одно чтение каждые 108,6 мкс (128 × 14 CPU циклов ÷ 16,5 МГц), и у вас есть небольшой риск пропустить окно. Если вы читаете два канала, то у вас есть риск 50% отсутствует окно.

Вот что я сделал бы:

  1. Установите предикатор ADC на 64 вместо 128. Таким образом вы получите один считывая примерно каждые 54 мкс и по меньшей мере один образец (но больше часто два) во время чтения.

  2. Прочитайте одиночный канал в узком цикле, пока не получите значение выше ваш минимум. Затем сделайте еще одно чтение и используйте самую большую из два в качестве «хорошего» значения.

  3. Переключитесь на другой канал и вернитесь к шагу 2.

Это предполагает, что за пределами окна чтения ваш вход АЦП читается близко к нулю, поскольку он заземлен через датчик, без подтягивания. Ты тогда имеют на каждом канале последовательность положительных импульсов, и вы хотите измерьте высоту этих импульсов. Существует небольшой риск для вас сэмплирование нарастающего фронта импульса, что может привести к неправильному значению который, тем не менее, выше вашего минимума. Если это произойдет, то следующий образец будет находиться вблизи центра импульса. Вот почему я рекомендую взяв один дополнительный образец и используя самый большой из двух.

ответил Edgar Bonet 10 AM000000100000005431 2017, 10:27:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132