Цена разряда может быть 9.5 или 10.5 мВ, если округлять до 10, то это уже погрешность 5%, получим ли мы точность два знака после запятой? Поэтому и умножают на, допустим, 9.765625 * 256 = 2500, с последующим сдвигом вправо на 8.
Правильное выполнение арифметических операций?
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=4204243#p4204243"]цена разряда у нас 10/1024=0,009765625. это примерно 10 мв, т.е. вы можете измерять 10В с дискретностью в 10 мв. значит, чтобы узнать значение измеряемого входного напряжения в МИЛЛИВОЛЬТАХ, вы должны умножить результат АЦП на 10.[/uquote]
Цена разряда может быть 9.5 или 10.5 мВ, если округлять до 10, то это уже погрешность 5%, получим ли мы точность два знака после запятой? Поэтому и умножают на, допустим, 9.765625 * 256 = 2500, с последующим сдвигом вправо на 8.
Цена разряда может быть 9.5 или 10.5 мВ, если округлять до 10, то это уже погрешность 5%, получим ли мы точность два знака после запятой? Поэтому и умножают на, допустим, 9.765625 * 256 = 2500, с последующим сдвигом вправо на 8.
- Реклама
Reflector, это уже тонкости. главное-то - отсутствие деления и нужды в float.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
А если опорное опустить на отметку 4.096В и замерять соответственно от 0 ... 8.192В, то цена разряда будет аккурат равна 0,008В, и это не примерно, а ровно 8мВ, без всяких дробных значений.ARV писал(а):мы измеряем 0...10В через делитель, который при 10В на входе выдает 5В, т.е. величину, равную опорному. АЦП при максимуме на входе выдает 1023, т.е. цена разряда у нас 10/1024=0,009765625. это примерно 10 мв,
Я с своих поделках так и делаю - подбираю аналоговую часть так, чтобы 1 (или 2 или 4 или
отсчетов составляли 1 (или 2 или 5) единиц младшего разряда, при этом диапазон АЦП оказывается шире шкалы (как правило оказывается задействовано 1000 отсчетов из имеющихся 1024) как поступать с "хвостами" зависит от проекта: можно overload или error показывать, можно отображаемую шкалу расширить...
Видно ведь, когда значение прирастает то на 2, то на 3... (видал устройство с 5 знаками после запятой, но прирастало оно на 116-117 единиц - выглядит как кроссовки Абибас красиво пока не присмотришься) и меня это раздражжает, ИМХО гораздо приятней когда меняется например на 5, т.е. 0, 5, 10, 15... можно даже этот младший разряд меньше сделать, как на FM приёмниках...
Добавлено after 19 minutes 39 seconds:
даже если этот неравномерный прирост спрятан под неотображаемым разрядом (а при некратности шагов АЦП и шкалы он будет) то это тоже может озадачить: например заряжаешь аккумулятор и смотришь как растет на нем напряжение, а оно с 3,99 до 4 В вырасло за 5 секунд, 4 - 4,01 за 10с, 4,01 - 4,02 за 6с... вот сиди и гадай, почему зарядка нестабильна.
а виной тому некратность единиц - гдето в единицу после округления влазит 1 отсчет АЦП, гдето 2...
Видно ведь, когда значение прирастает то на 2, то на 3... (видал устройство с 5 знаками после запятой, но прирастало оно на 116-117 единиц - выглядит как кроссовки Абибас красиво пока не присмотришься) и меня это раздражжает, ИМХО гораздо приятней когда меняется например на 5, т.е. 0, 5, 10, 15... можно даже этот младший разряд меньше сделать, как на FM приёмниках...
Добавлено after 19 minutes 39 seconds:
даже если этот неравномерный прирост спрятан под неотображаемым разрядом (а при некратности шагов АЦП и шкалы он будет) то это тоже может озадачить: например заряжаешь аккумулятор и смотришь как растет на нем напряжение, а оно с 3,99 до 4 В вырасло за 5 секунд, 4 - 4,01 за 10с, 4,01 - 4,02 за 6с... вот сиди и гадай, почему зарядка нестабильна.
а виной тому некратность единиц - гдето в единицу после округления влазит 1 отсчет АЦП, гдето 2...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="ARV",url="/forum/viewtopic.php?p=4204249#p4204249"]Reflector, это уже тонкости. главное-то - отсутствие деления и нужды в float.[/uquote]
ARV, Вы придираетесь к мелочной детали, упорно игнорируя всю картину. Вам уже Reflector говорит то же самое. Умножение с последующим делением на ДВА В СТЕПЕНИ N, ГДЕ N - РАЗРЯДНОСТЬ АЦП И ВСЕГДА ЯВЛЯЕТСЯ КОНСТАНТОЙ, ЗАВЯЗАННОЙ ЗА КОНКРЕТНОЕ ЖЕЛЕЗО. Зачем делить, когда я говорю о СДВИГЕ? То есть, умножил, за тем сдвинул на N бит вправо. Это по производительности и занимаемому месту далеко не то же самое, что умножить и за тем поделить. Обе операции (умножение и сдвиг) поддерживает любая ATMEGA аппаратно, что плюс к скорости выполнения и размеру кода.
Почему-то у меня не возникло проблем с производительностью в проекте, где камень постоянно мусолит I2C, работая с дисплеем и RTC через прерывания. Не помешал и системный таймер, который отвлекает прерыванием каждую миллисекунду и инкрементирует int32_t в прерывании. Не мешает и постоянная работа с UART, код которого использует все три прерывания этого интерфейса. И АЦП с той жуткой конструкцией - тоже в прерывании. Программа все успевает выполнять и в основном цикле. И кнопки опросить и дисплей обновить и посмотреть, который час и информацию обработать. При этом даже реакция на действия пользователя работает четко. Без малейших тормозов. Проект под ATmega168. И если мне не хватило бы места, я просто заменил бы его на ATmega328 без переделки кода. Да, в проекте есть места, которые можно существенно оптимизировать по размеру кода (использовать шаблоны классов для реализации наследования и полиморфизма), но зачем тратить время, когда результат полностью устраивает.
ЗЫ: В дискуссии я заметил признаки виляния из стороны в сторону, за сим не вижу смысла в ней больше участвовать.
ARV, Вы придираетесь к мелочной детали, упорно игнорируя всю картину. Вам уже Reflector говорит то же самое. Умножение с последующим делением на ДВА В СТЕПЕНИ N, ГДЕ N - РАЗРЯДНОСТЬ АЦП И ВСЕГДА ЯВЛЯЕТСЯ КОНСТАНТОЙ, ЗАВЯЗАННОЙ ЗА КОНКРЕТНОЕ ЖЕЛЕЗО. Зачем делить, когда я говорю о СДВИГЕ? То есть, умножил, за тем сдвинул на N бит вправо. Это по производительности и занимаемому месту далеко не то же самое, что умножить и за тем поделить. Обе операции (умножение и сдвиг) поддерживает любая ATMEGA аппаратно, что плюс к скорости выполнения и размеру кода.
Почему-то у меня не возникло проблем с производительностью в проекте, где камень постоянно мусолит I2C, работая с дисплеем и RTC через прерывания. Не помешал и системный таймер, который отвлекает прерыванием каждую миллисекунду и инкрементирует int32_t в прерывании. Не мешает и постоянная работа с UART, код которого использует все три прерывания этого интерфейса. И АЦП с той жуткой конструкцией - тоже в прерывании. Программа все успевает выполнять и в основном цикле. И кнопки опросить и дисплей обновить и посмотреть, который час и информацию обработать. При этом даже реакция на действия пользователя работает четко. Без малейших тормозов. Проект под ATmega168. И если мне не хватило бы места, я просто заменил бы его на ATmega328 без переделки кода. Да, в проекте есть места, которые можно существенно оптимизировать по размеру кода (использовать шаблоны классов для реализации наследования и полиморфизма), но зачем тратить время, когда результат полностью устраивает.
ЗЫ: В дискуссии я заметил признаки виляния из стороны в сторону, за сим не вижу смысла в ней больше участвовать.
I am DX168B and this is my favourite forum on internet!
- Реклама

