Страница 1 из 1
Измеритель светового потока на ATmega88
Добавлено: Чт янв 30, 2014 11:25:50
service47
В этой теме будет вестись разработка измерителя светового потока на контроллере ATmega88, в том числе и написание программы на языке си в AtmelStudio 6.0. По окончании разработки будут выложены прошивки и принципиальная схема с платой.
На данный момент составлена принципиальная схема:
1. Питание от 5В разъем Х9, с фильтрующими конденсаторами С13, С14.
2. R27, C17 автосброс MCU.
3. C16, L3 и С18 опорное напряжение для работы АЦП.
4. R28, R29 делитель напряжения для отслеживания разряда аккумулятора питания (АЦП7).
5. Кнопка S7 будет включать MCU из спящего режима.
6. U6, U8, U9, U10 циферные индикаторы, подключенные для динамической индикации.
7. Зеленый блок: Основным элементом является фотодиод D5 (ФД24К) формирующий от силы света фототок и Операционный Усилитель U11 (OP184), преобразующий фототок в напряжение. R31, C19 интегрирующая цепь.
Принципиальная схема:
Принцип работы:
Выход ОУ U11 соединен с АЦП MCU, который после очередного преобразования запишет преобразованную величину в переменную и программно выведет значение на четыре индикатора.
Вопросы:
1. Правильно ли сформирован и подсоединен зеленый блок?
2. Правильные ли величины элементов в зеленом блоке?
3. Примерно какие величины напряжения будут подаваться на пин ADC6 после ОУ?
Если не сложно посмотрите даташиты на
на фотодиод ФД24К:
http://lib.chipdip.ru/985/DOC000985662.pdf
на ОУ OP184:
http://www.analog.com/static/imported-f ... 84_484.pdf
на MCU ATmega88:
http://www.atmel.com/images/doc2545.pdf
Re: Измеритель светового потока на ATmega88
Добавлено: Чт янв 30, 2014 12:53:05
BOB51
Одна из возможных "ловушек" - фотодиод/фоторезистор "ловит" не только свет, но и температуру, заранее позаботьтесь о подавлении/компенсации возможных влияний.

