А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 бит... Петля гистерезиса выбирается из расчёта уровня шума на входе АЦП. Т.е. петля гистерезиса должна быть больше уровня шума. Тогда шум не влияет на показания индикатора. Т.е. последний бит не мигает.
P.S. переменную
а и функцию
int read_adc(char adc_input) можно убрать... Просто мне в программе так удобней. ))