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

Обсуждаем контроллеры компании Atmel.
Ответить
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение diotec »

Вопрос: Как добиться четкого срабатывания АЦП контроллера. Имею ввиду границу между отсчетами. Требуется ловить десятые вольта. Уменьшать или увеличивать разрядность?
Реклама
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

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

Сообщение НАПАЛМ »

Если у вас слабый сигнал, то усильте его с помощью ОУ. Если сигнал занимает весь динамический диапазон, то увеличивайте разрядность. Если есть постоянная составляющая, до отфильтруйте ее, а переменную усильте.
Имею ввиду границу между отсчетами.
ВременнЫе границы?
Реклама
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение diotec »

Делитель обычный резистивный. Диапазон напряжений на АЦП контроллера 2.5В - 3В. АЦП 8 бит. Нет четкого срабатывания ,например, при значении АЦП 16 (То ли 17, то ли 16). На выходе ноги контроллера "болтает" 0 и 1.
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

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

Сообщение НАПАЛМ »

Повышайте разрядность, если не хотите использовать преобработку сигнала.
http://chipenable.ru/index.php/programm ... ation.html
Реклама
Эиком - электронные компоненты и радиодетали
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение diotec »

что за переобработка сигнала?
Реклама
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение roman.com »

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

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

Это как вариант)) :tea:
Реклама
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение diotec »

Проблемма в том, что у меня пониженное питание на контроллере 3.3В, особо не размахнешся.
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение diotec »

Вы хотите сказать что это шум? 10 бит хватит?
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение 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:
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение 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
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

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

Сообщение YS »

Напряжение с АЦП почти никогда не будет стоять как вкопанное, не ждите этого. :) В нем всегда будет шум.

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

При сравнении имеет смысл вводить гистерезис, предварительная цифровая фильтрация тоже может быть хорошей идеей.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение diotec »

Как ввести программно гистерезис. Преобразовать 10бит в 8
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Имелось в виду - сравнение на больше одного числа и меньше другого.
Типа :

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

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

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

Сообщение diotec »

Вот оно так и колеблется!!!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

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

Сообщение YS »

Гистерезис реализуется введением двух порогов сравнения.

Типа такого:

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

  if (adc_value>THRESHOLD_HIGH)
  {
    output_value=1;
  }
  if (adc_value<THRESHOLD_LOW)
  {
    output_value=0;
  }
if((a>b) & (a<c))
Только И логическое, "&&". :wink:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

YS писал(а):Только И логическое, "&&". :wink:
Упс.. Да, конечно же. Поторопился :oops:
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

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

Сообщение 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) можно убрать... Просто мне в программе так удобней. ))
diotec
Родился
Сообщения: 18
Зарегистрирован: Сб дек 22, 2012 09:47:33

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

Сообщение diotec »

Спасибо что разжевали, будем пробовать.
Ответить

Вернуться в «AVR»