АЦП. Разбор полётов

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: АЦП. Разбор полётов

Сообщение U235 »

Да оставьте, заработает - поэксперементируете. Только вот один момент - после запуска АЦП нужно время для завершения преобразования.
Если не используются прорывания - либо ставить задержку (что не очень красиво) либо цикл, из которого выходите только когда флаг прерывания появился.
Этот флаг, кстати, нужно будет сбрасывать программно.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: АЦП. Разбор полётов

Сообщение zero648 »

просто КОТ писал(а):А теперь вопрос -- вместо регистр писать ADCL или ADCH. Или как их сложить. Что-то мой моск перестал думать.

Если точность не сильно важна, можно результат АЦП прижать влево, читать только ADCH и тупо умножить на 4 равносильно <<2
ADMUX|=(1<<ADLAR)
ADCC=(ADCH<<2)
За синтаксис не ругайте, возможно, что-то не правильно написал, ну в общем суть вы поняли. :))
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Лучше ИМХО точно -- мне надо слабые отклонения улавливать. А про флагши -- через дэлей легче. Вот только на сколько мс ставить?!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
U235
Встал на лапы
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Re: АЦП. Разбор полётов

Сообщение U235 »

просто КОТ писал(а):.... А про флагши -- через дэлей легче. Вот только на сколько мс ставить?!

Легче - не значит лучше. Измените частоту процессора или предделитель АЦП - и опять задержку пересчитывать.
А так

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

        while (!(ADCSRA & 0x10));
        ADCSRA|=0x10;

просто и надёжно.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: АЦП. Разбор полётов

Сообщение siamds »

Код, переключения светодиодов скомпилированный в CV_AVR во вложении. Там же результат компиляции промоделированной в Proteus’e. Если возникнут вопросы – вышлю комментарий к каждой строчке программы.
Вложения
ATTiny_13.rar
Код программы
(45.07 КБ) 208 скачиваний
Последний раз редактировалось siamds Вт авг 14, 2012 13:47:05, всего редактировалось 1 раз.
На каждого Моцарта есть свой Сальери.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: АЦП. Разбор полётов

Сообщение zero648 »

Зачем делей, проверяй просто флаг, если конвертация завершилась, он сбросится.
Я так делал:

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

ADCSRA=(1<<ADEN)|(1<<ADSC)|(0b011<<ADPS0); //Запускаем конвертор, предделитель частоты 1:8
While(ADCSRA & (1<<ADSC)); // ждем окончания конвертации
ADCC=(unsigned int)ADCH<<8 | ADCL;
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

Не надо возиться отдельно со старшим и с младшим байтами результата АЦП. У Вас же CodeVision. Там можно сразу считывать результат (слово из двух байтов) из "регистра" ADCW:

unsigned int adc;
adc = ADCW;

А ещё лучше запустите визард. Он Вам автоматом сгенерит код для фукции АЦП. Что-нибудь вроде:

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

unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;


siamds писал(а):вышлю комментарий к каждой строчке программы
Вышлите, пожалуйста, комментарий к строчке

return ADCW;

которая находится в конце функции read_adc, которая объявлена как void :)
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Наскоко я понял:
ADCW = ADCH * 3 + ADCL;
Так?!

З.Ы. как ФУЗами выстаить в АТтини13, чтоб внутренний гена работал на 4МГц?!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

просто КОТ писал(а):Так?!
Не так. Считайте, что ADCW это некое волшебное слово, которое обозначает результат преобразования АЦП, и его значение можно присвоить переменной типа int.

просто КОТ писал(а):как ФУЗами выстаить в АТтини13, чтоб внутренний гена работал на 4МГц?!
Никак. Либо 1,2 МГц, Либо 9,6 МГц.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Хм, ну тогда 1.2МГц. При питалове в 3В думаю не стоит его напрягать. . .
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

Пардон, слегка наврал. Можно выставить и 4,8 МГц. Частота выбирается фьюзами CKSEL0,1 CKDIV8.
CKSEL0=0, CKSEL1=1 - 9,6 МГц
CKSEL0=1, CKSEL1=0 - 4,8 МГц
CKSEL0=1, CKSEL1=1 - 128 кГц
значение 0 - это значит поставить "галку"
А если ещё поставить "галку" на фьюз CKDIV8, то эти значения частоты подялятся на 8.

