Не могу насторить АЦП в ATmega
Добавлено: Сб дек 11, 2010 06:08:27
Всем, привет!
Я в Proteus моделирую следующую простейшую задачку:
Микроконтроллер atmega16 принимает "данные" с аналогового датчика температуры, АЦП преобразовывает эти данные и они выводятся на дисплей. Но у меня естественно ничего не выводится, хотя с дисплеем я уже разобрался и он функционирует.

Питание МК и на входе делителя +5В внешнее.
Произвел калибровку датчика там же в Proteus:
T, град. U, В (на выходе делителя)
0 ----- 3.67
25 ----- 3.92
50 ----- 4.17
75 ----- 4.42
100 ----- 4.67
Вот код, написанный мной. Там инициализация АЦП и прерывание по преобразованию данных.
Пишу в Code::Blocks, компилятор WinAVR.
Прошу прощения если там полный бред написан

Конечно сперва, хотелось бы верно произвести инициализацию.
Вот, что написано в книге Шпака:


Как настраивал ADCSRA:

Я взял коэффициент деления 64 поэтому ADPS0 = 0, ADPS1 = 1, ADPS2 = 1.
Частота которая стоит у проца сейчас 8Мгц, в реальном устройстве 11Мгц будет от внешнего кварцевого резонатора.
ADIE = 1.
У Шпака следующий бит называется ADFR, но в документации ADATE.
В документации написано, что 1 в этом бите включает какой-то триггер и преобразование числа в АЦП начинается по нарастающему фронту, чтобы его включить также надо еще что-то где-то выставить в 1....короче, здесь я поставил ADATE = 0.
ADSC = 1.
ADEN = 1.
В итоге ADCSRA = 0b11001110
Как настраивал регистр ADMUX:

Датчик висит на ноге PA0 МК, поэтому MUX0..4 = 00000.
Внешний источник питания REFS1 = 0, REFS2 = 1.
Левое выравнивание преобразованных значений ADLAR = 0.
т.е ADMUX = 0b01000000
Так теперь о получении данных, они, как я понял, хранятся в регистрах ADCH и ADCL.
Все свои переменные я определил как unsigned char. Вычисления я провожу прямо в прерывании, это ,вроде бы, не очень хорошо??
Программе приходится ждать пока все вычислится, а так она могла дальше что-то делать.
Вычисления провожу по формуле:
Vin=(ADCH*256+ADCL)*Vref/1024
T=Vin*0,01
Vin - Напряжение на входе АЦП
Vref - Напряжение на входе делителя (напряжение питания)
T - температура
0,01 я получил из калибровки датчика (4.67 - 3.67)/100 т.е повышение температуры на 1 градус соответствует повышению напряжения на 0.01 В.
Не работает!!!!!! Что делать??? Может преобразование типов переменных не верное?
И еще как запустить преобразование в АЦП повторно? сбрасывать ADIF в ноль??
Помогите!!!!!!

Я в Proteus моделирую следующую простейшую задачку:
Микроконтроллер atmega16 принимает "данные" с аналогового датчика температуры, АЦП преобразовывает эти данные и они выводятся на дисплей. Но у меня естественно ничего не выводится, хотя с дисплеем я уже разобрался и он функционирует.

Питание МК и на входе делителя +5В внешнее.
Произвел калибровку датчика там же в Proteus:
T, град. U, В (на выходе делителя)
0 ----- 3.67
25 ----- 3.92
50 ----- 4.17
75 ----- 4.42
100 ----- 4.67
Вот код, написанный мной. Там инициализация АЦП и прерывание по преобразованию данных.
Пишу в Code::Blocks, компилятор WinAVR.
Прошу прощения если там полный бред написан

Конечно сперва, хотелось бы верно произвести инициализацию.
Вот, что написано в книге Шпака:


Как настраивал ADCSRA:

Я взял коэффициент деления 64 поэтому ADPS0 = 0, ADPS1 = 1, ADPS2 = 1.
Частота которая стоит у проца сейчас 8Мгц, в реальном устройстве 11Мгц будет от внешнего кварцевого резонатора.
ADIE = 1.
У Шпака следующий бит называется ADFR, но в документации ADATE.
В документации написано, что 1 в этом бите включает какой-то триггер и преобразование числа в АЦП начинается по нарастающему фронту, чтобы его включить также надо еще что-то где-то выставить в 1....короче, здесь я поставил ADATE = 0.
ADSC = 1.
ADEN = 1.
В итоге ADCSRA = 0b11001110
Как настраивал регистр ADMUX:

Датчик висит на ноге PA0 МК, поэтому MUX0..4 = 00000.
Внешний источник питания REFS1 = 0, REFS2 = 1.
Левое выравнивание преобразованных значений ADLAR = 0.
т.е ADMUX = 0b01000000
Так теперь о получении данных, они, как я понял, хранятся в регистрах ADCH и ADCL.
Все свои переменные я определил как unsigned char. Вычисления я провожу прямо в прерывании, это ,вроде бы, не очень хорошо??
Программе приходится ждать пока все вычислится, а так она могла дальше что-то делать.
Вычисления провожу по формуле:
Vin=(ADCH*256+ADCL)*Vref/1024
T=Vin*0,01
Vin - Напряжение на входе АЦП
Vref - Напряжение на входе делителя (напряжение питания)
T - температура
0,01 я получил из калибровки датчика (4.67 - 3.67)/100 т.е повышение температуры на 1 градус соответствует повышению напряжения на 0.01 В.
Не работает!!!!!! Что делать??? Может преобразование типов переменных не верное?
И еще как запустить преобразование в АЦП повторно? сбрасывать ADIF в ноль??
Помогите!!!!!!


