roboforum.ru

Технический форум по робототехнике.

работа с несколькими АЦП

работа с несколькими АЦП

Rusfaner » 29 июл 2009, 17:52

Всех приветствую!

Проектирую устройство сигнализирующее о разряде АКБ. Зашел в тупик.
Необходимо, при снижении до определенного уровня напряжения на входе любого из трех задействованых АЦП,выводить сигнал на соответствующий выход, например, порта В(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 (кнопочка над окном ввода ответа).
Вставка "портянок" запрещена - мешает читать.

Re: работа с несколькими АЦП

avr123.nm.ru » 29 июл 2009, 17:55

тег code удобно использовать.

вместо PORTB=0x01; наверно можно писать PORTB.1 = 1;

и условия if пишите столько сколько вам нужно чтобы все вывести. А можно case использовать - это опертор множественного выбора - пример в "Язык си для микроконтроллеров" - http://avr123.nm.ru/05.htm

Советую архив с проектами прикладывать ! к вопросам.

Re: работа с несколькими АЦП

Rusfaner » 30 июл 2009, 09:23

Вложения не получается добавить, поле остается пустым :pardon:
Тег CODE буду использовать.

Re: работа с несколькими АЦП

avr123.nm.ru » 30 июл 2009, 10:16

Вы кнопку "добавиь файл" нажмте. Еще есть http://slil.ru

Re: работа с несколькими АЦП

Digit » 30 июл 2009, 12:42

Но вообще, всякие slil и прочие сторонние ресурсы не поощряются, практически запрещены.
Добавление вложения должно работать - никогда ни у кого проблем не было: не находили сам пункт - это да. А вот чтоб не добавлялось, да еще и ошибок не выводило - этого не припомню.

Re: работа с несколькими АЦП

avr123.nm.ru » 30 июл 2009, 12:57

У меня не добавляется как раньше было - т.е. просто указать файл теперь не достаточно. Надо нажать "добавть вложение" - при этом выскакиевает окно для следующего вложения.

Re: работа с несколькими АЦП

Rusfaner » 30 июл 2009, 13:12

Схема проекта
http://slil.ru/27869772
Добавить вложение нажимал, выбирал файл через обзор, в окне путь к нему появлялся, но после нажатия "добавить файл" он не добавился и поле остается пустым.
По проекту:
После первого АЦ преобразования, я так понимаю, результат надо как-то сохранить, потому что после второго АЦ преобразования (которое тоже надо сохранить)первое надо вычесть из второго и уже потом сравнивать. Так же и с третим АЦП. Из него надо вычесть второе и первое АЦП и только потом сравнивать.
Куда складывать промежуточные АЦ преобразования? :oops:

Re: работа с несколькими АЦП

avr123.nm.ru » 30 июл 2009, 13:15

Я вам выше писал АРХИВ надо прицеплять ! И ВСЮ папку - с исходниками с прошивкой. Че смотреть на схему в PROTEUS ? Картинку можно и так на обозрение выложить.

Re: работа с несколькими АЦП

Vooon » 30 июл 2009, 14:34

Интересно что это за глюкавый браузер такой?

Re: работа с несколькими АЦП

Rusfaner » 30 июл 2009, 14:43

Вот архив с проектом
http://slil.ru/27870138

Re: работа с несколькими АЦП

avr123.nm.ru » 30 июл 2009, 15:14

Наверно вот такой куcок подойдет для индикации, и для вывода аналогично. Помоему у вас номера-индексы в коментариях по разному обозначены. И вот это наверно не правильно:

// результатом U bat1 будет вычитание Ubat1- Ubat2- Ubat3
// (результат преобразования ADC2=ADC2-ADC1-ADC0)

Ведь у вас делители все разные. Т.е. при одинаковых напругах на акумах у вас разница измерений будет НОЛЬ.

Так как у вас написано было бы правильно если бы все делители были одинаковы. Тогда возникла бы разница в измерениях при одинаковых напругах.

ИМХО правильно все делители сделать одинаковыми. Это и по компонентам проще и вычисления наверно прощею

========
Советую в отладке использовать UART - это удобно очень - вот как это можно сделать - http://avr123.nm.ru/z4.htm

И можно делать по многу АЦП подряд и суммировать результаты.

Все приборы которые надо видеть при симуляции сгруппируйте компактно чтоб можно было использовать максимальное увеличение на экране.

PROTEUS обновите ! http://proteus123.narod.ru

Re: работа с несколькими АЦП

Rusfaner » 30 июл 2009, 16:41

Пардон, неправильно описал задачу.
АКБ составлен из трех банок соединенных последовательно. Напряжение на входах АЦП меряется относительно общего провода (массы). Соответственно на входах АЦП будут разные напряжения. на ADC0 4.2v/3(делитель на три), на ADC1 8.4v/3, на ADC2 12.6v/3.
А нужно вычислять напяжение каждой банки, для этого и вычитается меньшее из большего (ADC0=4.2v, ADC1=8.4v-4.2v=4.2v, ADC2= 12.6v-4.2v-4.2v=4.2v это без делителя).
Общее напряжение трех банок измерять смысла нет, так как разряжаются они по разному.Ну вот и озадачил себя, блин.

http://slil.ru/27870481

Re: работа с несколькими АЦП

avr123.nm.ru » 30 июл 2009, 16:53

Просто на схеме вашей я увидел что делители стоят так что напруга на вольтметрах почти одинакова. Зделайте на схеме делители такие какие в реале будут.

А регуляторы поставье вместо акумов и параллелно акумам вольтметры для наглядности.

Re: работа с несколькими АЦП

Rusfaner » 30 июл 2009, 17:16

Так вот же я в последней ссылке http://slil.ru/27870481начертил как будет в реале и напряжения куда какие указаны.
Вы первую схему просимулируйте, там видно, что напряжения все разные.

Re: работа с несколькими АЦП

avr123.nm.ru » 30 июл 2009, 17:29

Тогда вот так - но индексы нужно поставить правильные

Код: Выделить всёРазвернуть
/////////////////  LED первого АКБ  -  PB.0 
// результатом U bat1 будет вычитание Ubat1- Ubat2- Ubat3 
// (результат преобразования ADC2=ADC2-ADC1-ADC0) 
if ((adc_data[0] - adc_data[1] - adc_data[2] ) < 212 ) {  PORTB.0 = 1; }   
else  { PORTB.0 = 0; };


/////////////////  LED второго АКБ  - PB.1
// результатом  Ubat2 будет вычитание  Ubat2 - Ubat3 (результат преобразования ADC1=ADC1-ADC0) 
if ((adc_data[0] - adc_data[1] ) < 212 ) {  PORTB.1 = 1; }   
else  { PORTB.1 = 0; };


/////////////////  LED второго АКБ  - PB.2 
// Ubat3=Ubat3  (результат преобразования ADC0=ADC0) 
if (adc_data[0] < 212 ) {  PORTB.2 = 1; }   
else  { PORTB.2 = 0; };


Rambler\'s Top100 Mail.ru counter