Страница 1 из 1

Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 19:32:28
diotec
Вопрос: Как добиться четкого срабатывания АЦП контроллера. Имею ввиду границу между отсчетами. Требуется ловить десятые вольта. Уменьшать или увеличивать разрядность?

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 19:50:17
НАПАЛМ
Если у вас слабый сигнал, то усильте его с помощью ОУ. Если сигнал занимает весь динамический диапазон, то увеличивайте разрядность. Если есть постоянная составляющая, до отфильтруйте ее, а переменную усильте.
Имею ввиду границу между отсчетами.
ВременнЫе границы?

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 20:06:14
diotec
Делитель обычный резистивный. Диапазон напряжений на АЦП контроллера 2.5В - 3В. АЦП 8 бит. Нет четкого срабатывания ,например, при значении АЦП 16 (То ли 17, то ли 16). На выходе ноги контроллера "болтает" 0 и 1.

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 20:43:58
НАПАЛМ
Повышайте разрядность, если не хотите использовать преобработку сигнала.
http://chipenable.ru/index.php/programm ... ation.html

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 20:59:30
diotec
что за переобработка сигнала?

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 21:01:15
roman.com
diotec писал(а):Диапазон напряжений на АЦП контроллера 2.5В - 3В. АЦП 8 бит. Нет четкого срабатывания ,например, при значении АЦП 16 (То ли 17, то ли 16). На выходе ноги контроллера "болтает" 0 и 1.
Я в одной из последних схем использовал гистерезис.

АЦП контроллера 0В - 5В. АЦП 10 бит преобразую в 8 бит + 2 бита гистерезис (больше чем уровень шума на входе АЦП).
Четкое срабатывание. Значении АЦП или 17, или 16 не прыгает.))) На выходе ноги контроллера чётко 0 или 1.

Это как вариант)) :tea:

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 21:05:39
diotec
Проблемма в том, что у меня пониженное питание на контроллере 3.3В, особо не размахнешся.

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 21:07:33
diotec
Вы хотите сказать что это шум? 10 бит хватит?

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Пн мар 28, 2016 21:45:05
roman.com
Да какая разница какое питание... 3В или 5В. Всё зависит от требуемой точности.

5В/8 бит: 5/256=0,019... В/бит.

3В/8 бит: 3/256=0,011... В/бит.

Последний бит прыгает из-за шума на входе АЦП. Между значениями 17 и 16 расстояния нет)) Поэтому от малейшей помехи перепрыгиваем с 16 сразу на 17.

Просто у меня АЦП 10 бит. Я сделал промежуточное значение АЦП. 8 бит + 2 бит гистерезис. Защита от шума. Обычный гистерезис. Мёртвая зона 2 бит.

Пример.

Для АЦП 8 бит имеем:
16
17

Берём АЦП 10 бит:
16,00
16,25
16,50
16,75
17,00

Результат АЦП 10 бит делим на 4. Получаем АЦП 8 бит.

Где 16,25 и 16,75 петля гестерезиса 0,5 (мертвая зона АЦП). Т.е. шум на входе АЦП амплитудой меньше 0,5 не вызывает переключение между 16 и 17. Поэтому последний разряд не мигает.

Както так)) :tea:

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 10:40:44
diotec
Спасибо за информацию.
На сколько я понял при 10 битах будет такпри переключении с 1 в 0 на выходе контроллера:
(adc0==16) (соответствует 2.5В)
(adc0==17) (соответствует 2.53В)
(adc0==18) (соответствует 2.55В)
(adc0==19) (соответствует 2.58В)
(adc0==20) (соответствует 2.6В) - переключается в 0

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 11:58:54
YS
Напряжение с АЦП почти никогда не будет стоять как вкопанное, не ждите этого. :) В нем всегда будет шум.

По этой причине величины, имеющие аналоговое происхождение, а также вещественные числа (float, double) не стоит подвергать проверке на равенство. Их проверяют по типу "больше-меньше".

При сравнении имеет смысл вводить гистерезис, предварительная цифровая фильтрация тоже может быть хорошей идеей.

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 12:30:42
diotec
Как ввести программно гистерезис. Преобразовать 10бит в 8

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 12:49:44
Аlex
Имелось в виду - сравнение на больше одного числа и меньше другого.
Типа :

Код: Выделить всё

if((a>b) & (a<c))
Где 16,25 и 16,75 петля гестерезиса 0,5 (мертвая зона АЦП). Т.е. шум на входе АЦП амплитудой меньше 0,5 не вызывает переключение между 16 и 17. Поэтому последний разряд не мигает.
А если будет колебаться 16,75 - 17,0 - 16,75 - 17,0 - .... ? :))

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 13:02:42
diotec
Вот оно так и колеблется!!!

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 13:46:25
YS
Гистерезис реализуется введением двух порогов сравнения.

Типа такого:

Код: Выделить всё

  if (adc_value>THRESHOLD_HIGH)
  {
    output_value=1;
  }
  if (adc_value<THRESHOLD_LOW)
  {
    output_value=0;
  }
if((a>b) & (a<c))
Только И логическое, "&&". :wink:

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 13:52:15
Аlex
YS писал(а):Только И логическое, "&&". :wink:
Упс.. Да, конечно же. Поторопился :oops:

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 14:12:55
roman.com
Аlex писал(а):А если будет колебаться 16,75 - 17,0 - 16,75 - 17,0 - .... ?
16,00
16,25
16,50
16,75
17,00
это просто для пояснения принципа работы. :) Аналогично для всех других значений (разрядов). 17 18 19 ... и т.д.
diotec писал(а):Как ввести программно гистерезис. Преобразовать 10бит в 8
Очень просто. Для примера я тут делал простенькое радиуправление. Мне надо чтобы последний разряд не мигал (чтобы электропривод не дёргался туда-сюда от шума АЦП).

1- на все входы АЦП ставим фильтры (резистора + конденсатор) для уменьшения помех на входе АЦП. Пример:
1.JPG
(191.9 КБ) 548 скачиваний
2- я ввёл гистерезис через буфер (промежуточное значение АЦП). На Си у меня это выглядит так:


Пример. АЦП - 10 бит. Выход данных на индикатор 6 бит. Гистерезис 1 бит.
......................
char a; // a-вход АЦП
char pb; // pb-буфер АЦП
char p; // p-индикатор
...
...
int read_adc(char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
...
...
void main(void)
{
...
...
ADMUX=ADC_VREF_TYPE & 0xff; // настройка АЦП
ADCSRA=0x83;
...
...

read_adc(0); // измерение PC0
a=ADCW/8; // 5v-01111111=128 - 7 бит (6 бит + 1 бит гистерезис).
//////////////////////////////////////////// фильтр входа - гистерезис:
if (a>pb+1) { // a-вход, pb-буфер, p-данные
p=a/2; //+128/2=64-00111111 - 6 бит.
pb=a;
};
if (a<pb-1) {
p=a/2; //-128/2=64-00111111 - 6 бит.
pb=a;
};
//////////////////////////////////////////// индикатор 6 бит:
if (p>31) {...=...;}; // 100% (>2,5 V)
if (32>p&&p>25) {...=...;}; // 75% (2...2,5 V)
if (26>p&&p>18) {...=...;}; // 50% (1,5...2 V)
if (19>p&&p>11) {...=...;}; // 25% (1...1,5 V)
if (12>p) {...=...;}; // 0% (0...1 V)
......................
и т.д.

Аналогично для 8 бит... Петля гистерезиса выбирается из расчёта уровня шума на входе АЦП. Т.е. петля гистерезиса должна быть больше уровня шума. Тогда шум не влияет на показания индикатора. Т.е. последний бит не мигает. :tea:
:roll:

P.S. переменную а и функцию int read_adc(char adc_input) можно убрать... Просто мне в программе так удобней. ))

Re: Нечеткое срабатывание отсчетов АЦП контроллера

Добавлено: Вт мар 29, 2016 14:19:43
diotec
Спасибо что разжевали, будем пробовать.