Проектирую устройство сигнализирующее о разряде АКБ. Зашел в тупик. Необходимо, при снижении до определенного уровня напряжения на входе любого из трех задействованых АЦП,выводить сигнал на соответствующий выход, например, порта В(PB0,PB1,PB2). Причем, напряжение на первой банке АКБ получается вычитанием U1=U1-U2-U3, на второй U2=U2-U1 и на третьей U3=U3. После АЦ преобазования U1,U2,U3 должны сравниваться с предельным напряжением, которое составляет 3,1в. Три последовательных АЦ преобразования я делаю, но результат сравнения напряжений смог вывести только на один выход МК PB0 (поочередно с каждого АЦП), а надо на три разных выхода. Схема и симуляция в Протеусе. Код прилагаю:
#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=0x01; наверно можно писать PORTB.1 = 1;
и условия if пишите столько сколько вам нужно чтобы все вывести. А можно case использовать - это опертор множественного выбора - пример в "Язык си для микроконтроллеров" - http://avr123.nm.ru/05.htm
Советую архив с проектами прикладывать ! к вопросам.
Но вообще, всякие slil и прочие сторонние ресурсы не поощряются, практически запрещены. Добавление вложения должно работать - никогда ни у кого проблем не было: не находили сам пункт - это да. А вот чтоб не добавлялось, да еще и ошибок не выводило - этого не припомню.
У меня не добавляется как раньше было - т.е. просто указать файл теперь не достаточно. Надо нажать "добавть вложение" - при этом выскакиевает окно для следующего вложения.
Схема проекта http://slil.ru/27869772 Добавить вложение нажимал, выбирал файл через обзор, в окне путь к нему появлялся, но после нажатия "добавить файл" он не добавился и поле остается пустым. По проекту: После первого АЦ преобразования, я так понимаю, результат надо как-то сохранить, потому что после второго АЦ преобразования (которое тоже надо сохранить)первое надо вычесть из второго и уже потом сравнивать. Так же и с третим АЦП. Из него надо вычесть второе и первое АЦП и только потом сравнивать. Куда складывать промежуточные АЦ преобразования?
Я вам выше писал АРХИВ надо прицеплять ! И ВСЮ папку - с исходниками с прошивкой. Че смотреть на схему в PROTEUS ? Картинку можно и так на обозрение выложить.
Наверно вот такой куcок подойдет для индикации, и для вывода аналогично. Помоему у вас номера-индексы в коментариях по разному обозначены. И вот это наверно не правильно:
// результатом U bat1 будет вычитание Ubat1- Ubat2- Ubat3 // (результат преобразования ADC2=ADC2-ADC1-ADC0)
Ведь у вас делители все разные. Т.е. при одинаковых напругах на акумах у вас разница измерений будет НОЛЬ.
Так как у вас написано было бы правильно если бы все делители были одинаковы. Тогда возникла бы разница в измерениях при одинаковых напругах.
ИМХО правильно все делители сделать одинаковыми. Это и по компонентам проще и вычисления наверно прощею
======== Советую в отладке использовать UART - это удобно очень - вот как это можно сделать - http://avr123.nm.ru/z4.htm
И можно делать по многу АЦП подряд и суммировать результаты.
Все приборы которые надо видеть при симуляции сгруппируйте компактно чтоб можно было использовать максимальное увеличение на экране.
Пардон, неправильно описал задачу. АКБ составлен из трех банок соединенных последовательно. Напряжение на входах АЦП меряется относительно общего провода (массы). Соответственно на входах АЦП будут разные напряжения. на 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начертил как будет в реале и напряжения куда какие указаны. Вы первую схему просимулируйте, там видно, что напряжения все разные.