А нельзя, что бы он просто запускался при старте?! БЕЗ прерывания. Включили, он посчитал 16 раз, потом МК зажёг нужный светик и всё. Я этого добиваюсь.ILYAUL писал(а): Вообще-то запустить ADC в этой тиньке можно используя 7 прерываний . При этом не требуется команда запуска ADC в обработчиках прерываний , все произойдёт автоматически. А уж читать результат преобразования или нет - дело третье
АЦП. Разбор полётов
Вроде как, версия от Барсика вполне работоспособна, а главное понятна.
- Реклама
Самый лучший вариант работы с сигналами - использовать аппаратный запуск АЦП от таймера. А уже по прерываниям АЦП писАть результат в массив с инкрементом указателя и маской указателя на длину массива. При таком раскладе можно считать результат фильтра вообще в суперлупе. Правда будет подергиваться полоса пропускания, но для большинства применений это не важно.
Очень удобно. Однократно запускается весь этот механизм и программа имеет всегда корректные данные в массиве, причем невидимо для нее.
А если в МК есть внутрицикловый ДМА (прямой доступ к памяти), то даже выпадений времени на обработку прерываний не будет...
Очень удобно. Однократно запускается весь этот механизм и программа имеет всегда корректные данные в массиве, причем невидимо для нее.
А если в МК есть внутрицикловый ДМА (прямой доступ к памяти), то даже выпадений времени на обработку прерываний не будет...
Работоспособна - на значит правильна, а понятность ее не более, чем у правильной.просто КОТ писал(а):Вроде как, версия от Барсика вполне работоспособна, а главное понятна.
Главное разобраться...
- Сообщения: 3459
- Зарегистрирован: Ср сен 27, 2006 16:18:57
Собственно, добрые коты уже всё объяснили и без меня.просто КОТ писал(а):ты сказал, что прерывание от таймера, а написал в коде, что от АЦП
Предлагаю сделать так:
1. тактовую частоту микроконтроллера установить 1,2 МГц.
2. Из таймера смастерить что-то вроде часов реального врени. Для этого:
- входную (тактовую) частоту таймера выбрать 150 кГц
- выбрать моду работы таймера CTC top=OCR0A
- включить прерывание Compare Match A Interrupt
- значение регистра OCR0A установить равным 150 (0x96)
тогда таймер будет считать до 150, и прерывания от него будут с частотой 1000 Гц, т.е. каждую миллисекунду. в этом прерывании организовать счёчик(и) времени и забить на функцию delay.
3. Включить прерывания от АЦП. Запуск АЦП настроить от таймера, режим Timer0 Compare Match A. Тогда АЦП будет запускаться каждую миллисекунду. Тактовую частоту АЦП выбрать 18,75 кГц. Поскольку преобразование происходит за 13 тактов, то преобразование закончится через 0,7 мс, и по прерыванию от АЦП можно считать результат.
В качестве опорного напряжения выбрать внутренний источник 1,1 вольта (Bandgup Reference). Можно ещё отключить от входа АЦП цифровую часть (Disable Digital Input Buffer) чтобы повысить входное сопротивление.
Все эти настройки можно сделать в CodeWizardAVR.
Я имел ввиду не это, а возможность выбора частоты тактирования модуля.Вообще-то запустить ADC в этой тиньке можно используя 7 прерываний
- Реклама
Я вот думаю, а нельзя всё-таки сделать 1 точный замер?! На низкой частоте и с подавлением шума -- разве это не даст точность: +/-10мВ?!
Уважаемый Барсик! Может быть, Вы объясните мне, зачем такие сложности (это без подначки), Запись мл.байта в один регистр, ст.байта в другой, манипуляции со сдвигом. Может быть, я чего-то недопонимаю, и такой метод измерения АЦП действительно лучше, чем пользуюсь я. Обычно я делаю так: из регистра ADCW я переписываю слово данных в переменную типа int, и уже манипулирую с этой переменной, неизменно получаю точные результаты измерений. На фото, результат работы программы проверенный на тестовой плате, а не в Proteuse (это для Совести).
- Вложения
-
- Фото001.jpg
- (24.19 КБ) 405 скачиваний
Последний раз редактировалось siamds Чт авг 16, 2012 10:59:11, всего редактировалось 1 раз.
На каждого Моцарта есть свой Сальери.
А что сложного в реализации, предложенной Марком, кольцевого буфера ? Вроде бы он понятно объяснил...просто КОТ писал(а):Я вот думаю, а нельзя всё-таки сделать 1 точный замер?! На низкой частоте и с подавлением шума -- разве это не даст точность: +/-10мВ?!
Вы бы лучше спрашивали, что не понятно, а не "увиливали" бы от сложных и невыполнимых на ваш взгляд задач
- Сообщения: 106
- Зарегистрирован: Пн мар 26, 2012 05:25:06
siamds писал(а):результат работы программы проверенный на тестовой плате, а не в Proteuse (это для Совести).
Вроде как ЭТО и есть нахождение среднего -- сумму на кол-во!КРАМ писал(а):Для его формирования нужно каждое преобразование писать в буфер нужной длины просто по кольцу (инкрементируя указатель по кругу). И ПОСЛЕ КАЖДОГО ИЗМЕРЕНИЯ, после занесения очередного измерения в буфер, находится сумма всех элементов массива-буфера и делится на длину буфера (сдвигом или делением, зависит от выбранной длины)
Собственно да. Только буфер Вам не нужен , лишнее это - писать в него потом считывать . Возьмите младшие регистры и сразу суммируйте, ну а затем - делите или как я уже писал - умножайте.
А старшие регистры?!
А до скольки младшие могут досчитать?!
Федот, да не тот...просто КОТ писал(а):Вроде как ЭТО и есть нахождение среднего -- сумму на кол-во!КРАМ писал(а):Для его формирования нужно каждое преобразование писать в буфер нужной длины просто по кольцу (инкрементируя указатель по кругу). И ПОСЛЕ КАЖДОГО ИЗМЕРЕНИЯ, после занесения очередного измерения в буфер, находится сумма всех элементов массива-буфера и делится на длину буфера (сдвигом или делением, зависит от выбранной длины)
Не любое среднее будет правильным результатом. Не любое среднее даст плавное (гладкое) изменение результата при шумовых компонентах во входном сигнале и его изменении.
Еще раз предлагаю разобраться с проблемой. Она достаточно проста и результат Ваших трудов сейчас решит многие проблемы в будущем.
А не проще ли бороться с шумом схематически -- поставить например кондёр, параллельно входу против ВЧ помех и т.д.
А оно мне надо?! Мне надо 1 результат точный и всё.КРАМ писал(а):Не любое среднее даст плавное (гладкое) изменение результата при шумовых компонентах
Конденсатор на входе сам по себе никаким внятным фильтром не будет. Фильтрация входного сигнала аппаратными способами с даже с качеством простейшего КИХ с прямоугольным окном потребует невменяемого количества ОУ и подбора коденсаторов и резисторов.просто КОТ писал(а):А не проще ли бороться с шумом схематически -- поставить например кондёр, параллельно входу против ВЧ помех и т.д.
Опять же ЗАЧЕМ городить даже единственный конденсатор, когда программная реализация ВООБЩЕ НЕ ТРЕБУЕТ никаких схемотехнических затрат?
В третий раз предлагаю Вам разобраться с ОЧЕНЬ простой в реализации задачей.
Если есть желание, могу привести графическое описание сего действа...
Вы знакомы с косвенной адресацией массивов? Вы знаете что такое указатель на элемент массива?
Ну или может Вы знакомы с АСМом для используемых Вами контроллеров?
Один точный результат принципиально невозможен без фильтрации. Вы получите конечно точный результат на одном измерении, но Вам эта точность не понравится. АЦП тупо преобразует РЕАЛЬНЫЙ сигнал на входе, а не Вашу МОДЕЛЬ, которую Вы домыслили.
Тогда объясните пожалуйста поподробнее! Мне очень трудно понимать пока!




