реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> проблема с АЦП, проблема с АЦП
azure
сообщение Mar 21 2008, 08:55
Сообщение #16





Группа: Участник
Сообщений: 12
Регистрация: 20-03-08
Пользователь №: 36 086



Цитата(Lexdaw @ Mar 21 2008, 09:05) *
На Меге16 у меня работают сразу три АЦП без выключения ядра 10 бит и все нормально от 0 до 1023.Единственное что подается сигнал с ОУ.


а код программы можете выложить?
я сделал смещение, с ним все отлично работает (совпадает с измерениями мультиметра), но совесть мучает smile.gif
Go to the top of the page
 
+Quote Post
Lexdaw
сообщение Mar 21 2008, 11:42
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 5-02-08
Пользователь №: 34 772



Да дело вряд ли в коде.Если сигнал прямо с переменника.,то надо учесть,что у него может не быть R=0,да еще если высокоомный,а у вас подтяжка внутренними резисторами.Вот здесь и может выскакивать.
Go to the top of the page
 
+Quote Post
Kovrov
сообщение Mar 21 2008, 12:02
Сообщение #18


Мастер-фломастер
****

Группа: Свой
Сообщений: 611
Регистрация: 29-12-05
Пользователь №: 12 700



15 LSB offset error - это жесть
а так получается что 15lsb *2.5 mv = 37.5 mV (если ион внутренний)
тут правильно советуют
попробуйте отсоединить ножку ADC0 (или какой у вас канал?) от схемы и припаять её к AGND, (только именно отсоединить а не ленится :-)
канал ADC менять не пробывали?


--------------------
Вон ПОПОВ, клоун клоуном, а радио изобрел!!
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 21 2008, 12:10
Сообщение #19


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(azure @ Mar 20 2008, 13:45) *
Помогите разобратся с АЦП.
Пишу программу для считывания уровня напряжения с переменного резистора (от 0 до 5 В).
Микроконтроллер: ATmega16 работает на частоте 16МГц. Вход A0. Разрядность АЦП: 10бит. Считывание одинарное (но вызывается регулярно). Программа работает, но при считывании уровня 0В выдает в ADCW не 0, а 15. При этом с верхним уровнем никаких проблем нет (1023)


Похоже у вас плохое опорное напряжение. Попробуйте внутреннее 2,56В для начала или подключите к ноге AREF внешний опорник. Не забудьте только биты REFS1-0 поправить.

Ну и несколько замечаний по коду, что сходу бросаются в глаза.

1) Запустили ацп в режиме free run, но в главном цикле вы всё время запускаете начало преобразования. Если вы хотите single conversion, то надо дождаться конца преобразования.

2) Есть стробы записи в регистры 1, 2, 3. А вот в регистр 4 строба записи нет, надо добавить.

3) В главном цикле используется переменная ADC_w, но она может быть испорчена в любой момент в прерывании. Примите меры.

4) Непонятна роль оператора while(ADCSRA & 0x40). Почему что-то делается, когда преобразование не закончено?

5) Зачем стоит оператор return 0 в конце программы? У вас там что, операционка стоит?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Mar 21 2008, 12:42
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(Lexdaw @ Mar 21 2008, 10:05) *
Единственное что подается сигнал с ОУ.

+1. Для себя после принял за правило: с переменника прямо на вход АЦП сигнал не подавать. На ОУ собрать повторитель да еще и подфильтровать немного.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Mar 21 2008, 13:07
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Повторитель - обязательно.
Только там уровень нуля подпрыгнет, надо будет подшаманить...
Go to the top of the page
 
+Quote Post
azure
сообщение Mar 21 2008, 17:03
Сообщение #22





Группа: Участник
Сообщений: 12
Регистрация: 20-03-08
Пользователь №: 36 086



Нашол я где была зарыта ошибка!
Скажу что все перепробывал, что советовали (про MUX4...MUX0 для контроля точек 0B 1.22B) - на них тоже выдавало ошибки, причем на 1.22 - непостежимого характера smile.gif. Только операционик не пробовал лепить, он сути б не менял.


И так ошибка была в коде (про непрерывный режим - тоже ошибка была, но в том коде была незаметна) и в самом начале:

Код
int main(void)
{
_delay_ms(2);

[b]DDRA = 0x00;[/b]
DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;

[b]PORTA= 0xFF;[/b]
PORTB= 0x00;
PORTC= 0x00;
PORTD= 0x00;


Изначально порт А устанавливался как входно на считывание. И при считывании 0В выдавал уровень. При удалении выделенных строк - все заработало как надо, меряет от 0...1023 smile.gif

Всем сноваже СПС! yeah.gif
Go to the top of the page
 
+Quote Post
Kibi
сообщение Mar 24 2008, 14:19
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 11-03-08
Пользователь №: 35 811



поделюсь тоже соображениями, нет защиты от дребезга, 50мс думаю не помешает, также очень интересно как подведена аналоговая линия, подтяжка к + или к земле, стоит ли защитный диод, насколько развязана плата по питанию....
Go to the top of the page
 
+Quote Post
azure
сообщение Apr 9 2008, 12:29
Сообщение #24





Группа: Участник
Сообщений: 12
Регистрация: 20-03-08
Пользователь №: 36 086



Цитата(Kibi @ Mar 24 2008, 16:19) *
поделюсь тоже соображениями, нет защиты от дребезга, 50мс думаю не помешает, также очень интересно как подведена аналоговая линия, подтяжка к + или к земле, стоит ли защитный диод, насколько развязана плата по питанию....


Дребезга тут нет, сигнал снимается с резистором в параллель которому конденсаторы.
Аналоговая земля с цифровой объеденены. Питания тоже, только питание к АЦП шло от основного через даташитовскую LC цепочку.

Для лучшей точности пробовал питать АЦП от другого источника с общей землей - полождительные результаты.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016