Доброй ночи! Есть Atmega8 к ней через ADC0 подключен переменный резистор на 10 кОм (крайний - +5v, средний - ADC, крайний - GND). Проблема в том, что уже где-то на половине хода ручки резистора, контроллер выдает максимальное значение, которое дальше не меняется до конца хода ручки. Подозреваю, что проблема в характеристике переменного резистора (лог, лин, эксп..). Вопрос в том, какой именно резистор мне нужен (если больше я ничего не перепутал, конечно) чтобы значения менялись плавно и равномерно в течение всего хода ручки переменного резистора? И, возможно есть возможность не менять резистор, а устранить этот недочет программно или средствами самого контроллера/языка программирования? В общем, как поступить в данной ситуации? Гуглил и яндексил, но все «вокруг да около», а того, что нужно найти не удалось, увы Заранее огромное спасибо всем помогающим!
_________________ The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Проблема в том, что уже где-то на половине хода ручки резистора, контроллер выдает максимальное значение, которое дальше не меняется до конца хода ручки.
1- Чтобы не гадать.. существует тестер. Простой тестер показывает все напряжение в схеме. Нас интересует напряжение на выходе резистора (относительно общего провода).
2- Думаю что проблема с настройкой самого АЦП в Atmega8.
Огромное спасибо за ответ! Кажется, я начинаю понимать ход Ваших мыслей... Типа максимальное напряжение может быть задано опорным... Хм... Язык Bascom AVR вот строка конфигурации АЦП в моей программе:
Отвечаю сам себе. Вот что пишут в справке по Bascom-у:
Цитата:
'The reference param may be : 'OFF : AREF, internal reference turned off 'AVCC : AVCC, with external capacitor at AREF pin 'INTERNAL : Internal 2.56 voltage reference with external capacitor ar AREF pin
А вот что удалось найти в даташите на контроллер:
Цитата:
27.5.2. ADC Voltage Reference The reference voltage for the ADC (VREF) indicates the conversion range for the ADC. Single ended channels that exceed VREF will result in codes close to 0x3FF. VREF can be selected as either AVCC, internal 2.56V reference, or external AREF pin. AVCC is connected to the ADC through a passive switch. The internal 2.56V reference is generated from the internal bandgap reference (VBG) through an internal amplifier. In either case, the external AREF pin is directly connected to the ADC, and the reference voltage can be made more immune to noise by connecting a capacitor between the AREF pin and ground. VREF can also be measured at the AREF pin with a high impedance voltmeter. Note that VREF is a high impedance source, and only a capacitive load should be connected in a system. If the user has a fixed voltage source connected to the AREF pin, the user may not use the other reference voltage options in the application, as they will be shorted to the external voltage. If no external voltage is applied to the AREF pin, the user may switch between AVCC and 2.56V as reference selection. The first ADC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result.
Однако, в даташите и справке по Bascom AVR говорится еще о каком-то конденсаторе, который якобы нужно "посадить" с AREF на GND! Что за конденсатор? Куда его подключать? Что делать с выводом AREF? Какая емкость этого конденсатора? Схема моего подключения: Пример взят отсюда. Как видите, этот вывод "висит" в воздухе. Правильно ли это? Если нет, то как правильно?
Еще есть вопрос о предделителе:
Код:
Prescaler = 128
Какое здесь значение лучше ставить и на что оно влияет? Или может быть лучше ограничиться автоматическим режимом:
Код:
Prescaler = Auto
?
_________________ The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
Все таки задам еще последний вопрос. Когда резистор находится в одном из крайних положений, все хорошо. Но когда он находится где-то посередине, то значения немного "прыгают" в пределах +/-1. Так как у меня программа написана таким образом что при смене значения она его пересылает по UART, то это приводит к постоянной пересылке данных! Есть ли какой-то штатный метод (программный или аппаратный) чтобы решить эту проблему? Или все же мне придется "лепить" свой "велосипед" внутри программы чтобы избежать повторной отправки данных больших или меньших на 2 единицы значений от предыдущего?
Заранее огромное спасибо за ответы!
_________________ The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Prescaler = 128 Какое здесь значение лучше ставить и на что оно влияет?
Оно влияет на частоту тактирования АЦП, которое, согласно ДШ, должно быть в пределах от 50 до 200 кгц при разрешении 10 бит и до 1000кгц при 8-битном разрешении. Каждое преобразование занимает 13 циклов этой частоты, что должно быть согласовано с периодом измерений.
Stass48 писал(а):
Есть ли какой-то штатный метод (программный или аппаратный) чтобы решить эту проблему?
Полностью гарантированно устранить прыгание не удастся. Для его уменьшения следуйте рекомендациям в секции ADC Noise Canceler в ДШ с учётом построения входной цепи и разводке её на плате. Поставьте хотя-бы RC-фильтр ФНЧ на входе АЦП, например, R=10K и C в пределах 0.1 до 1мкф. В программе совершайте несколько измерений, например 4 с суммированием результатов и последующим делением на 4 перед выдачей на UART. Эти меры значительно уменьшат прыгание и может редкие проявления его будут приемлимы с точки зрения посылки через UART. Если нет то "лепите велосипед" как указали выше.
-в качестве опорного напряжения может быть использовано (три варианта):
1- внутренний источник опорного напряжения - стабилизатор, напряжением 2.56 вольт. (Reference = Internal). 2- внешний источник опорного напряжения - вывод AREF (AREF pin). (Reference = AREF). (На вывод AREF мы можем подключить свой источник опорного напряжения (например второй резистор) и с его помощью мы можем установить верхний предел счёта какой захотим) 3- внешний источник опорного напряжения - вывод AVCC (AVCC pin). (Reference = Avcc).
Stass48 писал(а):
Что делать с выводом AREF?
Ничего. Он нам больше не нужен. Потому что у нас Reference = Avcc. Ну и пусть себе спокойно висит в воздухе)))
... говорится еще о каком-то конденсаторе, который якобы нужно "посадить" с AREF на GND! Что за конденсатор? Куда его подключать? Что делать с выводом AREF? Какая емкость этого конденсатора?
Таким образом, вывод AREF (AREF pin) оказывается подключённым к источнику питания AVCC (AVCC pin).
Использовать конденсатор на выводе AREF (AREF pin) или нет? В даташите рекомендуют подключить конденсатор... Но на самом деле я пробовал с конденсатором и без конденсатора. Мой АЦП в Atmega8 работает одинаково, что с конденсатором, что без конденсатора. Поэтому я на вывод AREF (AREF pin) ничего не подключаю. У меня вывод AREF (AREF pin) просто висит в воздухе. Просто я не люблю "лишнии" детали в схеме))
2- внешний источник опорного напряжения - вывод AREF (AREF pin). (Reference = AREF). (На вывод AREF мы можем подключить свой источник опорного напряжения (например второй резистор) и с его помощью мы можем установить верхний предел счёта какой захотим)
Такого варианта Bascom не предусматривает. Есть вариант Off, который, как я понял, и отключает все внутренние коммутации с опорным напряжением и передает управление ними на вывод AREF. Поправьте, если что-то не так понял.
_________________ The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Если быть точным... то в даташите Atmega8 написано следующее (своими словами): "Если установить Reference = Avcc, то вывод AREF (AREF pin) будет подключён к выводу AVCC (AVCC pin), через открытый транзистор."
То какой смысл ставить еще один конденсатор, если он и так уже у меня стоит на выводе AVCC:
Stass48 писал(а):
? Тут как бы все уже ясно, просто интересно докопаться до истины Огромное спасибо всем участвующим в теме!
_________________ The only one thing necessary for the triumph of evil ...is for good people to do nothing.
То какой смысл ставить еще один конденсатор, если он и так уже у меня стоит на выводе AVCC.
Вот и я так подумал... и выкинул этот конденсатор из схемы))
Stass48 писал(а):
Такого варианта Bascom не предусматривает. Есть вариант Off, который, как я понял, и отключает все внутренние коммутации с опорным напряжением и передает управление ними на вывод AREF.
Я в Bascom не разбираюсь)) Мне лучше на Си.
Как настраивать АЦП - не это не важно. Кому как удобней. Главное что-бы все чётко понимали как работает АЦП.
Мне проще установить нужные биты в регистре управления. Просто записать одной строчкой в программе:
ADMUX=0b01100001; // настройка АЦП, где:
//1... .... REFS1 - опорное напряжение - 0 //.1.. .... REFS0 - опорное напряжение - 1 - AVCC //..1. .... ADLAR - Выравнивание результата //...1 .... - //.... 1... MUX3 - номер канала //.... .1.. MUX2 - номер канала //.... ..1. MUX1 - номер канала //.... ...1 MUX0 - номер канала - ADC0...ADC7 (0000=ADC0)
значения немного "прыгают" в пределах +/-1. Так как у меня программа написана таким образом что при смене значения она его пересылает по UART, то это приводит к постоянной пересылке данных! Есть ли какой-то штатный метод (программный или аппаратный) чтобы решить эту проблему?
Ser60 писал(а):
Поставьте хотя-бы RC-фильтр ФНЧ на входе АЦП, например, R=10K и C в пределах 0.1 до 1мкф. В программе совершайте несколько измерений, например 4 с суммированием результатов и последующим делением на 4 перед выдачей на UART. Эти меры значительно уменьшат прыгание и может редкие проявления его будут приемлимы с точки зрения посылки через UART. Если нет то "лепите велосипед" как указали выше.
Всё верно.
1- для начала нужно стабилизировать напряжение питания (вывод AVCC) и напряжение на резисторе (на входе ADC0). Можно стабилизировать напряжение на входе ADC0 относительно AVCC (имеется ввиду, чтобы небыло резких скачков напряжения на входе ADC0 относительно вывода AVCC). Тогда при изменении питания, рузультат преобразования меняться не будет.
Поэтому включать резистор рекомендуется через RC-фильтр ФНЧ. Например так:
2- Чтобы значения не "прыгали" и приводили к постоянной пересылке данных, можно делать несколько измерений и брать среднее значение. Но эти меры только уменьшают "прыганье", но не устраняют их полностью. Поэтому я в своей программе "слепил велосипед" )). А точнее - добавил простой гистерезис.
Ахаха))) Я в СИ такой же, как Вы в Bascom Хотя знаю, что не мешало бы перейти на СИ так как он профессиональный и используется везде. Но, увы, простота Bascom-a уж очень сильно подкупает. Порог вхождения более низкий у него
Теперь оффтоп. Напишу для всех, а то мало ли. Я вот например полдня убил на то пока разобрался! Итак начнем. Как вы уже, наверное, поняли: я педант-перфекционист и моя дотошность не имеет границ! Я всегда хочу и пытаюсь делать все ПРАВИЛЬНО! В связи с этим я нашел вот эту статью: тыц. В ней описываются методы правильной обвязки для микроконтроллера. В данном случае возник казус с выводом Reset! И дело в том, что мне еще преподаватель мой говорил, что вывод Reset в воздухе лучше не оставлять! Вот здесь мы видим схему обвязки для вывода Reset: И вот что пишут в самой статье (цитата):
Цитата:
При отладке сложных программ может понадобиться осуществление принудительного сброса микроконтроллера. В этом случае удобно добавить в схему кнопку сброса, замыкание контактов которой будет подавать сигнал низкого уровня на вход RESET. Кнопку сброса обычно подключают вместе со стандартной RC-цепочкой.
Контакты кнопки при внутрисхемном программировании должны обязательно находиться в разомкнутом состоянии.
Ну и что же вы думаете? Ну во-первых, я собственноручно убил одну мегу только потому что думал что перегрел ее при пайке! Фена у меня нету! Есть только 25 Вт паяльник! Поэтому пришлось взять канцелярский нож, срезать под корень все выводы, мегу выкинуть и паяльником аккуратно убрать остатки отрезанных ножек. Сама мега не определялась USBasp-ом. Вот потому так. Только когда впаял вторую и получил то же самое - понял, что что-то тут не так! Проблема оказалась в частоте обмена данных между прорамматором и контроллером. Поставил поменьше и все стало ОК, контроллер определился и начал шиться. Но какое же мое удивление было когда я его прошил, а по UART он ничего не стал пересылать! Гуглил, яндексил - пофиг! Причем грешил на китайский преобразователь USB-TTL! Но нашел в инете одну идею: замкнуть на преобразователе RX и TX и попробовать отправить данные) Отправил и все вернулось обратно) Тогда понял что преобразователь тут не причем! Тогда - контроллер! Долбался еще часа три! Было такое ощущение что контроллер вообще "глухой". Наконец я уже решился просто помигать светодиодом! Подпаял светодиод с резистором и я просто офигел, когда и это у меня не получилось! Вывод однозначный – контроллер не запускается! Смотрел как "баран на новые ворота" на свою схему и взгляд пал на вывод Reset и на резистор 10 кОм. Отпаял резистор – светодиод сразу же замигал (контроллер запустился)! Далее прошил его на работу с UART – все "завелось вполоборота"! Вот и делайте выводы, друзья, какова цена педантичности и дотошности. Был бы я обычным "мудилой" – просто подал бы питание на контроллер и пофиг. Больше чем уверен что все бы работало как часы!
Кто может прокомментировать данную ситуацию?
_________________ The only one thing necessary for the triumph of evil ...is for good people to do nothing.
Проблема оказалась в частоте обмена данных между прорамматором и контроллером. Поставил поменьше и все стало ОК, контроллер определился и начал шиться.
Вообщето... в моей инструкции USBasp про это написано. Все новые Atmega8 идут с завода с настроенным внутренним тактовым генератором 1 Мгц. А в самом USBasp (у меня) есть перемычка, которая уменьшает частоту при программирования...
"Для осуществления возможности выбора частоты программирования, предусмотрена перемычка №1... Это необходимо при программировании микроконтроллеров, тактовая частота которых меньше 1,5 Мгц"
А вывод Reset сам USBasp притягивает к земле.. когда ему это нужно)) На счёт резистора - не знаю. У меня стоит резистор и всё работает чётко. И сбрасывается всё нормально. Только у меня без конденсатора. А вообще мне кажется надо разбираться с фьюзами. Там много всего)) И Reset можно настроить как обычный вывод... и время перезапуска МК устанавливается... У меня таких проблем небыло))
А вообще.. выпаивать сразу не обязательно.. Помоему обычные глюки МК)) Тут есть темы про всякие фьюзы - доктор)) Лечим залоченные МК ))
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения