Страница 1 из 1
АЦП для последовательных аккумуляторных батарей
Добавлено: Вс июн 08, 2014 00:48:30
sirha
Всем привет подскажите пожалуста как мерить напряжение на каждой акк батарее которые соединены последовательно,хочу с помощью atmega8 ,знаю что такое ацп, но не пойму коего чего при измерении ведь минус то всегда один минус atmega8 ,как же измерять напряжение каждой батареи которые соединены последовательно?,можете нарисовать чтобы понятнее стало
Re: АЦП В ATMEGA8
Добавлено: Вс июн 08, 2014 00:52:26
Ser60
Напряжение заземленной батареи измеряйте как обычно. Потом измерьте напряжение двух последовательно соединенных батарей. Напряжение на второй батарее получите вычитанием.
Re: АЦП В ATMEGA8
Добавлено: Вс июн 08, 2014 01:06:32
sirha
Ser60 писал(а):Напряжение заземленной батареи измеряйте как обычно. Потом измерьте напряжение двух последовательно соединенных батарей. Напряжение на второй батарее получите вычитанием.
Спасибо

,прикольно)
Re: АЦП для последовательных аккумуляторных батарей
Добавлено: Вс июн 08, 2014 08:43:36
pyzhman
off: несказанно удивлен отсутствием восклицательных знаков (а то и не одного) после каждого предложения ТС. Приятно видеть.
Re: АЦП для последовательных аккумуляторных батарей
Добавлено: Вс июн 08, 2014 09:05:03
BigallS
sirha писал(а):Всем привет подскажите пожалуста как мерить напряжение на каждой акк батарее которые соединены последовательно,... ,как же измерять напряжение каждой батареи которые соединены последовательно?,можете нарисовать чтобы понятнее стало
Если пара батарей то проблем не будет, а вот если много последовательно включённых то почитайте статью
http://embedders.org/node/168
Re: АЦП для последовательных аккумуляторных батарей
Добавлено: Вс июн 08, 2014 12:11:52
sirha
Подскажите пожалуйста что не так с двумя батареями получилось ,вообщем с четырьмя результат не всегда точный ,нужна точность до 0.1 вольта как это сделать?
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
int a;
int b;
int c;
int d;
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 4
unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0x20
interrupt [ADC_INT] void adc_isr(void) //стандартное прерывание по ADC от CVAVR
{
static unsigned char input_index=0;
// Read the 8 most significant bits
// of the AD conversion result
adc_data[input_index]=ADCH;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
void main(void)
{
PORTD=0x00;
DDRD=0xFF;
PORTB=0x00;
DDRB=0xFF;
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCC;
#asm("sei")
while (1)
{
a=adc_data[3];
b=adc_data[2];
c=adc_data[1];
d=adc_data[0];
if ((d-c)>48) PORTD.3=1;
else PORTD.3=0;
if ((c-b)>48) PORTD.2=1;
else PORTD.2=0;
if ((b-a)>48) PORTD.1=1;
else PORTD.1=0;
if (a>48) PORTD.0=1;
else PORTD.0=0;
}}
фото в протеусе: