АЦП. Разбор полётов
- U235
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Вт фев 21, 2012 20:42:26
- Откуда: Санкт-Петербург, Россия, Земля
Re: АЦП. Разбор полётов
Да оставьте, заработает - поэксперементируете. Только вот один момент - после запуска АЦП нужно время для завершения преобразования.
Если не используются прорывания - либо ставить задержку (что не очень красиво) либо цикл, из которого выходите только когда флаг прерывания появился.
Этот флаг, кстати, нужно будет сбрасывать программно.
Если не используются прорывания - либо ставить задержку (что не очень красиво) либо цикл, из которого выходите только когда флаг прерывания появился.
Этот флаг, кстати, нужно будет сбрасывать программно.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: АЦП. Разбор полётов
просто КОТ писал(а):А теперь вопрос -- вместо регистр писать ADCL или ADCH. Или как их сложить. Что-то мой моск перестал думать.
Если точность не сильно важна, можно результат АЦП прижать влево, читать только ADCH и тупо умножить на 4 равносильно <<2
ADMUX|=(1<<ADLAR)
ADCC=(ADCH<<2)
За синтаксис не ругайте, возможно, что-то не правильно написал, ну в общем суть вы поняли.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Лучше ИМХО точно -- мне надо слабые отклонения улавливать. А про флагши -- через дэлей легче. Вот только на сколько мс ставить?!
- U235
- Встал на лапы
- Сообщения: 135
- Зарегистрирован: Вт фев 21, 2012 20:42:26
- Откуда: Санкт-Петербург, Россия, Земля
Re: АЦП. Разбор полётов
просто КОТ писал(а):.... А про флагши -- через дэлей легче. Вот только на сколько мс ставить?!
Легче - не значит лучше. Измените частоту процессора или предделитель АЦП - и опять задержку пересчитывать.
А так
Код: Выделить всё
while (!(ADCSRA & 0x10));
ADCSRA|=0x10;
просто и надёжно.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Re: АЦП. Разбор полётов
Код, переключения светодиодов скомпилированный в 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: АЦП. Разбор полётов
Зачем делей, проверяй просто флаг, если конвертация завершилась, он сбросится.
Я так делал:
Я так делал:
Код: Выделить всё
ADCSRA=(1<<ADEN)|(1<<ADSC)|(0b011<<ADPS0); //Запускаем конвертор, предделитель частоты 1:8
While(ADCSRA & (1<<ADSC)); // ждем окончания конвертации
ADCC=(unsigned int)ADCH<<8 | ADCL;
Re: АЦП. Разбор полётов
Не надо возиться отдельно со старшим и с младшим байтами результата АЦП. У Вас же CodeVision. Там можно сразу считывать результат (слово из двух байтов) из "регистра" ADCW:
unsigned int adc;
adc = ADCW;
А ещё лучше запустите визард. Он Вам автоматом сгенерит код для фукции АЦП. Что-нибудь вроде:
return ADCW;
которая находится в конце функции read_adc, которая объявлена как void
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МГц?!
ADCW = ADCH * 3 + ADCL;
Так?!
З.Ы. как ФУЗами выстаить в АТтини13, чтоб внутренний гена работал на 4МГц?!
Re: АЦП. Разбор полётов
Не так. Считайте, что ADCW это некое волшебное слово, которое обозначает результат преобразования АЦП, и его значение можно присвоить переменной типа int.просто КОТ писал(а):Так?!
Никак. Либо 1,2 МГц, Либо 9,6 МГц.просто КОТ писал(а):как ФУЗами выстаить в АТтини13, чтоб внутренний гена работал на 4МГц?!
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Хм, ну тогда 1.2МГц. При питалове в 3В думаю не стоит его напрягать. . .
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
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 кГц) никогда не использовал.
А вообще, тактовая частота микроконтроллера здесь - это офтоп. А вот если интересует тактовая частота АЦП, то для неё есть отдельный прескалер. И лучше её уменьшить насколько возможно - будет меньше ошибок. Учтите, хотя и заявлено, что точность АЦП 10 бит, результат преобразования довольно сильно болтается.
Сам я такую частоту (128 кГц) никогда не использовал.
А вообще, тактовая частота микроконтроллера здесь - это офтоп. А вот если интересует тактовая частота АЦП, то для неё есть отдельный прескалер. И лучше её уменьшить насколько возможно - будет меньше ошибок. Учтите, хотя и заявлено, что точность АЦП 10 бит, результат преобразования довольно сильно болтается.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Насколько сильно?! На какую точность я могу рассчитывать?!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
просто КОТ, Небольшой Вам совет.
За место лишних зацикливаний МК ( типа - delay_ms(2000);) , сделайте множество выборок АЦП и усредняйте результат. Сделайте самую минимальную частоту тактирования АЦП и обрабатывайте каждое преобразование в прерывании (надеюсь, АВРы так могут
). А за место DelayMs заюзайте таймер и считайте его тики.
В итоге - все задержки и преобразования АЦП будут фоновыми задачами, а основной цикл и процессорное время освободиться до максимума.
За место лишних зацикливаний МК ( типа - delay_ms(2000);) , сделайте множество выборок АЦП и усредняйте результат. Сделайте самую минимальную частоту тактирования АЦП и обрабатывайте каждое преобразование в прерывании (надеюсь, АВРы так могут
В итоге - все задержки и преобразования АЦП будут фоновыми задачами, а основной цикл и процессорное время освободиться до максимума.
Re: АЦП. Разбор полётов
Барсик. return ADCW; //по завершению преобразования АЦП, происходит
// return (возврат), для чтения нового слова ADCW
// return (возврат), для чтения нового слова ADCW
На каждого Моцарта есть свой Сальери.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Аlex писал(а):просто КОТ, Небольшой Вам совет.
За место лишних зацикливаний МК ( типа - delay_ms(2000);) , сделайте множество выборок АЦП и усредняйте результат. Сделайте самую минимальную частоту тактирования АЦП и обрабатывайте каждое преобразование в прерывании (надеюсь, АВРы так могут). А за место DelayMs заюзайте таймер и считайте его тики.
В итоге - все задержки и преобразования АЦП будут фоновыми задачами, а основной цикл и процессорное время освободиться до максимума.
Дык мне спешить некуда. . . Только у мя несколко изменилось устройство, которое я делаю. Я хотел сделат дозик с ПП датчиком, а теперь переработал ЭТО в "Чаёметр". Термометр ля чая с ПП датчиком. Я вот подумываю это в статейку оформить. Вдруг кого заинтересует.
Ну что ж. Всё вроде в моей голове сложилось, осталось собрать!
Re: АЦП. Разбор полётов
Прошу меня извинить. Это была ненавязчивая подъёбка. Вы объявили свою функцию как void. Следовательно, она ничего возвращать не должна. А у неё в конце тот самый return (возврат)...siamds писал(а):// return (возврат), для чтения нового слова ADCW
Зависит от многих факторов. Я уже точно не помню. Давно это было. Если максимальное значение, которое можно получить 1023, то результат болтается где-то на 20 - 30 единиц. Есть ещё специальный режим работы АЦП - "Noise Canceler". Там несколько лучше, но тоже... да...просто КОТ писал(а):Насколько сильно?! На какую точность я могу рассчитывать?!
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
У мя есть 4 пункта, которые надо выделить.
Это: 210, 225, 240 и 255. +-30 не катит.
Это: 210, 225, 240 и 255. +-30 не катит.
Re: АЦП. Разбор полётов
Если у Вас такие пункты, то забейте на 10 бит. Используйте только 8. Я же не зря написал, что такая болтанка при 10 битах. Т.е. на фоне 1023. На фоне 255 будет меньше. Но при использовании 8 бит есть нюансы. Надо сказать АЦП, чтобы он выравнивал результат влево. Тогда достаточно считывать только старший байт. Младшие биты отпадут сами 
Вы, вообще говоря, можете сами читать даташит на 13-ю тиньку? Если нет, дайте знать.
Всё. Отпадаю. Иду баиньки.
Вы, вообще говоря, можете сами читать даташит на 13-ю тиньку? Если нет, дайте знать.
Всё. Отпадаю. Иду баиньки.

