|
[Новичок] АЦП на tiny45 |
|
|
|
Sep 23 2009, 15:25
|

Участник

Группа: Участник
Сообщений: 37
Регистрация: 23-09-09
Из: Москва
Пользователь №: 52 540

|
Начал ковыряться с 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В и АЦП с радостью его измеряет… Попутно периодически случаются перезагрузки микроконтроллера. Где косяк, как его можно исправить?
Сообщение отредактировал Urvin - Sep 23 2009, 15:25
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Sep 23 2009, 15:44
|

Участник

Группа: Участник
Сообщений: 37
Регистрация: 23-09-09
Из: Москва
Пользователь №: 52 540

|
Программатор STK200/300 на LPT. Программирует норм) А вот занять все ножки надо кровь из носа Про pullup: если все ножки кроме PB1 и PB2 у меня на вход, стоят кнопки + резистор, на PB5 висит ADC0, будет такое похоже на правду? Код DDRB = 0b00000110; PORTB = 0;
|
|
|
|
|
Sep 23 2009, 15:54
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Цитата(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; вполне.
|
|
|
|
|
Sep 23 2009, 16:09
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Цитата(Urvin @ Sep 23 2009, 19:00)  Шью в PonyProg, но RSTDISBL она даже не предлагает включить Дык, нога reset у Вас остается reset-ом. Так что АЦП будет показывать чертий-шо. Пересмотрел datasheet - все правильно, если ресет отключить, то перепрограммировать можно только в HV режиме, когда на ногу reset 12 вольт подается. Но это уже конечно не при помощи STK200/300. А то я уже испугался  . Если шить Avreal-ом вроде включить rstdisbl можно, но потом перепрошить так просто не получится.
|
|
|
|
|
Sep 25 2009, 10:41
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 22-02-07
Пользователь №: 25 578

|
Цитата(Urvin @ Sep 23 2009, 19:44)  А вот занять все ножки надо кровь из носа Про pullup: если все ножки кроме PB1 и PB2 у меня на вход, стоят кнопки + резистор, на PB5 висит ADC0, будет такое похоже на правду? Что мешает организовать кнопочную решётку? Про один вход АЦП + набор резисторов тоже неплохой вариант, тем более всё равно он используется в программе. Ну будет 2 измерения вместо одного через определённое время
--------------------
Мужество есть лишь у тех, кто ощутил сердцем страх! В. Кипелов, Беги за солнцем.
|
|
|
|
|
Oct 11 2009, 08:09
|

Участник

Группа: Участник
Сообщений: 37
Регистрация: 23-09-09
Из: Москва
Пользователь №: 52 540

|
Сегодня окончательно-таки выставил RSTDISBL и столкнулся с такой проблемой, что АЦП прекрасно реагирует на мои пальцы - измеряет наводку величиной ок 0,3 В при прикосновении к плате. Мне это категорически не нравится и мне даже кажется, что пики себя так не вели. С чем это может быть связано? Можт я еще чего-то не знаю? =) Схема включения кнопок такая:
|
|
|
|
|
Oct 11 2009, 12:27
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(Urvin @ Oct 11 2009, 12:09)  ...столкнулся с такой проблемой, что АЦП прекрасно реагирует на мои пальцы - измеряет наводку величиной ок 0,3 В при прикосновении к плате... Дык когда все клавиши отпущены у вас вход АЦП практически в воздухе висит (100 К на землю это наверное многовато). Я бы уменьшил R7 килоом до 50. На всякий случай поставил бы резистор последовательно с пином ADC0 ом так 100, и от AC0 конденсатор 10 nF на землю. Опять же, на разводку смотреть надо.
|
|
|
|
|
Oct 11 2009, 21:19
|
Местный
  
Группа: Свой
Сообщений: 256
Регистрация: 6-03-06
Из: Украина, г. Винница
Пользователь №: 15 017

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