Страница 2 из 13
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:19:13
U235
Да оставьте, заработает - поэксперементируете. Только вот один момент - после запуска АЦП нужно время для завершения преобразования.
Если не используются прорывания - либо ставить задержку (что не очень красиво) либо цикл, из которого выходите только когда флаг прерывания появился.
Этот флаг, кстати, нужно будет сбрасывать программно.
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 22:26:24
zero648
просто КОТ писал(а):
А теперь вопрос -- вместо регистр писать ADCL или ADCH. Или как их сложить. Что-то мой моск перестал думать.
Если точность не сильно важна, можно результат АЦП прижать влево, читать только ADCH и тупо умножить на 4 равносильно <<2
ADMUX|=(1<<ADLAR)
ADCC=(ADCH<<2)
За синтаксис не ругайте, возможно, что-то не правильно написал, ну в общем суть вы поняли.

Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 23:01:47
просто КОТ
Лучше ИМХО точно -- мне надо слабые отклонения улавливать. А про флагши -- через дэлей легче. Вот только на сколько мс ставить?!
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 23:25:00
U235
просто КОТ писал(а):.... А про флагши -- через дэлей легче. Вот только на сколько мс ставить?!
Легче - не значит лучше. Измените частоту процессора или предделитель АЦП - и опять задержку пересчитывать.
А так
просто и надёжно.
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 23:30:33
siamds
Код, переключения светодиодов скомпилированный в CV_AVR во вложении. Там же результат компиляции промоделированной в Proteus’e. Если возникнут вопросы – вышлю комментарий к каждой строчке программы.
Re: АЦП. Разбор полётов
Добавлено: Пн авг 13, 2012 23:44:44
zero648
Зачем делей, проверяй просто флаг, если конвертация завершилась, он сбросится.
Я так делал:
Код: Выделить всё
ADCSRA=(1<<ADEN)|(1<<ADSC)|(0b011<<ADPS0); //Запускаем конвертор, предделитель частоты 1:8
While(ADCSRA & (1<<ADSC)); // ждем окончания конвертации
ADCC=(unsigned int)ADCH<<8 | ADCL;
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 17:09:20
Барсик
Не надо возиться отдельно со старшим и с младшим байтами результата АЦП. У Вас же 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

Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 17:19:27
просто КОТ
Наскоко я понял:
ADCW = ADCH * 3 + ADCL;
Так?!
З.Ы. как ФУЗами выстаить в АТтини13, чтоб внутренний гена работал на 4МГц?!
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 17:46:38
Барсик
просто КОТ писал(а):Так?!
Не так. Считайте, что ADCW это некое волшебное слово, которое обозначает результат преобразования АЦП, и его значение можно присвоить переменной типа int.
просто КОТ писал(а):как ФУЗами выстаить в АТтини13, чтоб внутренний гена работал на 4МГц?!
Никак. Либо 1,2 МГц, Либо 9,6 МГц.
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 17:54:41
просто КОТ
Хм, ну тогда 1.2МГц. При питалове в 3В думаю не стоит его напрягать. . .
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 18:16:24
Барсик
Пардон, слегка наврал. Можно выставить и 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
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 18:17:53
просто КОТ
Как думаешь, 128кГц это норм или плохо?!
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 18:23:56
Барсик
Где-то проскакивали сообщения, что при такой низкой частоте хреново работает (или вообще не работает) внутрисхемное программирование, которое обычно используют программаторы. Не знаю. Не проверял.
Сам я такую частоту (128 кГц) никогда не использовал.
А вообще, тактовая частота микроконтроллера здесь - это офтоп. А вот если интересует тактовая частота АЦП, то для неё есть отдельный прескалер. И лучше её уменьшить насколько возможно - будет меньше ошибок. Учтите, хотя и заявлено, что точность АЦП 10 бит, результат преобразования довольно сильно болтается.
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 19:09:45
просто КОТ
Насколько сильно?! На какую точность я могу рассчитывать?!
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 19:23:29
Аlex
просто КОТ, Небольшой Вам совет.
За место лишних зацикливаний МК ( типа -
delay_ms(2000);) , сделайте множество выборок АЦП и усредняйте результат. Сделайте самую минимальную частоту тактирования АЦП и обрабатывайте каждое преобразование в прерывании (надеюсь, АВРы так могут

). А за место
DelayMs заюзайте таймер и считайте его тики.
В итоге - все задержки и преобразования АЦП будут фоновыми задачами, а основной цикл и процессорное время освободиться до максимума.
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 19:36:10
siamds
Барсик. return ADCW; //по завершению преобразования АЦП, происходит
// return (возврат), для чтения нового слова ADCW
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 20:04:57
просто КОТ
Аlex писал(а):просто КОТ, Небольшой Вам совет.
За место лишних зацикливаний МК ( типа -
delay_ms(2000);) , сделайте множество выборок АЦП и усредняйте результат. Сделайте самую минимальную частоту тактирования АЦП и обрабатывайте каждое преобразование в прерывании (надеюсь, АВРы так могут

). А за место
DelayMs заюзайте таймер и считайте его тики.
В итоге - все задержки и преобразования АЦП будут фоновыми задачами, а основной цикл и процессорное время освободиться до максимума.
Дык мне спешить некуда. . . Только у мя несколко изменилось устройство, которое я делаю. Я хотел сделат дозик с ПП датчиком, а теперь переработал ЭТО в "Чаёметр". Термометр ля чая с ПП датчиком. Я вот подумываю это в статейку оформить. Вдруг кого заинтересует.
Ну что ж. Всё вроде в моей голове сложилось, осталось собрать!
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 20:31:04
Барсик
siamds писал(а):// return (возврат), для чтения нового слова ADCW
Прошу меня извинить. Это была ненавязчивая подъёбка. Вы объявили свою функцию как void. Следовательно, она ничего возвращать не должна. А у неё в конце тот самый return (возврат)...
просто КОТ писал(а):Насколько сильно?! На какую точность я могу рассчитывать?!
Зависит от многих факторов. Я уже точно не помню. Давно это было. Если максимальное значение, которое можно получить 1023, то результат болтается где-то на 20 - 30 единиц. Есть ещё специальный режим работы АЦП - "Noise Canceler". Там несколько лучше, но тоже... да...
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 20:50:25
просто КОТ
У мя есть 4 пункта, которые надо выделить.
Это: 210, 225, 240 и 255. +-30 не катит.
Re: АЦП. Разбор полётов
Добавлено: Вт авг 14, 2012 21:14:46
Барсик
Если у Вас такие пункты, то забейте на 10 бит. Используйте только 8. Я же не зря написал, что такая болтанка при 10 битах. Т.е. на фоне 1023. На фоне 255 будет меньше. Но при использовании 8 бит есть нюансы. Надо сказать АЦП, чтобы он выравнивал результат влево. Тогда достаточно считывать только старший байт. Младшие биты отпадут сами

Вы, вообще говоря, можете сами читать даташит на 13-ю тиньку? Если нет, дайте знать.
Всё. Отпадаю. Иду баиньки.