|
|
  |
ADC Mega168. Измерение напряжения "наоборот". |
|
|
|
Jun 30 2009, 09:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(Палыч @ Jun 30 2009, 13:18)  Вы измерение делаете один раз в секунду? Или в цикле - подряд? Или каждую секунду - серию измерений? "Первые два - ошибочны" - это какие два? Ну например так: есть в устройстве кнопка, когда ее нажимаете, запускается одиночный процесс преобразования. Если кнопку нажимать один раз в секунду то получается: первый раз - ошибка второй раз - ошибка (иногда правильно) все последующие - точно. если сделать паузу в несколько секунд - все повторяется: первый раз - ошибка второй раз - ошибка (иногда правильно) все последующие - точно.
Сообщение отредактировал Буратино - Jun 30 2009, 10:01
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jun 30 2009, 10:26
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(DpInRock @ Jun 30 2009, 13:59)  Относительно чего ПЕРВЫЙ РАЗ? Например, после сброса, после выхода из слипа? Вообще - первое преобразование практически всегда неточно. И "ПЕРВЫМ" называется такое преобразование, перед которым трогали ADMUX, выключали питание ADC.
Также имеет значение емкость на AREF. Чтобы что-то быстро замерить и уйти в слип эту емкость надо делать как можно меньше. Иначе после переключения мультиплексора эта емкость будет очень долго заряжаться. И результат будет неверным, пока емкость не зарядится до конца.
Проверьте напряжение на рефе перед ПЕРВЫМ нажатием (то, которое дает ошибку). Один раз в секунду проссыпаюсь из режима Power Down, и делаю вот так: __disable_interrupt();adc_init();ADCSRA |= (1<<ADEN); __enable_interrupt(); DelayMs(5); f_bat=(1.1*1024/value_ADC); V_BAT=(f_bat*100); __disable_interrupt();ADCSRA &= ~(1<<ADEN); __enable_interrupt(); и снова в спячку Напряжение на AREF всегда равно питанию.
Сообщение отредактировал Буратино - Jun 30 2009, 10:33
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jun 30 2009, 10:34
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(rezident @ Jun 30 2009, 14:10)  А может кто-то наконец внятно объяснить что и относительно чего измеряется? А то из datasheet мне это как-то неочевидно. Схема я думаю примерно такая
И меряется Bandgap Reference. При изменении AVCC (которое и опорное) изменяются значения АЦП. Ведь Bandgap Reference = const
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jun 30 2009, 13:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 433
Регистрация: 27-10-08
Из: Украина, Киев
Пользователь №: 41 215

|
Цитата(Палыч @ Jun 30 2009, 14:51)  Кстати! Bandgap Reference включен, если 1) включен BOD или 2) включен компаратор или 3) включен АЦП. После включения ADEN нужно дождаться выхода на рабочий режим Bandgap Reference (это, наверное, десятки мкс - под рукой нет DS чтобы проверить). Поэтому нельзя выставлять ADEN и ADSC вместе! все что понял попробовал. BOD у меня включен, после инициализации АЦП делаю паузу, потом запускаю преобразование, но на первых измерениях всегда ошибка. Блин, ну что в ADC может давать такой "фифект"?
Сообщение отредактировал Буратино - Jun 30 2009, 13:30
--------------------
Брак - это такой вид отношений, в которых один всегда прав, - а другой - муж.
|
|
|
|
|
Jun 30 2009, 14:18
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(singlskv @ Jun 30 2009, 03:41)  Перевод почти дословный: "Если между преобразованиями сменилось опорное напряжение, то следующее измерение после такого изменения может быть не точным, и пользователь должен это иметь в виду." Неточный у вас перевод. Не должен иметь в виду, а рекомендуется выбрасывать этот (первый после смены reference) результат измерения. Цитата(Буратино @ Jun 30 2009, 16:29)  все что понял попробовал. BOD у меня включен, после инициализации АЦП делаю паузу, потом запускаю преобразование, но на первых измерениях всегда ошибка. Блин, ну что в ADC может давать такой "фифект"? После выхода из спячки (включения АЦП) сделайте последовательно два измерения, первое выбрасывайте, второе оставляйте. Будет всегда правильно. ADCSRA = (1 < ADEN); ADCSRA |= (1 << ADSC) | (1 << ADIF); while( !(ADCSRA & ADIF)); // <-- дождаться первого результата и выбросить его ADCSRA |= (1 << ADSC) | (1 << ADIF); <<-- еще раз оцифровать while( !(ADCSRA & ADIF)); // <-- дождаться второго результата преобразования result = ADC; <-- пользовать этот результат второго преобразования
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|