dukeparrot

ATMEGA328P помогите разобраться с внутренним опорным напряжением

9 сообщений в этой теме

dukeparrot    0

Всем, доброго времени суток!

Пытаюсь запустить ADC на чипе 328p, чтобы работал от внутреннего опорного напряжения 1,1 В. Инициализирую ADC как положено и описано в даташите, сигнал снимаю с ADC0. Проблема в следующем, по идеи если выставлено опорное напряжение 1,1 В, это будет максимальное значение, которое я могу замерить с порта. Но у меня максимум показывает 5 В, как будто я беру опорное напряжение по питанию. Ниже код инициализации ADC:

 

void init_analog(){

      /* Enable clock to write ADC registers */
	PRR &= ~(1 << PRADC);

	ADMUX = (0x03 << REFS0) /* Internal 1.1V Voltage Reference with external capacitor at AREF pin */
	        | (0 << ADLAR)  /* Left Adjust Result: disabled */
	        | (0x00 << MUX0) /* ADC Single Ended Input pin 0 */;

	ADCSRA = (1 << ADEN)    /* ADC: enabled */
	         | (1 << ADATE) /* Auto Trigger: enabled */
	         | (1 << ADIE)  /* ADC Interrupt: enabled */
	         | (0x04 << ADPS0) /* 16 */;

	ADCSRB = (0x00 << ADTS0) /* Free Running mode */
	         | (0 << ACME) /* Analog Comparator Multiplexer: disabled */;

	DIDR0 = 1 << ADC0D /* Disable digital input buffer for ADC0 */;

        ADCSRA|=(1<<ADSC);
}

Этот код уже сгенерировал в http://start.atmel.com , до этого сам писал свой, смотрел чужой. Либо я что-то не так делаю, либо не понимаю как это работает. Вообщем прошу направить. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
ARV    379

При чем тут "показывает" и "инициализация"? АЦП у вас выдает попугаев, причем 1023 попугая выдается при входном напряжении равном или бОльшем, чем опорное. А потом уже при помощи всякой математики вы сами переводите попугаев в вольты или амперы или еще какие-то фактические единицы. Смотрите тот код, который "показывает" результат в вольтах - там собака порылась.

Изменено пользователем ARV
  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dukeparrot    0
20 минут назад, ARV сказал:

При чем тут "показывает" и "инициализация"? АЦП у вас выдает попугаев, причем 1023 попугая выдается при входном напряжении равном или бОльшем, чем опорное. А потом уже при помощи всякой математики вы сами переводите попугаев в вольты или амперы или еще какие-то фактические единицы. Смотрите тот код, который "показывает" результат в вольтах - там собака порылась.

 Я наверное неправильно проблему описал, меня не поняли. Попробую разъяснить, я сейчас не делаю никакой конвертации в вольты, считываю голые значения с ADC. При выборе внутреннего опорного напряжения 1,1 В, максимальное значение ADC должно давать 1023, у меня при подаче сигнала на ADC0 в 1,1 В, значение ADC показывает 228. Когда потенциометр выкручиваю до 5 В, только тогда я получаю 1023. Вот я хочу узнать, почему так,вроде я выбрал в инициализации что опорник у меня 1,1 В.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dukeparrot    0
1 час назад, GOR23 сказал:

Так вы наверное на AREF 5 вольт всадили.

 

AREF подключен через конденсатор к земле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GOR23    39

А какое на нём напряжение?

Или ещё вариант что где то в коде записали что-то в ADMUX напрямую и перетёрли его содержимое

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dukeparrot    0
2 минуты назад, GOR23 сказал:

А какое на нём напряжение?

 

А на нем показывает 5 В, надо было тоже это упомянуть сразу. Я замерял и не понимал почему там такое напряжение, я подумал что у меня чип бракованный,  но использовал другой, там так же. В схеме вроде ничего не должно быть такого, она простая: подключен двухстрочный дисплей и потенциометр к ADC0. Питание идет от программатора USBAsp.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GOR23    39

Ну должно быть на AREF 1,1 В. Варианта 2: или он всё таки подсоединён к 5 вольтам (сопля например где то), или дальше в программе в ADMUX что то записали не то, и он переключился.

Ну или так ещё попробовать, хотя врядли поможет...

ADMUX = (1 << REFS0)|(1 << REFS1);

 

Изменено пользователем GOR23
  • Лайк 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dukeparrot    0

Ну вообщем разобрался я, оказывается платка которую я брал на алиэкспресс для прошивки чипа, на ней VCC, AVCC и AREF соединены вместе. 

Не додумался посмотреть, извиняюсь что побеспокоил по пустякам. 

Всем спасибо, кто отвечал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас