пороговый уровень напряжения и проблема с миганием

Я использую Arduino Pro Mini 3,3 В, 8 МГц.VCC этого Arduino поступает от преобразователя переменного тока в постоянный с регулятором 3,3 В. Я слушаю аналоговые данные от делителя напряжения примерно 250 милливольт.

По сути, я хочу, чтобы аналоговое напряжение достигло 250 милливольт, тогда светодиод включался. В противном случае светодиод выключался. Я использую среднее значение 100 мс для данных о напряжении.

Но я видел, как мигал светодиод порогового напряжения. Например, уровень напряжения меняется 248-254.светодиод горит,светодиод,светодиод...Я не хочу мигать.

Что можно сделать в таких ситуациях? Уровень напряжения и слегка переменное напряжение?

Спасибо

, 👍0

Обсуждение

Внутреннее опорное напряжение 1,1 В может быть лучше в качестве эталонного. Для мигания на пороге добавьте в эскиз гистерезис., @Jot


2 ответа


0

Как упомянул Джот в своем комментарии, вы можете написать код, следящий за гистерезисом. Это означает, что светодиод включается только тогда, когда аналоговое значение немного выше порогового значения, и выключается только тогда, когда оно немного ниже порогового значения. Вы можете увидеть такое поведение в триггерах Шмитта, которые работают таким образом (хотя они получают гистерезис через соответствующую электрическую цепь, а не через код). Вы написали, у Вас показания напряжения зашумлены в пределах около 10мВ.

В зависимости от того, как структурирован ваш текущий код, вы можете достичь этой цели, используя операторы if:

if( value > threshold + margin ){
    digitalWrite(LED_pin, HIGH);
} else if( value < threshold - margin ) {
    digitalWrite(LED_pin, LOW);
}

Вы можете выбрать подходящее значение маржи (это зависит от желаемого поведения). Начните с запаса в 7 мВ (который должен отфильтровать шум в 10 мВ) и меняйте его, пока оно не будет работать должным образом.

,

Спасибо за ответ. Я хочу задать два вопроса. 1) Если маржа станет немного больше, что можно сделать? Если мы применим тот же подход, диапазон вырастет. 2) Каков метод чувствительной стабилизации переменного напряжения, исходящий от делителя напряжения, который содержит конденсатор фильтра шума и принимает среднее значение? Я ищу программный метод?, @alex jla

Извините, я не понимаю ваших вопросов (кажется, английский не ваш родной язык). Запас будет константой, которую вы выбираете в зависимости от шума вашего аналогового сигнала и желаемого поведения. Вы даже можете определить два поля для включения и выключения на разных полях. А что вы имеете в виду под делителем напряжения и конденсатором? Вы написали, что у вас есть сигнал, который меняется между 248мВ и 254мВ (шум). Я предложил программный метод., @chrisl

Извините за грамматические ошибки. Если диапазон шума данных напряжения 248–258 мВ, то вы правы. Я могу добавить запас в свой код. Но, например, если диапазон шума данных напряжения 190 мВ–300 мВ, что я могу сделать «Если я добавлю поля в свой код, это будет пустой тратой времени для уровня порогового напряжения переключателя. Спасибо., @alex jla

Если мое предложение слишком компромиссное, вы можете только попытаться уменьшить шум вашего сигнала. Уменьшение шума в аналоговом сигнале может оказаться сложной задачей. Вы можете добавить фильтр нижних частот (комбинация конденсатора и резистора). Вы можете попытаться изолировать электронику от источника шума (это может быть работающий двигатель, линия электропередачи поблизости и т. д.). Вы можете попытаться преобразовать чистый аналоговый сигнал в дифференциальный сигнал на расстоянии от источника до контактов Arduino (шум наводится в обеих линиях одинаково). Трудно ответить, не зная больше о приборе., @chrisl


1

Что представляет собой метод чувствительной стабилизации переменного напряжения? делитель напряжения, содержащий конденсатор фильтра помех и принимающий средний?

Вычисление среднего значения с использованием 3/4 текущего среднего значения и 1/4 нового измерения (экспоненциальное среднее) хорошо работает во многих ситуациях. Вы можете настроить константы по своему усмотрению, при условии, что их сумма составит 1,0. Я использую степень двойки и сдвиг для максимальной производительности:

// Exp. average: 3/4 old avg + 1/4 new data, with rounding
int16_t xpavg(int16_t newdat, int16_t avg){

   // (3 * avg + 1 * newdat) / 4
   return( (((avg<<2) - avg + newdat) + 2) >> 2 );
}
,