Нечеткое срабатывание отсчетов АЦП контроллера
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33
Вопрос: Как добиться четкого срабатывания АЦП контроллера. Имею ввиду границу между отсчетами. Требуется ловить десятые вольта. Уменьшать или увеличивать разрядность?
- Реклама
Если у вас слабый сигнал, то усильте его с помощью ОУ. Если сигнал занимает весь динамический диапазон, то увеличивайте разрядность. Если есть постоянная составляющая, до отфильтруйте ее, а переменную усильте.
ВременнЫе границы?Имею ввиду границу между отсчетами.
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33
Делитель обычный резистивный. Диапазон напряжений на АЦП контроллера 2.5В - 3В. АЦП 8 бит. Нет четкого срабатывания ,например, при значении АЦП 16 (То ли 17, то ли 16). На выходе ноги контроллера "болтает" 0 и 1.
Повышайте разрядность, если не хотите использовать преобработку сигнала.
http://chipenable.ru/index.php/programm ... ation.html
http://chipenable.ru/index.php/programm ... ation.html
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33
- Реклама
Я в одной из последних схем использовал гистерезис.diotec писал(а):Диапазон напряжений на АЦП контроллера 2.5В - 3В. АЦП 8 бит. Нет четкого срабатывания ,например, при значении АЦП 16 (То ли 17, то ли 16). На выходе ноги контроллера "болтает" 0 и 1.
АЦП контроллера 0В - 5В. АЦП 10 бит преобразую в 8 бит + 2 бита гистерезис (больше чем уровень шума на входе АЦП).
Четкое срабатывание. Значении АЦП или 17, или 16 не прыгает.))) На выходе ноги контроллера чётко 0 или 1.
Это как вариант))
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33
Проблемма в том, что у меня пониженное питание на контроллере 3.3В, особо не размахнешся.
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33
Да какая разница какое питание... 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. Поэтому последний разряд не мигает.
Както так))
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. Поэтому последний разряд не мигает.
Както так))
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33
Спасибо за информацию.
На сколько я понял при 10 битах будет такпри переключении с 1 в 0 на выходе контроллера:
(adc0==16) (соответствует 2.5В)
(adc0==17) (соответствует 2.53В)
(adc0==18) (соответствует 2.55В)
(adc0==19) (соответствует 2.58В)
(adc0==20) (соответствует 2.6В) - переключается в 0
На сколько я понял при 10 битах будет такпри переключении с 1 в 0 на выходе контроллера:
(adc0==16) (соответствует 2.5В)
(adc0==17) (соответствует 2.53В)
(adc0==18) (соответствует 2.55В)
(adc0==19) (соответствует 2.58В)
(adc0==20) (соответствует 2.6В) - переключается в 0
- Сообщения: 7518
- Зарегистрирован: Вс мар 29, 2009 22:09:05
Напряжение с АЦП почти никогда не будет стоять как вкопанное, не ждите этого.
В нем всегда будет шум.
По этой причине величины, имеющие аналоговое происхождение, а также вещественные числа (float, double) не стоит подвергать проверке на равенство. Их проверяют по типу "больше-меньше".
При сравнении имеет смысл вводить гистерезис, предварительная цифровая фильтрация тоже может быть хорошей идеей.
По этой причине величины, имеющие аналоговое происхождение, а также вещественные числа (float, double) не стоит подвергать проверке на равенство. Их проверяют по типу "больше-меньше".
При сравнении имеет смысл вводить гистерезис, предварительная цифровая фильтрация тоже может быть хорошей идеей.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33
Как ввести программно гистерезис. Преобразовать 10бит в 8
Имелось в виду - сравнение на больше одного числа и меньше другого.
Типа :

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

Типа такого:
Код: Выделить всё
if (adc_value>THRESHOLD_HIGH)
{
output_value=1;
}
if (adc_value<THRESHOLD_LOW)
{
output_value=0;
}
Только И логическое, "&&".if((a>b) & (a<c))
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Упс.. Да, конечно же. ПоторопилсяYS писал(а):Только И логическое, "&&".
16,00Аlex писал(а):А если будет колебаться 16,75 - 17,0 - 16,75 - 17,0 - .... ?
16,25
16,50
16,75
17,00
это просто для пояснения принципа работы.
Очень просто. Для примера я тут делал простенькое радиуправление. Мне надо чтобы последний разряд не мигал (чтобы электропривод не дёргался туда-сюда от шума АЦП).diotec писал(а):Как ввести программно гистерезис. Преобразовать 10бит в 8
1- на все входы АЦП ставим фильтры (резистора + конденсатор) для уменьшения помех на входе АЦП. Пример: 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 бит... Петля гистерезиса выбирается из расчёта уровня шума на входе АЦП. Т.е. петля гистерезиса должна быть больше уровня шума. Тогда шум не влияет на показания индикатора. Т.е. последний бит не мигает.
P.S. переменную а и функцию int read_adc(char adc_input) можно убрать... Просто мне в программе так удобней. ))
- Сообщения: 18
- Зарегистрирован: Сб дек 22, 2012 09:47:33


