|
|
  |
Получить от АЦП полные 10 бит. Как? |
|
|
|
Dec 5 2011, 02:35
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 4-03-09
Из: Богота, Колумбия
Пользователь №: 45 676

|
Так получилось, что для получения необходимого разрешения по измеряемому напряжению мне нужно 10+ бит. Использовать планирую ATmega48 с внутренним генератором на 4-8 МГц. Атмега будет мерить 2 входа АЦП (6 и 7, т.к. на них больше ничего нету), выполнять элементарный расчёт и выдавать на семисегментный индикатор в динамическом режиме. На входе имеем 7 вольт и померить их надо с разрешением (и точностью) 0,006946891517745 вольт. 10 бит на таком диапазоне, это 0,0068359375, то есть как раз. И того, надо получить 1024 чистые точки. Без дрожания. Хотелось бы услышать мнения, как это сделать.
Например, хватит ли внутреннего ИОНа для такой точности? В ДШ шум документирован как 0,5 LSB. Правда, нигде не нашёл, это при измерении в шутдауне, или при работающем ядре тоже?
Допустим, на время измерения я буду отправлять МК в шутдаун (хотя не хотелось бы, т.к. на нём ещё и динамическая индикация). Делать усреднение (оверсемплинг) по 8-16 выборкам подряд... Что ещё можно сделать?..
|
|
|
|
|
Dec 5 2011, 09:15
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Я делал так значительно лучше результат, сравнение до 999 убери. CODE read_adc: // Чтение АЦП 64 раза , и вычисление среднеарифметического значения clr yl // clr yh // ldi loop,64 // Загружаем количество выборок read_cycle: // Цикл чтения АЦП sbi adcsra,6 // Запускаем АЦП w_adc: // sbic adcsra,6 // Ждем готовности АЦП к чтению данных rjmp w_adc // in xl,ADCL // считываем 8 младших битов АЦП in xh,ADCH // считываем 2 старших бита АЦП add yl,xl // adc yh,xh // dec loop // Счетчик циклов - 1 brne read_cycle // // Деление полученого результата на 64 , >> 6 , сдвигаем на 6 разрядов в право ldi loop,6 // devide_adc: // lsr yh // ror yl // dec loop // brne devide_adc // ldi xl,low (999) // ldi xh,high(999) // cp yl,xl // cpc yh,xh // brsh set_adc_data // ret // На выход , результат хранится в Y set_adc_data: // ldi yl,low (999) // ldi yh,high(999) // ret //
|
|
|
|
|
Dec 5 2011, 09:30
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(arttab @ Dec 5 2011, 11:13)  не забудьте считывать результат из 2х регистров А я всегда считываю из одного: int v = ADC; //  Цитата(Павлик @ Dec 5 2011, 13:15)  Я делал так значительно лучше результат Это разгильдяйство.
|
|
|
|
|
Dec 5 2011, 10:23
|

Частый гость
 
Группа: Свой
Сообщений: 176
Регистрация: 2-04-08
Из: Днепропетровск
Пользователь №: 36 406

|
Кокос, кокос, не издевайтесь... Стремление измерить 7000 mV с точностью +/- 7 mV мне непонятно. Ну и вообще как такой потенциал попадет в конечном итоге на мегу без делителя дело лично топикстартера. Время было 4:30 утра, человек перед сном задал вопрос Если по сути вопроса. Вы сами в курсе общих требованией: 1. правильная топология печатной платы; 2. фильтрация питающих цепей; 3. фильтрация измеряемых сигналов; 4. выбор ион (начальная точность, временная/температурная стабильность)ж 5. оверсемплинг в разумных пределах. Просто когда вы натыкаетесь на какую-то сложную задачу в простых приложениях, значит вы что-то делаете не так. Измените ее, измените решение etc.
--------------------
Ребята, как же это вы без гравицапы пепелац выкатываете из гаража? Это непорядок. ©
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|