Настройка АЦП в ATMega32.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Настройка АЦП в ATMega32.

Сообщение Pika4u »

Всем привет. Делаю устройство на этом МК,столкнулся с проблемой при использовании АЦП. Режим-однократное преобразование,запуск-записью единицы в соответствующий бит соответствующего регистра,но все время шлет одно и тоже значение,причем не 255 или 0,а 69. В программе измерения накапливаются(5 раз) и выводится среднее арифметическое. 5 измерений в моей программе-где-то секунда. Если искусственно понизить напряжение(присоединить двигатель),то показания наоборот растут. Стоит делитель напряжения(5.6к на вывод питания и 1.5к на землю). МК отправляет данные по радиоканалу и компьютер сам считает напряжение,но я сделал вывод самого значения АЦП-оно не меняется почти никогда. Питание-аккумулятор 6 В,последние два бита в регистре ADC отбрасываются. Вот код,заранее спасибо:

Код: Выделить всё

 CB(DDR_ADC,PIN_ADC);
  ADMUX=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(0<<REFS0)|(0<<REFS1)|(0<<ADLAR)|(0<<ADATE);
  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
  ADCSRA|=(1<<ADSC);
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Настройка АЦП в ATMega32.

Сообщение Jack_A »

Pika4u писал(а):

Код: Выделить всё


  ADMUX=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(0<<REFS0)|(0<<REFS1)|(0<<ADLAR)|(0<<ADATE);



И это весь код ? Надеюсь, ожидание окончания преобразования и приём результата имеется?
А чем приведённая конструкция лучше ADMUX=0 -- не понимаю. И вообще, если в данном бите 0, то при формировании константы его никуда двигать не надо, бо он нулём и так останется.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

Код не весь,результат считывается по прерыванию по окончанию,оно же включено.
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Настройка АЦП в ATMega32.

Сообщение AaNnDdRrEeYy »

для АЦП нужно опорное напряжение, так сказать линейка по которой мерить
задается битами REFS1 REFS0
у тебя нули а это значит Internal Vref turned off
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

AaNnDdRrEeYy писал(а):для АЦП нужно опорное напряжение, так сказать линейка по которой мерить
задается битами REFS1 REFS0
у тебя нули а это значит Internal Vref turned off

Блин,а этот момент я пропустил,попробую сейчас...
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

Еще интересней-когда стоит ЛЮБАЯ комбинация REFS1 и REFS0,то все равно одно и тоже значение! Даже,когда значение Reserved. Все равно та же цифра-69. И странно-с Мегой 8 все работало,пока не перешел на 32. AREF соединен с AVCC и VCC,вплотную к ногам висит конденсатор на землю 0.1 мкФ. Причем,что при внутреннем ИОН,что при ARED одно и тоже,вот что меня напрягает. Подключаю двигатель-показания иногда прыгают до 70 и все,опять 69 потом. Померил напряжение на выходе 7805-4.92 Вольта,совпадает с мультиметром,а на аккумуляторе по мультиметру 6.27,а показывает 6.41(
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Настройка АЦП в ATMega32.

Сообщение AaNnDdRrEeYy »

вот еще что проверь:
бит ADATE у тебя 0 - это значит что преобразовывать постоянно не надо, только один раз.
потом установкой бита ADCSRA|=(1<<ADSC); ты запускаешь преобразование - установка этого бита запускает преобразование только 1 раз.
я не вижу полный код программы но если установка этого бита происходит только 1 раз при инициализации то АЦП не будет преобразовывать постоянно.

есть два варианта
1. заставить преобразовывать постояно ADATE в 1
2. в главном цикле устанавливать бит ADCSRA|=(1<<ADSC);

Код: Выделить всё

while(1)
{
   ADCSRA|=(1<<ADSC);
}


мне кажется первый луче.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

Вот полный код,касающийся работы АЦП. Преобразование запускается только в нужный момент.

Код: Выделить всё

unsigned short voltage_in=0,voltage=0;
unsigned char count_adc;//Количество отсчетов для АЦП
void adc_init()//Функция инициализации АЦП
{
  CB(DDR_ADC,PIN_ADC);
  ADMUX|=(0<<MUX0)|(0<<MUX1)|(0<<MUX2)|(0<<MUX3)|(0<<MUX4)|(1<<REFS0)|(1<<REFS1)|(1<<ADLAR)|(0<<ADATE);
  SFIOR|=(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0);
  ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADIF)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
  ADCSRA|=(1<<ADSC);//Делаем первый отсчет
}
void Start_ADC_Convert()
{
  ADCSRA|=(1<<ADSC);
}

