Проектирую устройство сигнализирующее о разряде АКБ. Зашел в тупик.
Необходимо, при снижении до определенного уровня напряжения на входе любого из трех задействованых АЦП,выводить сигнал на соответствующий выход, например, порта В(PB0,PB1,PB2). Причем, напряжение на первой банке АКБ получается вычитанием U1=U1-U2-U3, на второй U2=U2-U1 и на третьей U3=U3. После АЦ преобазования U1,U2,U3 должны сравниваться с предельным напряжением, которое составляет 3,1в.
Три последовательных АЦ преобразования я делаю, но результат сравнения напряжений смог вывести только на один выход МК PB0 (поочередно с каждого АЦП), а надо на три разных выхода.
Схема и симуляция в Протеусе.
Код прилагаю:
- Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#define FIRST_ADC_INPUT 0
#define LAST_ADC_INPUT 2
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; // тут будет лежать результат измерения
#define ADC_VREF_TYPE 0x40 // относительно чего оцифровывать (AVCC +5v )
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0; // номер входа АЦП
adc_data[input_index]=ADCW; // читаем результат АЦ преобразования
// результатом U bat1 будет вычитание Ubat1- Ubat2- Ubat3 (результат преобразования ADC2=ADC2-ADC1-ADC0)
// результатом Ubat2 будет вычитание Ubat2- Ubat3 (результат преобразования ADC1=ADC1-ADC0)
// Ubat3=Ubat3 (результат преобразования ADC0=ADC0)
PORTD=ADCW;
if (adc_data[input_index]<212) { //если U на входе делителя <3.1v (на АЦП<1.033v)
PORTB=0x01;
}
else {
PORTB=0x00;
};
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) //выбираем следующий вход АЦП
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
delay_us(10); // пауза для стабилизации V на входе АЦП
ADCSRA|=0x40; // запуск АЦ преобразования
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 62,500 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xCE;
#asm("sei")
while (1)
{
};
}
Модератор "Digit":Для вставки листингов есть спец.тег - CODE (кнопочка над окном ввода ответа).
Вставка "портянок" запрещена - мешает читать.