Re: Измеритель светового потока на ATmega88
Добавлено: Пт янв 31, 2014 09:08:43
service47
Написал программу по примеру индикаторов с общим катодом, приведенному тут:
http://radioparty.ru/index.php/prog-avr ... -voltmeter
Но она в протеусе не работает, АЦП настроил, таймер тоже, динамическая индикация по примеру. Вместо фотодиода - батарейки.
Посмотрите код 77 строк:
Спойлер
Код: Выделить всё
#define F_CPU 1000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9----dp
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80};
volatile unsigned char segcounter = 0;
volatile int display = 0;
ISR(TIMER2_OVF_vect)
{
PORTB = 0x00;
PORTC = ~(1 << segcounter);
switch (segcounter)
{
case 0:
PORTB = SEGMENTE[display % 10000 / 1000];
break;
case 1:
PORTB = (SEGMENTE[display % 1000 / 100])|0x80; // добавляем десятичную точку
break;
case 2:
PORTB = SEGMENTE[display % 100 / 10];
break;
}
if ((segcounter++) > 2) segcounter = 0;
}
volatile unsigned long value;
volatile unsigned int adc_counter;
// Прерывание по окончанию преобразования АЦП
ISR (ADC_vect)
{
value = value + (ADC*11/4);
adc_counter++;
}
int main(void)
{
DDRC |= (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
PORTC=0x00;
DDRB=0xFF; //0b11111111 0-ввод 1-вывод
PORTB=0x00;
EICRA = (1<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00); // настройка срабатывания прерываний The falling edge of INT1 generates an interrupt request
//PCICR |= (1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);// разрешение прерываний PCINT23...16
//PCMSK2=0b11000000; //разрешаем прерывание pcint23 pcint22
EIMSK=0b11000011; // 0b11000011 разрешаем прерывание int0 и int1 - кнопка
MCUCR=0b00001111;// 0b00001111 IVSEL, IVCE
TIMSK2 |= (1 << TOIE2); // разрешение прерывания по таймеру2
TCCR2A |= (1 << CS21); //предделитель на 8
ADCSRA |= (1 << ADEN) // разрешение АЦП
|(1 << ADSC) // запуск преобразования
|(1 << ADATE) // --непрерывный режим работы АЦП
|(1 << ADPS2)|(1 << ADPS1)|(0 << ADPS0) // предделитель на 64 (частота АЦП 125kHz)
|(1 << ADIE); // разрешение прерывания
ADMUX |= (0 << REFS1)|(1 << REFS0) // внутренний ИОН 2,56V
|(0 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0); // вход ADC7
_delay_ms(50);
sei(); //Глобальное разрешение прерываний
while(1)
{
if (adc_counter > 300) // вычисляем среднее значение АЦП
{
display = value/adc_counter;
adc_counter = 0;
value = 0;
}
_delay_ms(50);
}
}
ВСЕ заработало и АЦП и таймер, в понедельник выложу.
Re: Измеритель светового потока на ATmega88
Добавлено: Пн фев 03, 2014 09:04:50
service47
Как и обещал: выкладываю схему принципиальную, схему в протеусе, схему в DipTrace, прошивку и исходник. Все во вложении.
Спойлер
Код: Выделить всё
#define F_CPU 1000000UL
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/delay.h>
//------------------0-----1-----2-----3-----4-----5-----6-----7-----8------9----dp
char SEGMENTE[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x80};
volatile unsigned char segcounter = 0;
volatile int display = 0;
ISR(TIMER2_OVF_vect)
{
PORTB = 0x00;
PORTC = ~(1 << segcounter);
switch (segcounter)
{
case 0:
PORTB = SEGMENTE[display % 10 / 1];
break;
case 1:
PORTB = (SEGMENTE[display % 100 / 10])|0x80; // добавляем десятичную точку
break;
case 2:
PORTB = SEGMENTE[display % 1000 / 100];
break;
case 3:
PORTB = SEGMENTE[display % 10000 / 1000];
break;
}
if ((segcounter++) > 2) segcounter = 0;
}
volatile unsigned long value;
volatile unsigned int adc_counter;
// Прерывание по окончанию преобразования АЦП
ISR (ADC_vect)
{
value = value + (ADC*11/4);
adc_counter++;
}
int main(void)
{
DDRC |= (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
PORTC=0x00;
DDRB=0xFF; //0b11111111 0-ввод 1-вывод
PORTB=0x00;
EICRA = (1<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00); // настройка срабатывания прерываний The falling edge of INT1 generates an interrupt request
//PCICR |= (1<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);// разрешение прерываний PCINT23...16
//PCMSK2=0b11000000; //разрешаем прерывание pcint23 pcint22
EIMSK=0b11000011; // 0b11000011 разрешаем прерывание int0 и int1 - кнопка
MCUCR=0b00001111;// 0b00001111 IVSEL, IVCE
TIMSK2 |= (1 << TOIE2); // разрешение прерывания по таймеру2
TCCR2B |= (1 << CS21); //предделитель на 8
ADCSRA |= (1 << ADEN) // разрешение АЦП
|(1 << ADSC) // запуск преобразования
|(1 << ADATE) //
|(1 << ADPS2)|(1 << ADPS1)|(0 << ADPS0) // предделитель на 64 (частота АЦП хз 125kHz)
|(1 << ADIE); // разрешение прерывания
ADMUX |= (0 << REFS1)|(1 << REFS0) // внутренний ИОН 2,56V
|(0 << MUX3)|(1 << MUX2)|(1 << MUX1)|(1 << MUX0); // вход ADC7
_delay_ms(50);
sei(); //Глобальное разрешение прерываний
while(1)
{
if (adc_counter > 300) // вычисляем среднее значение АЦП
{
display = value/adc_counter;
adc_counter = 0;
value = 0;
}
_delay_ms(50);
ADCSRA |= (1 << ADSC);
// display=1234; для теста
// PORTB = 0x00;
// PORTC = ~(1 << segcounter);
// switch (segcounter)
// {
// case 0:
// PORTB = SEGMENTE[display % 10 / 1];
// break;
// case 1:
// PORTB = (SEGMENTE[display % 100 / 10])|0x80; // добавляем десятичную точку
// break;
// case 2:
// PORTB = SEGMENTE[display % 1000 / 100];
// break;
// case 3:
// PORTB = SEGMENTE[display % 10000 / 1000];
// break;
// }
// if ((segcounter++) > 2) segcounter = 0;
}
}
Теперь займусь рисованием платы.
Еще вопрос можно ли использовать вместо фотодиода ФД24К фотодиод ФД263-01?
Re: Измеритель светового потока на ATmega88
Добавлено: Пн фев 03, 2014 09:24:17
Ser60
Почитайте для начала статью
http://radiokot.ru/circuit/digital/measure/67/
Там в конце есть ссылка на ветку с обсуждением, в которой имеется адаптация проекта под AVR. Делать это на фотодиоде мягко говоря неразумно.
Re: Измеритель светового потока на ATmega88
Добавлено: Вт фев 04, 2014 11:37:33
service47
Посмотрел тему, программирование на асме для меня неинтересно, а на си уже умею. А вот замена фотодиода заинтересовала.
Нашел вот такое изделие ISL76671 - световой сенсор с усилителем, вместо отдельных фотодиода с операционным усилителем.
Даташит на ISL76671:
http://www.intersil.com/content/dam/Int ... fn7716.pdf
Но его надо покупать и к тому-же не везде он есть, а ФД263-01 уже есть в наличии, собственно под него плату и сделал.
Может есть еще аналоги фотодиодов вместе с усилителем. Напряжение питания в схеме будет 3,8В. Желательно до 200руб.
Еще интересует какие номиналы напряжений будут после ОУ с ФД263 на входе АЦП MCU.
Re: Измеритель светового потока на ATmega88
Добавлено: Вт фев 04, 2014 13:36:08
serg_svd
Замечание по подключению индикаторов. Опять китайский вариант включения применен.
Резисторы надо ставить в сегменты, а общий анод или катод желательно через ключ на транзисторе. В вашем же включении будет разброс по яркости в зависимости от числа включенных сегментов.
Да и в протеусе есть модель 4х разрядного семисегментного индикатора
Re: Измеритель светового потока на ATmega88
Добавлено: Вт фев 04, 2014 21:32:19
Ser60
Согласен с замечанием
serg_svd. Вообще, не ясно чего Вы хотите добиться. Сделать прибор с аналогичным функционалом как в цитируемой выше статье но из подручного материала (фотодиод)? В каких пределах хотите измерять интенсивность (люкс) и какой длины волн? Согласно
ДШ максимум чувствительности ФД24К приходится на инфракрасный диапазон 750-850 нм, что вне диапазона чувствительности глаза. Кроме того, максимальная рабочая освещенность этого фотодиода ограничена значением 1100 лк. Это, фактические, комнатный уровень освещенности у окна днем. На улице даже в тени днем она гораздо выше, я уже не говорю про солнечный день, когда она доходит до 100000 лк и выше. Даже если Вы хотите сделать измеритель для помещений, у ФД24К не нормируется чувствительность, ДШ гарантирует лишь его минимум. Т.е. прокалибровать прибор без образцового люксметра невозможно. А главное зачем все эти сложности, если есть нормальные датчики, снимающие разом все описанные проблемы.
Датчик от Intersil также предназначен для работы с малым уровнем освещенности. Вообще датчиков освещенности имеется много на любой вкус.
Вот, выбирайте.
Re: Измеритель светового потока на ATmega88
Добавлено: Ср фев 05, 2014 10:26:30
service47
2 serg_svd:
Это у нас в конторе принято подключать так индикаторы по "китайски".
2 Ser60:
Наша фирма выпускает стоматологические лампы и необходимо мерять мощность ламп, вот и создаю измеритель светового потока. Используются светодиоды XTEARY-0-D46-340-F0.
Калибровать хотел программно, еще интересовал вопрос, чтобы не сжечь вход АЦП.
За ссылку на датчики спасибо, присмотрел OPT101.
Даташит OPT101:
http://pdf1.alldatasheet.com/datasheet- ... T101P.html
Re: Измеритель светового потока на ATmega88
Добавлено: Чт фев 06, 2014 02:41:04
Ser60
Для нормальной работы АЦП следует подавать на его вход напряжение, не превышающее опорного. Если последнее будет равно напряжению питания, то это условие выполнится автоматически.
Посмотрел я параметры мекоторых светодиодов. Именно такого типа как выше не нашел, но у других этой серии, особенно тех что излучают холодный свет, в спектре излучения доминирует низкочатотные составляющие в районе 450 нм. В этом случае они опять вне зоны максимальной чувствительности датчика.
Я не понимаю, почему не применить калиброванный изготовителем датчик с цифровым интерфейсом, например тот-же МАХ44009, внесто того, чтобы сооружать нечто, как здесь гворят, "из говна и палок". Если делаете прибор для фирмы, можно и растрясти ее на заказ с дорогой доставкой, например с digikey.com. Для фирмы, особенно производящей медицинское оборудование, такие расходы - просто семечки. Если это так, то чего я еще больше не понимаю - это почему такой фирме просто не купить готовый сертифицированный измеритель и не заниматься самодеятельностью. Без обид, но Вы задаете на форуме вопросы уровня новичков, и в этом ничего нет зазорного - научитесь. Но я не понимаю как фирма доверила разработку прибора для контроля ее продукции молодому специалисту без опыта. И еще, если Ваша фирма не филиал китайской, почему не поставить резисторы к каждому светодиоду индикатора, как оно должно быть. Что-то я много чего не понимаю...