Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: [Новичок] АЦП на tiny45
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Urvin
Начал ковыряться с AVRками (есть некий опыт на PIC), пытаюсь использовать модуль АЦП.
Хочу узнать цифровое значение напряжения на ножке ADC0 относительно земли, опорное напряжение - напряжение питания. Выравнивание налево, чтобы получить 256 градаций.
Изначально между ножкой и землей стоит резистор 100К.

Пишу на WinAVR С.

Соотетственно, задаем в настройках:
Код
ADMUX = 0b00100000;
// 00xxxxxx - VCC used as Voltage Reference, disconnected from PB0 (AREF).
// xx1xxxxx - Выравнивание налево
// xxx0xxxx - REFS2=0, используем внешнее напряжение
// xxxx0000 - MUX: Single Ended Input: ADC0 (PB5)
ADCSRA = 0b11000011;
// 1xxxxxxx - ADEN=1, включить ацп
// x1xxxxxx - ADSC=1, включаем преобразование
// xx0xxxxx - ADATE=0
// xxx0xxxx - ADIF=0
// xxxx0xxx - ADIE=0, прерывания не требуются
// xxxxx011 - ADPS, делитель на 8


После инициализации запускается первое преобразование, его и последующие отлавливаю в главном цикле
Код
while (1)
{
    wdt_reset();

    adcPoll();
}


Сама функция обработки такая:
Код
static void adcPoll(void)
{
    // Если преобразование АЦП окончено
    if (!(ADCSRA & (1 << ADSC)))
    {
        uchar result = ADCH;
        // … некие преобразования …

        // Последующий запуск АЦП, ножки не меняю
        ADCSRA |= (1 << ADSC);
    }
}


Меня… эээ…. смущает то, что на ножке ADC0 при подачи питания (только при наличествующем МК) возникает напряжение порядка 1,7В и АЦП с радостью его измеряет…
Попутно периодически случаются перезагрузки микроконтроллера.

Где косяк, как его можно исправить?
Artem_Petrik
Похоже на этой ноге включен внутренний pullup резистор. Надо его отключить ( в соответствующий PORTx.y записать 0).

P.S. Хм, посмотрел datasheet, ADC0 этож reset. У Вас высоковольтный программатор что-ли?
Urvin
Программатор STK200/300 на LPT. Программирует норм)
А вот занять все ножки надо кровь из носа

Про pullup: если все ножки кроме PB1 и PB2 у меня на вход, стоят кнопки + резистор, на PB5 висит ADC0, будет такое похоже на правду?
Код
DDRB  = 0b00000110;
PORTB = 0;
Artem_Petrik
Цитата(Urvin @ Sep 23 2009, 18:44) *
Программатор STK200/300 на LPT. Программирует норм)
А вот занять все ножки надо кровь из носа

Ух ты, я был уверен, что отключив reset, потеряю возможность программировать. А какой прогой шьете?

Цитата(Urvin @ Sep 23 2009, 18:44) *
Про pullup: если все ножки кроме PB1 и PB2 у меня на вход, стоят кнопки + резистор, на PB5 висит ADC0, будет такое похоже на правду?
Код
DDRB  = 0b00000110;
PORTB = 0;

вполне.
Urvin
Шью в PonyProg, но RSTDISBL она даже не предлагает включить
Artem_Petrik
Цитата(Urvin @ Sep 23 2009, 19:00) *
Шью в PonyProg, но RSTDISBL она даже не предлагает включить

Дык, нога reset у Вас остается reset-ом. Так что АЦП будет показывать чертий-шо.

Пересмотрел datasheet - все правильно, если ресет отключить, то перепрограммировать можно только в HV режиме, когда на ногу reset 12 вольт подается. Но это уже конечно не при помощи STK200/300. А то я уже испугался  biggrin.gif .

Если шить Avreal-ом вроде включить rstdisbl можно, но потом перепрошить так просто не получится.
Urvin
мда.. попал я)
GDI
Ну почему попал? Ищите схему AVRDUDE там есть режим высоковольтного программирования или купите соответствующий программатор, STK-500, например.
Urvin
Уже занялся темой.
Я имел в виду, что обожаю попадать во всякие трудности)
domowoj
Можно кнопки повесить на одну ногу МК - на вход АЦП, замыканием кнопок изменяя входное напр.
Тогда одна нога освобождается, и будет Вам щястье.
Urvin
domowoj, Боюсь, в моем случае будет несколько некорректно использовать резистивные кнопки. Хотя с таким приемом я знаком.
Надеюсь завтра выкроить время, победить лень и собрать высоковольтный программатор)
RA3WUM
Цитата(Urvin @ Sep 23 2009, 19:44) *
А вот занять все ножки надо кровь из носа
Про pullup: если все ножки кроме PB1 и PB2 у меня на вход, стоят кнопки + резистор, на PB5 висит ADC0, будет такое похоже на правду?

Что мешает организовать кнопочную решётку?
Про один вход АЦП + набор резисторов тоже неплохой вариант, тем более всё равно он используется в программе.
Ну будет 2 измерения вместо одного через определённое время smile.gif
Urvin
Сегодня окончательно-таки выставил RSTDISBL и столкнулся с такой проблемой, что АЦП прекрасно реагирует на мои пальцы - измеряет наводку величиной ок 0,3 В при прикосновении к плате. Мне это категорически не нравится и мне даже кажется, что пики себя так не вели.
С чем это может быть связано? Можт я еще чего-то не знаю? =)

Схема включения кнопок такая:
smac
Цитата(Urvin @ Oct 11 2009, 12:09) *
...столкнулся с такой проблемой, что АЦП прекрасно реагирует на мои пальцы - измеряет наводку величиной ок 0,3 В при прикосновении к плате...


Дык когда все клавиши отпущены у вас вход АЦП практически в воздухе висит (100 К на землю это наверное многовато). Я бы уменьшил R7 килоом до 50. На всякий случай поставил бы резистор последовательно с пином ADC0 ом так 100, и от AC0 конденсатор 10 nF на землю. Опять же, на разводку смотреть надо.
Александр Куличок
С учетом пожеланий smac и своих расчетов предлагаю сделать следующую схему:
Ее преимущество в том,что при считывании 8-битного кода с АЦП старшие 3 бита уже дают номер нажатой кнопки.
Да и значение pull-down резистора уменьшено до 27к, что повысит помехоустойчивость. Конденсатор можно 10...47 нФ.
"Запас" по коду каждой кнопке при номиналах, указанных на схеме, составляет не менее 12 единиц МЗР АЦП (в режиме 8 бит). И при погрешностях резисторов 0% smile.gif
Но учтите, что для считывания кода кнопки нужно получить хотя-бы 2 одинаковых результата преобразования с интервалом 10...50 мс.
В приложенном zip-архиве xls-файл с расчетом данной схемы.

P.S. Сам схему не делал и не проверял. Если схема чем-то плоха, пусть профессионалы покритикуют.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.