во-первых еще раз говорю про резисторы в коллекторах
во-вторых аналоговая земля мк и аналоговое питание должны всегда быть подключены, даже если ацп не используеш
в-третьих стабилитрон сгорит при кручении резистора, в твоем примере он не нужен просто, а защита входа делается не так
точнее входной делитель не так
13:04 в регистре адцв будет максимальное число 1023, т.к. 1024 - это количество комбинаций в 10 битах, а диапазон значений 0-1023
а зачем ты вызываеш функцию ацп, а потом в цикле фор береш результат из регистра?
у тебя же функция возвращает результат
на 15:08 я поржал конкретно
вот этот нолик я пропускаю, не знаю почему, но пропускаю, а то результаты не вписываются в теорию
а все потому, что неправильная схема делителя
объясняю
у тебя опорное 5в, т.к. ты выбрал avcc в конфигураторе
т.е. максимальное напряжение на входе ацп должно быть 5в и это будет 1023
у тебя максимальное измеряемое напряжение в 10 раз больше, поэтому ошибка на порядок и поэтому один ноль надо убирать
ну и нельзя просто так взять и умножить инт на флоат, как ты это делаеш
правильный компилятор не допускает такое умножение и требует преобразование типов
как нужно правильно делать?
параллельно входу ацп подключается резистор 10к, т.к. это рекомендуемое сопротивление, кратное 10 и оно достаточно низкое, чтобы шунтировать высокоомный вход ацп и в то же время не быть сильно большим
последовательно с этим резистором нужен еще один резистор
http://www.raltron.com/cust/tools/voltage_divider.asp вот как в этом калькуляторе
сопротивление р1 для 50в будет 90к
при таком сопротивлении можно поставить и стабилитрон на 5в
если напряжение больше 50в и резисторы смд, то надо несколько резисторов последовательно включать, чтобы не было пробоя
а чтобы в протеусе регулировать напряжение, надо с движка переменного резистора уже подавать на вход этого делитель 0-50в и тогда не надо выкидывать никакой ноль
17:55
адцв это не переменная, а регистр - специальная память в 2 байта в модуле ацп
в твоем быдлокоде умножение на регистр адцв сработало только поэтому
если бы это была переменная, то после отработки функции она бы была уничтожена
правильно нужно было делать так
int adc_result, voltage;
...
ацп 10 разрядный и там 1024 значения
5в/1024 = 0.0048в на один бит
adc_result = read_adc(5); // можно сразу умножить на 48, но так нагляднее
voltage = 48 * adc_result; при максимальном значении в 5в "напряжение" будет 49104 единицы (не выходит за рамки инт 65535)
делим это на 10000 и получаем 4.9104в (в твоем случае 49.1в должно быть)
эти преобразования надо делать в функции индикации, чтобы не плодить переменные с десятичными числами, 8 битные контроллеры их очень не любят
как видим, 10 битная точность тут нам нахер не нужна
---
резистор в протеусе на максимуме на самом деле не на максимуме, а вносит ошибку на 1 разряд ацп
такие дела
