roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 18:21

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: работа с несколькими АЦП
СообщениеДобавлено: 29 июл 2009, 17:52 
Не в сети

Зарегистрирован: 29 июл 2009, 14:11
Сообщения: 12
Откуда: Всеволожск (СПб)
Всех приветствую!

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

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
тег code удобно использовать.

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 09:23 
Не в сети

Зарегистрирован: 29 июл 2009, 14:11
Сообщения: 12
Откуда: Всеволожск (СПб)
Вложения не получается добавить, поле остается пустым :pardon:
Тег CODE буду использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 10:16 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Вы кнопку "добавиь файл" нажмте. Еще есть http://slil.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 12:42 
Не в сети
Аватара пользователя

Зарегистрирован: 27 ноя 2004, 00:42
Сообщения: 3339
Откуда: совсем Москва
ФИО: Григорий
Но вообще, всякие slil и прочие сторонние ресурсы не поощряются, практически запрещены.
Добавление вложения должно работать - никогда ни у кого проблем не было: не находили сам пункт - это да. А вот чтоб не добавлялось, да еще и ошибок не выводило - этого не припомню.

_________________
злой полицейский


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 12:57 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
У меня не добавляется как раньше было - т.е. просто указать файл теперь не достаточно. Надо нажать "добавть вложение" - при этом выскакиевает окно для следующего вложения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 13:12 
Не в сети

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 13:15 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Я вам выше писал АРХИВ надо прицеплять ! И ВСЮ папку - с исходниками с прошивкой. Че смотреть на схему в PROTEUS ? Картинку можно и так на обозрение выложить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 14:34 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 09 фев 2006, 15:36
Сообщения: 3339
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков
Интересно что это за глюкавый браузер такой?

_________________
Linux user | Firefox user


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 14:43 
Не в сети

Зарегистрирован: 29 июл 2009, 14:11
Сообщения: 12
Откуда: Всеволожск (СПб)
Вот архив с проектом
http://slil.ru/27870138


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 15:14 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Наверно вот такой куcок подойдет для индикации, и для вывода аналогично. Помоему у вас номера-индексы в коментариях по разному обозначены. И вот это наверно не правильно:

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

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

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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 16:41 
Не в сети

Зарегистрирован: 29 июл 2009, 14:11
Сообщения: 12
Откуда: Всеволожск (СПб)
Пардон, неправильно описал задачу.
АКБ составлен из трех банок соединенных последовательно. Напряжение на входах АЦП меряется относительно общего провода (массы). Соответственно на входах АЦП будут разные напряжения. на 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: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 16:53 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Просто на схеме вашей я увидел что делители стоят так что напруга на вольтметрах почти одинакова. Зделайте на схеме делители такие какие в реале будут.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 17:16 
Не в сети

Зарегистрирован: 29 июл 2009, 14:11
Сообщения: 12
Откуда: Всеволожск (СПб)
Так вот же я в последней ссылке http://slil.ru/27870481начертил как будет в реале и напряжения куда какие указаны.
Вы первую схему просимулируйте, там видно, что напряжения все разные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: работа с несколькими АЦП
СообщениеДобавлено: 30 июл 2009, 17:29 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Тогда вот так - но индексы нужно поставить правильные

Код:
/////////////////  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; };


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO