Нечеткое срабатывание отсчетов АЦП контроллера
Нечеткое срабатывание отсчетов АЦП контроллера
Вопрос: Как добиться четкого срабатывания АЦП контроллера. Имею ввиду границу между отсчетами. Требуется ловить десятые вольта. Уменьшать или увеличивать разрядность?
- Реклама
- НАПАЛМ
- Это не хвост, это антенна
- Сообщения: 1314
- Зарегистрирован: Пт ноя 27, 2009 19:47:13
- Откуда: Казань
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Если у вас слабый сигнал, то усильте его с помощью ОУ. Если сигнал занимает весь динамический диапазон, то увеличивайте разрядность. Если есть постоянная составляющая, до отфильтруйте ее, а переменную усильте.
ВременнЫе границы?Имею ввиду границу между отсчетами.
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Делитель обычный резистивный. Диапазон напряжений на АЦП контроллера 2.5В - 3В. АЦП 8 бит. Нет четкого срабатывания ,например, при значении АЦП 16 (То ли 17, то ли 16). На выходе ноги контроллера "болтает" 0 и 1.
- НАПАЛМ
- Это не хвост, это антенна
- Сообщения: 1314
- Зарегистрирован: Пт ноя 27, 2009 19:47:13
- Откуда: Казань
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Повышайте разрядность, если не хотите использовать преобработку сигнала.
http://chipenable.ru/index.php/programm ... ation.html
http://chipenable.ru/index.php/programm ... ation.html
Re: Нечеткое срабатывание отсчетов АЦП контроллера
что за переобработка сигнала?
- Реклама
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Я в одной из последних схем использовал гистерезис.diotec писал(а):Диапазон напряжений на АЦП контроллера 2.5В - 3В. АЦП 8 бит. Нет четкого срабатывания ,например, при значении АЦП 16 (То ли 17, то ли 16). На выходе ноги контроллера "болтает" 0 и 1.
АЦП контроллера 0В - 5В. АЦП 10 бит преобразую в 8 бит + 2 бита гистерезис (больше чем уровень шума на входе АЦП).
Четкое срабатывание. Значении АЦП или 17, или 16 не прыгает.))) На выходе ноги контроллера чётко 0 или 1.
Это как вариант))
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Проблемма в том, что у меня пониженное питание на контроллере 3.3В, особо не размахнешся.
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Вы хотите сказать что это шум? 10 бит хватит?
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Да какая разница какое питание... 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. Поэтому последний разряд не мигает.
Както так))
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Спасибо за информацию.
На сколько я понял при 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
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Напряжение с АЦП почти никогда не будет стоять как вкопанное, не ждите этого.
В нем всегда будет шум.
По этой причине величины, имеющие аналоговое происхождение, а также вещественные числа (float, double) не стоит подвергать проверке на равенство. Их проверяют по типу "больше-меньше".
При сравнении имеет смысл вводить гистерезис, предварительная цифровая фильтрация тоже может быть хорошей идеей.
По этой причине величины, имеющие аналоговое происхождение, а также вещественные числа (float, double) не стоит подвергать проверке на равенство. Их проверяют по типу "больше-меньше".
При сравнении имеет смысл вводить гистерезис, предварительная цифровая фильтрация тоже может быть хорошей идеей.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Как ввести программно гистерезис. Преобразовать 10бит в 8
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Нечеткое срабатывание отсчетов АЦП контроллера
Имелось в виду - сравнение на больше одного числа и меньше другого.
Типа :

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

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


