shpuntic48 писал(а): 27 фев 2021, 04:17
Подскажите не работает аналоговый вход
управление потенциометром
Посмею утверждать исходя из собственного опыта, что функция map() или её представление в ядре ArduinoIDE
Код: Выделить всё
// Функция масштабирования (ядро)
long map(long x, long in_min, long in_max, long out_min, long out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
не работает в Attiny13, - неподъёмная она для "малютки" с SRAM всего 64bytes (одни аргументы функции и return отщипнут 24 байта а тут ещё умножение и деление). Несколько дней потерял надеясь, что это виноват [spoiler title= Протеус с его симуляцией схемы,]
Tiny13wTM1637.png
[/spoiler] но в железе получился тот-же результат, даже функцию map() приводил к беззнаковому целочисленному типу
uint16_t (
опять привет FLProg!) вместо long. К тому же указанная функция не упоминается как поддерживаемая в фреймворке MicroCore. Как решение рекоммендую применять вместо функции map() другие способы масштабирования:
[spoiler title= Первый способ]Битовый сдвиг ADC>>N (где N-колличество сдвигов или деление на 2 в степени N) для приведения диапазона измерений к значению АЦП: ADC>>1 соотв. диапазону 0...512 отсчётов (диапазон вольтметра=ADC/100, или 0...5,12V), ADC>>2 соотв. диапазону 0...256 отсчётов (диапазон изм.вольтметра- 0...2,56V или 25,6V, 256V, 0.256V) и т.д. Примененив способы приведения измеряемого диапазона к значениям АЦП с помощью подбора плеч делителя напряжения, сопротивления токового шунта, или коеффициента усиления (на ОУ) на входе, можно убрать погрешность (см.ниже) и избавиться вообще от ненужных пересчётов в настолько ограниченном пространстве.
Пример:
1) необходимый диапазон измерений (входного сигнала) 0...1,00V, выбрать AREF Internal (1.1V), макс ADC=1024 (сдвиг не нужен), вес/цент отсчета-0,0009765625В. Как результат- фактических 0,9765625V соответствует 1000 отсчётам, макс. погрешность -0,024В. Это значит что не нужны никакие рассчёты и достаточно для дисплея "сырого" значения АЦП (RAW), а разделитель дробей/запятую поставить в 1-м разряде (1, 024 В) или принять как есть результат в миливольтах для дисплея.
2) необходимый диапазон измерений 0...2,56В, AREF Internal (1.1V), при 2, 56V входных с помощью внешних делителей добиваемся на входе АЦП напряжения 1,1V, макс ADC=1024, применяем сдвиг ADC>>2 == 256 выводим сразу на дисплей как 256mV или с запятой 2.56V;
[/spoiler]
[spoiler title= Второй способ ]Применениё множественных измерений с накоплением (суммированием) результатов и отбрасыванием шума АЦП (девиаций измерений) или младших бит в которых он присутствует. Так для 2-х измерений суммирующее значение АЦП превратиться в диапазон 0...2048 отсчетов, 3-х в 0...3072, 4-х в 0...4096 и т.д. Этот принцип (упрощённо) заложен в основе оверсемплинга АЦП, как в ардуиносовместимых платах MassDuino328D, в которых 12-битный АЦП, и результат измерений 16-ти битный 0...65536 и в функциях усреднения значений/фильтрах. [/spoiler]
[spoiler title= Третий способ] Варьировать питанием МК (необходима высокоточная стабилизация) с включением AREF External (т.е. от питания МК). Таким образом макс.1024 отсчётов АЦП могут соответствовать от 1,8 до 5,5В для частоты тактирования до 4МГц и от 2,7 до 5,5В для максимальной частоты 9,6МГц тактирования от внутреннего RC-генератора без прескаллера. В таком случае резистор запитки АЦП отъест один вывод Attiny13 (ADC0 если не ошибаюсь). [/spoiler]
[spoiler title= И результат:]
Attiny13_analogRead_Write.ino
Attiny13_analogRead_Write.png
[/spoiler]
Удачи!
У вас нет необходимых прав для просмотра вложений в этом сообщении.