- Вложения
-
- LM35.ZIP
- (62.63 КБ) 265 скачиваний
LM35 и ATmega8
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
Добрый день. Возникла такая проблема. Изучаю АЦП на примере датчика температуры LM35. Вроде бы все работает, только когда устанавливаю температуру более 50 0С показания перестают изменяться. Показания останавливаются на 512. Хотя АЦП то 10 бит. Не могу понять в чем проблема. В архиве исходники и проект Протеус для проверки. Использую ИОН - вывод AREF - 1 В. Измерять тоже должен до 1В. А измеряет только до 0,5 В. Это 50 град.Ц Даже показания не изменяются. Заранее благодарен за ответ.
- Реклама
- Сообщения: 1802
- Зарегистрирован: Ср сен 07, 2011 21:40:30
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
Результат из регистра ADCL забирается норм. Проблема возникает, когда результат начинает считываться из регистра ADCH. Но не могу понять в чем проблема.
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
- Реклама
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
да внешний. тоже возник вопрос, какое напряжение можно подавать на вывод AREF. Просто программа шла в комплекте с отладочной платой EVBavr04. И там написано, что подать 1 в. А судя по вашей документации мин 2. Попробую.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
документация не моя а производителя, действительно проект для меги8, а в комментариях - подать 1В, может ошиблись - на плату можно устанавливать мегу48 - там Vref 1В минимум.
in temp,ADCL ; Внимание! ПЕРВЫМ ЧИТАЕТСЯ МЛАДШИЙ РЕГИСТР!!!
in temp1,ADCH
Соблюдается? Если нет, глюки обеспечены.
in temp1,ADCH
Соблюдается? Если нет, глюки обеспечены.
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
Да читаются сначала младший, а потом старший.dr.doc писал(а):in temp,ADCL ; Внимание! ПЕРВЫМ ЧИТАЕТСЯ МЛАДШИЙ РЕГИСТР!!!
in temp1,ADCH
Соблюдается? Если нет, глюки обеспечены.
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
Тогда возможная причина - опорное напряжение. Совпадает по логике - опорное напряжение равно 0,5 минимального и разрядность составляет также 0,5 от 1024.
Похожая ситуация возникает при переполнении, когда входное выше опорного.
Стр. 243 из 303
Похожая ситуация возникает при переполнении, когда входное выше опорного.
Стр. 243 из 303
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
takei писал(а):Почему в протеусе не подключена нога AVCC?
Ваще не понимаю, что там показывает без подключенного АЦП. Вы так свой код будете "лопатить" честные три месяца!melandr писал(а):А куда ее нужно подключить? Подключен вывод AREF к опорному напряжению 1 В.
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
Не помогло. Сделал в Протеусе опорное напряжение Vref = 2 В. Показания уменьшились в 2 раза и происходит ограничение все равно на 0,5В. Было при Vref = 1 В содержимое регистра ADC = 512 и входном напряжении 0,5 В. При изменении Vref = 2 В содержимое регистра ADC = 256 при входном напряжении 0,5 В. Проблема где-то в программе, но где не понятно. Не отображает значения которые должны быть в регистре ADCH
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
Запустите Протеус и посмотрите. До 0,5 В показывает нормально. Обрубает при показаниях больше 0,5 В. При Vref = 1 Вtakei писал(а):takei писал(а):Почему в протеусе не подключена нога AVCC?Ваще не понимаю, что там показывает без подключенного АЦП. Вы так свой код будете "лопатить" честные три месяца!melandr писал(а):А куда ее нужно подключить? Подключен вывод AREF к опорному напряжению 1 В.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
странно вычисляется температура
10mV = 1 градус
При Vref 5В (5000mV)
Temperature = АЦП x (5000/1023)
Например при значении АЦП = 512:
512 x (5000/1023) = 2502mV = 250,2 C - это вряд ли выдержит
Например при значении АЦП = 100:
100 x (5000/1023) = 488,8mV = 48,9 C
Код: Выделить всё
value_low = ADCL;
value_high = ADCH;
value = ((value_high<<2)|(value_low>>6));При Vref 5В (5000mV)
Temperature = АЦП x (5000/1023)
Например при значении АЦП = 512:
512 x (5000/1023) = 2502mV = 250,2 C - это вряд ли выдержит
Например при значении АЦП = 100:
100 x (5000/1023) = 488,8mV = 48,9 C
Последний раз редактировалось oleg110592 Сб ноя 09, 2013 01:26:16, всего редактировалось 1 раз.
- Сообщения: 580
- Зарегистрирован: Пт ноя 08, 2013 01:01:18
Не понятно почему рубит на 0,5В измерения. Меняю опорное напряжение, а показания считают только до 0,5В
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
надо проверить это
value = ((value_high<<2)|(value_low>>6));
еще включен бит ADLAR:
ADC Left Adjust Result
The ADLAR bit affects the presentation of the ADC conversion result in the ADC Data Register.
Write one to ADLAR to left adjust the result. Otherwise, the result is right adjusted
можно проверить на компьютере (C++ Builder), сегодня уже не хочется, завтра не знаю, может не получиться
value = ((value_high<<2)|(value_low>>6));
еще включен бит ADLAR:
ADC Left Adjust Result
The ADLAR bit affects the presentation of the ADC conversion result in the ADC Data Register.
Write one to ADLAR to left adjust the result. Otherwise, the result is right adjusted
можно проверить на компьютере (C++ Builder), сегодня уже не хочется, завтра не знаю, может не получиться
Да что же это за мазахизм, а понял
То есть я, вот подал питание Теперь ковыряйте программу
melandr писал(а): можно подавать на вывод AREF.
dr.doc писал(а):in temp1,ADCH
тут на форуме только программисты,melandr писал(а):Проблема где-то в программе, но где не понятно. Не отображает значения которые должны быть в регистре ADCH
А подать питание на 20 ногу это наверное пусть на другом форуме начинающие подают.takei писал(а):не понимаю, что там показывает без подключенного АЦП
То есть я, вот подал питание Теперь ковыряйте программу
Я вообще не понял смысла использования бита адлар, если вы используете все биты ацп
Он ведь придуман только для того, чтобы можно было тупо не читать младший регистр просто используя старшие 8 бит. Если все используете, не проще взять уже готовое двухбайтное число из двух регистров? Зачем это лишнее преобразование?
Тогда(при адлар==0) будет так:
Он ведь придуман только для того, чтобы можно было тупо не читать младший регистр просто используя старшие 8 бит. Если все используете, не проще взять уже готовое двухбайтное число из двух регистров? Зачем это лишнее преобразование?
Тогда(при адлар==0) будет так:
Код: Выделить всё
value_low = ADCL;
value_high = ADCH;
value = (( uint16_t )ADCH<<8)|ADCL ;



