Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.01.2008, 03:31
|
|
Частый гость
Регистрация: 10.01.2008
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Как с помощью АЦП измерить напряжение
Нужно с помощью МК со встроенным АЦП измерить напряжение между этими точками, чем точнее тем лучше, не знаю как подключится к АЦП
-- Прилагается рисунок: --
|
|
|
|
17.01.2008, 11:31
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
а какое максимальное значение напряжения будет в этих точках?
Я вот тоже начал изучать ADC. Господа! Кто подскажет как максимально точно считать результат?
Поясню о чем я. Имеем АЦП с делителем на входе, параметры которого естественно будут отличаться. Так вот, интересует нормирование и начальная подстройка результата. Встречал такую формулу adc_data=ADCW*k, где adc_data - финальный результат преобразования, ACDW (кстати что это за регистр, в даташите такого не нашел???) - результат АЦП, k - корректировочный коэффициент. Может есть какие еще формулы, подходы... Поделитесь если не трудно
|
|
|
|
17.01.2008, 20:06
|
|
Частый гость
Регистрация: 12.01.2008
Сообщений: 49
Сказал спасибо: 0
Сказали Спасибо 8 раз(а) в 5 сообщении(ях)
|
Цитата:
|
Встречал такую формулу adc_data=ADCW*k, где adc_data - финальный результат преобразования, ACDW (кстати что это за регистр, в даташите такого не нашел???)
|
Регистр ADCW - это виртуальный регистр компилятора CodeVisionAVR. В нем хранится 16-битный результат АЦП преобразования (т.е. ADCH+ADCL).
Подробно про этот регистр и про многое другое (фильтрация и нормирование измеряемого сигнала перед
подачей на АЦП) описано на сайте http://avr123.nm.ru
если не ошибаюсь - урок №9
__________________
Нет слов "не могу" - есть "не хочу"
|
|
|
|
17.01.2008, 21:16
|
|
Вид на жительство
Регистрация: 23.04.2006
Сообщений: 308
Сказал спасибо: 14
Сказали Спасибо 13 раз(а) в 12 сообщении(ях)
|
Готово:
U = 3V x ((0,123+1+1+1+1+1)/(0,123+1+1+1+1+1+0,123))= 2,9130946773433820065944418276024
По теме: выбери МК, почитай ДШ. Что непонятно - спрашивай.
Для более точного измерения нужно производить подключение АЦП к одной заданной точке (ты их не обозначил на схеме) и опорному напряжению. Опорное напряжение можно задать в том же МК, например в PIC16F628
|
|
|
|
18.01.2008, 00:26
|
|
Частый гость
Регистрация: 10.01.2008
Сообщений: 11
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от zelanez
|
Готово:
U = 3V x ((0,123+1+1+1+1+1)/(0,123+1+1+1+1+1+0,123))= 2,9130946773433820065944418276024
По теме: выбери МК, почитай ДШ. Что непонятно - спрашивай.
Для более точного измерения нужно производить подключение АЦП к одной заданной точке (ты их не обозначил на схеме) и опорному напряжению. Опорное напряжение можно задать в том же МК, например в PIC16F628
|
Оказалось, что если измерять относительно земли, то получается, то же напряжение, как я понимаю АЦП подключаю к "А" и меряю напряжение относительно земли. А формулу я знаю, я ищу сопротивление 0,123, для этого и нужно мерять U. Напряжение будет меняться в процессе измерений где-то от 2 до 3 вольт
-- Прилагается рисунок: --
|
|
|
|
18.01.2008, 02:12
|
|
Временная регистрация
Регистрация: 12.01.2008
Сообщений: 96
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Уважаемые, а в чем собственно проблема?!
Я либо что-то не понял, либо....
Заводим на АЦП измеряемое напряжение и опорное (которое заведомо больше измеряемого) - на выходи АЦП получим код. Для AVR это будет ADCW (в CV)
далее считаем
Ux=ADCW*Uопорное/ADCmax
ADCmax это максимальное значение результата АЦП
1024 - для 10 битного АЦП
256 для 8 битного
Конкретика:
для вашей задачи - берем U опорное 3В
Допустим искомое напряжение равно Ux=2.9В (заранее не известно)
Тогда в идеале получим для 10б АЦП ADXW=~990
Считаем Ux=3*990/1024=2.90039...
Если Ux float или double (на Си)
PS Все напряжения относительно замли!
|
|
|
|
21.01.2008, 01:56
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
есть делитель на входе (соотношение не суть важно), т.к. параметры резисторов не идеальны вводим поправочный коэффициент k типа float, который можно менять в процессе. Получаем ADCW*k или int*float. Как привести результат к типу int?
|
|
|
|
21.01.2008, 02:11
|
|
Временная регистрация
Регистрация: 12.01.2008
Сообщений: 96
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Цитата:
|
Получаем ADCW*k или int*float. Как привести результат к типу int?
|
Если я правильно понял вопрос, то так (на Си):
Код:
|
float k;
int U;
....
U = (int)(ADCW*k); |
PS А не лучше подобрать резисторы более "похожие"?
|
|
|
|
21.01.2008, 11:39
|
|
Прописка
Регистрация: 12.11.2006
Сообщений: 127
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Цитата:
|
PS А не лучше подобрать резисторы более "похожие"?
|
с одной стороны лучше, с другой - не очень. Иногда надо подстроить точность программно.
Цитата:
|
Если я правильно понял вопрос, то так (на Си):
|
да правильно. Спасибо!!!
Цитата:
|
Код:
|
float k;
int U;
....
U = (int)(ADCW*k); |
|
еще вопрос - как в таком случае будет происходить округление до целых? дробная часть просто отбрасывается?[/code]
|
|
|
|
21.01.2008, 11:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Вопросы такие... Ну, при вычислении умножьте на 10 и потом поставьте запятую.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:15.
|
|