void ADC_Result()
{
  if(count_adc==5)//Если сделали 5 замеров напряжения
  {
    voltage_in=voltage;
    count_adc=0;//Обнуляем кол-во замеров
    voltage=0;//Обнуляем переменную для суммирования
  }

В главном файле:

Код: Выделить всё

#pragma vector =ADC_vect//Прерывание по завершению преобразования напряжения
__interrupt void ADC_vector(void)
{
  voltage+=ADCH;//Для большей точности накапливаем измерения
  count_adc++;//Сделано еще одно преобразование
}
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Re: Настройка АЦП в ATMega32.

Сообщение __Alexander »

Если опорное берется с AREF, то в REFS0 и REFS1 должны быть нули.

второе, где результат из ADCL?
и третье, вы накапливаете пять раз...

if(count_adc==5)//Если сделали 5 замеров напряжения
{
voltage_in=voltage;
count_adc=0;//Обнуляем кол-во замеров
voltage=0;//Обнуляем переменную для суммирования
}

а делить на пять потом кто будет?
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Настройка АЦП в ATMega32.

Сообщение AaNnDdRrEeYy »

глупость конечно сморозю, но все же, переменную count_adc не надо volatile обозвать?
давай код из main() сюда, всякие там sei() смотреть будем
Последний раз редактировалось AaNnDdRrEeYy Вт окт 01, 2013 15:11:22, всего редактировалось 1 раз.
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Настройка АЦП в ATMega32.

Сообщение AaNnDdRrEeYy »

__Alexander писал(а):Если опорное берется с AREF, то в REFS0 и REFS1 должны быть нули.


нет должно быть так REFS1 =0 REFS0=1

__Alexander писал(а):второе, где результат из ADCL?


у него ADLAR = 1, ADCL не нужен, его можно просто отбросить.

__Alexander писал(а):и третье, вы накапливаете пять раз...


if(count_adc==5)//Если сделали 5 замеров напряжения
{
voltage_in=voltage;
count_adc=0;//Обнуляем кол-во замеров
voltage=0;//Обнуляем переменную для суммирования
}

а делить на пять потом кто будет?


проблема в том что число в ADCH не меняется, даже если не делить то сумма то должна меняться, просто она будет в пять раз больше.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Настройка АЦП в ATMega32.

Сообщение Vov123 »

Всё-таки спрошу,я думал у товарища описка,но 2 раза это слишком,и как компилятор такое пропускает:
С какого перепугу в регистре ADMUX 9 бит?
И второе, это Вас Стиф Джобс научил так биты в ноль устанавливать?
AaNnDdRrEeYy
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Re: Настройка АЦП в ATMega32.

Сообщение AaNnDdRrEeYy »

не существующий бит (0<<ADATE) в ADMUX он все равно в 0 устанавливает.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

Ой,извините,сейчас код поправлю. Насчет деления на 5-сумма отправляется другому устройству через радиоканал посредством nrf24l01,напряжение рассчитывается компьютером. И еще,я уже писал,что почему-то на REFS ему пофиг,при любых значениях(включая Reserved) значение не меняется. :( Переменные,используемые для АЦП,в программе больше нигде не используются.
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Re: Настройка АЦП в ATMega32.

Сообщение __Alexander »

Что-то мне подсказывает, что сейчас ТС запутается окончательно.

AaNnDdRrEeYy писал(а):нет должно быть так REFS1 =0 REFS0=1

А давайте вы сейчас сделаете снимок страницы из документации, где вы вычитали этот бред.
__Alexander писал(а):второе, где результат из ADCL?

AaNnDdRrEeYy писал(а):у него ADLAR = 1, ADCL не нужен, его можно просто отбросить.

Конечно не нужен, т.к. число 1023 вполне умещается в один байт. )
Когда код не работет, такие отбросы не канают, надо для начала всё правильно настроить.
AaNnDdRrEeYy писал(а):проблема в том что число в ADCH не меняется, даже если не делить то сумма то должна меняться, просто она будет в пять раз больше.

число меняется, аж от нуля до трёх. только никому не говорите.
и даже если там пусто, то сумма из младшего разве не может переполнить переменную?
AaNnDdRrEeYy писал(а):не существующий бит (0<<ADATE) в ADMUX он все равно в 0 устанавливает.

мда. а откуда уверенность, что компилятор откинет именно этот бит? а я уверен что (0<<MUX0). Не?
Vov123 писал(а):С какого перепугу в регистре ADMUX 9 бит?

Ага. Только на меге8 работало )))))))
Pika4u писал(а): И еще,я уже писал,что почему-то на REFS ему пофиг

Ясно что пофиг, пытаясь записать 9 бит... настройки не проходят. У вас в каждой строчке ошибка, что вы хотели.
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Настройка АЦП в ATMega32.

Сообщение Vov123 »

А вот это для чего?

Код: Выделить всё

CB(DDR_ADC,PIN_ADC);


Судя по настройкам ADMUX считывание производится с ADC0 c 40 ножки(корпус DIP) проца.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

Я переключаю ножку на вход,корпус у меня tqfp,вот

Код: Выделить всё

#define DDR_ADC DDRA
#define PIN_ADC 0
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

Сейчас поотправлял значения регистров-все биты ставятся,все нормально,но все равно-даже при работе от внутреннего ИОН все то же значение.....
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Re: Настройка АЦП в ATMega32.

Сообщение __Alexander »

Pika4u писал(а):Сейчас поотправлял значения регистров-все биты ставятся,все нормально,но все равно-даже при работе от внутреннего ИОН все то же значение.....


давай весь код.
Аватара пользователя
Pika4u
Поставщик валерьянки для Кота
Сообщения: 2064
Зарегистрирован: Пт апр 24, 2009 11:39:16
Откуда: г.Оренбург

Re: Настройка АЦП в ATMega32.

Сообщение Pika4u »

Вот,код в архиве.Некоторые комментарии могли устареть.
Вложения
Molly 2.0 project IAR.rar
(157.21 КБ) 204 скачивания
Steve Jobs. 1955-2011. Мы помним, как ты преобразовал наш мир....
Ответить

Вернуться в «AVR»