Т.е., чтобы получить 1,2 Мгц, "галки" надо поставить на CKSEL0 и на CKDIV8
Последний раз редактировалось Барсик Вт авг 14, 2012 18:19:28, всего редактировалось 1 раз.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Как думаешь, 128кГц это норм или плохо?!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

Где-то проскакивали сообщения, что при такой низкой частоте хреново работает (или вообще не работает) внутрисхемное программирование, которое обычно используют программаторы. Не знаю. Не проверял.
Сам я такую частоту (128 кГц) никогда не использовал.
А вообще, тактовая частота микроконтроллера здесь - это офтоп. А вот если интересует тактовая частота АЦП, то для неё есть отдельный прескалер. И лучше её уменьшить насколько возможно - будет меньше ошибок. Учтите, хотя и заявлено, что точность АЦП 10 бит, результат преобразования довольно сильно болтается.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Насколько сильно?! На какую точность я могу рассчитывать?!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение Аlex »

просто КОТ, Небольшой Вам совет.
За место лишних зацикливаний МК ( типа - delay_ms(2000);) , сделайте множество выборок АЦП и усредняйте результат. Сделайте самую минимальную частоту тактирования АЦП и обрабатывайте каждое преобразование в прерывании (надеюсь, АВРы так могут :) ). А за место DelayMs заюзайте таймер и считайте его тики.
В итоге - все задержки и преобразования АЦП будут фоновыми задачами, а основной цикл и процессорное время освободиться до максимума.
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: АЦП. Разбор полётов

Сообщение siamds »

Барсик. return ADCW; //по завершению преобразования АЦП, происходит
// return (возврат), для чтения нового слова ADCW
На каждого Моцарта есть свой Сальери.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Аlex писал(а):просто КОТ, Небольшой Вам совет.
За место лишних зацикливаний МК ( типа - delay_ms(2000);) , сделайте множество выборок АЦП и усредняйте результат. Сделайте самую минимальную частоту тактирования АЦП и обрабатывайте каждое преобразование в прерывании (надеюсь, АВРы так могут :) ). А за место DelayMs заюзайте таймер и считайте его тики.
В итоге - все задержки и преобразования АЦП будут фоновыми задачами, а основной цикл и процессорное время освободиться до максимума.

Дык мне спешить некуда. . . Только у мя несколко изменилось устройство, которое я делаю. Я хотел сделат дозик с ПП датчиком, а теперь переработал ЭТО в "Чаёметр". Термометр ля чая с ПП датчиком. Я вот подумываю это в статейку оформить. Вдруг кого заинтересует.

Ну что ж. Всё вроде в моей голове сложилось, осталось собрать!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

siamds писал(а):// return (возврат), для чтения нового слова ADCW
Прошу меня извинить. Это была ненавязчивая подъёбка. Вы объявили свою функцию как void. Следовательно, она ничего возвращать не должна. А у неё в конце тот самый return (возврат)... :)

просто КОТ писал(а):Насколько сильно?! На какую точность я могу рассчитывать?!
Зависит от многих факторов. Я уже точно не помню. Давно это было. Если максимальное значение, которое можно получить 1023, то результат болтается где-то на 20 - 30 единиц. Есть ещё специальный режим работы АЦП - "Noise Canceler". Там несколько лучше, но тоже... да...
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

У мя есть 4 пункта, которые надо выделить.
Это: 210, 225, 240 и 255. +-30 не катит.
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

Если у Вас такие пункты, то забейте на 10 бит. Используйте только 8. Я же не зря написал, что такая болтанка при 10 битах. Т.е. на фоне 1023. На фоне 255 будет меньше. Но при использовании 8 бит есть нюансы. Надо сказать АЦП, чтобы он выравнивал результат влево. Тогда достаточно считывать только старший байт. Младшие биты отпадут сами :)
Вы, вообще говоря, можете сами читать даташит на 13-ю тиньку? Если нет, дайте знать.

Всё. Отпадаю. Иду баиньки.
Ответить

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