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

 
 
> Работа с АЦП в TINY13, Нужны примеры на С
Bogila Anton
сообщение Aug 10 2009, 14:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-09-07
Из: Kiev
Пользователь №: 30 288



Сабж, а конкретнее: есть VСС=4.90V, подаю на вход АЦП (PORTB.2) через делитель от 0 до 4900mV согласно правилам. Нужен пример где идет постоянное измерение напряжения, и в результате чтоб была конечная переменная со значением в mV. Не понятно: какой Vref, и какие типы данных следует применять. Супер-мега точность не нужна.
В CodeVision выставляю вот это (на картинке).
Куски кода которые относятся к АЦП:

//9000mV on Batt = 4900mV on ADC (4900*1.84 = 9016mV) kv = 1.84

#define ADC_VREF_TYPE 0x00 //(что значит эта строка?)
#define VREF 4900 //mV (не знаю нодо ли это, или как правильно?)

unsigned int VCC, kv=1.84; //(какой тип данных следует применять?)

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void BATT_VCC () { //vichislenie BATT_VCC (mV)
VCC = read_adc(1); // VСС = 0-1024, 1 - nomer kanala ADC
VCC = VCC*VREF/1024;
VCC = VCC*kv; //(VСС mV)
}

BATT_VCC ();

Это правильно?

Сообщение отредактировал Bogila Anton - Aug 10 2009, 14:40
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Aug 10 2009, 15:31
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Bogila Anton @ Aug 10 2009, 17:38) *
#define ADC_VREF_TYPE 0x00 //(что значит эта строка?)


В совокупности со строчкой:
Цитата
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

Значит, что VCC used as analog reference.

Цитата
#define VREF 4900 //mV (не знаю нодо ли это, или как правильно?)

Измерить тестером VCC и указать реальное значение VCC в миливольтах.

Цитата
unsigned int VCC, kv=1.84; //(какой тип данных следует применять?)

для констант вида 1.84 - float, но в tiny13 float не влезет, следовательно unsigned short и поменять логику вычислений на целочисленную.

Цитата
Это правильно?

Работать не будет. У вас в кучу смешаны вольты и миливольты, плюс как для измерения VCC выбран неправильный референс.


Если требуется измерить Vcc, то подход на тини13 д.б. такой:

выбрать Internal Voltage Reference 1.1V (ADMUX bit REFS0 = 1).
На вход канала PB2 через делитель 1/5 подавать VCC.
Результат АЦП преобразовать в миливольты по нехитрой формуле:

VCC = ADC * 43 / 8;
или
VCC = ADC * 43 >> 3;



Как получились цифры 43 и 8:

Vbgref = 1.1V (из даташита).
Vin (при Vcc=5V) = 1V
5000mv = k * ADC;
ADC (при Vcc=5V) = 1023 / 1.1 = 930.

k = 5000 / 930 = 5.3763

Чтобы не сильно потерять в точности при целочисленной арифметике, домножаем k на 8 с округлением до целого:
K = 8k = 43.010 (43 после округления)

С таким K, результат будет в 1/8 миливольта. Приводим его обратно к миливольтам делением на 8 (эквивалентно сдвигу результата вправо на 3 разряда) и имеем то, что имеем:

VCC = ADC * 43 >> 3;
Go to the top of the page
 
+Quote Post
Bogila Anton
сообщение Aug 10 2009, 20:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 15
Регистрация: 4-09-07
Из: Kiev
Пользователь №: 30 288



Мне нужно измерять напряжение от 0-9V. Делитель токой что при 9V которые надо измерять, на входе АЦП 4.9V, при питании контроллера 4.9V.

Я не совсем понял как задать Vref от VCC контроллера, тоесть 4.9V в моем случае. Это оно:
#define ADC_VREF_TYPE 0x00
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
тогда что такое adc_input? Это вход АЦП тоесть в моем случае ADMUX=1 | (ADC_VREF_TYPE & 0xff);

При Vref от VCC будет ли работать это:
//9000mV on Batt = 4900mV on ADC (4900*1.84 = 9016mV) kv = 1.84
#define VREF 4900
void BATT_VCC () {
ADC = read_adc(1);
VCC = (ADC*VREF/1023)*kv;
}
//VCC = (0*4900/1023)*1.84 = 0
//VCC = (1023*4900/1023)*1.84 = 9016 mV
В теории вроде верно?

Сообщение отредактировал Bogila Anton - Aug 10 2009, 20:59
Go to the top of the page
 
+Quote Post



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

 


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


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