Измеритель светового потока на ATmega88

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Сообщение 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
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15753
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Одна из возможных "ловушек" - фотодиод/фоторезистор "ловит" не только свет, но и температуру, заранее позаботьтесь о подавлении/компенсации возможных влияний.
:beer:
Реклама
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Сообщение 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);
    }
}
ВСЕ заработало и АЦП и таймер, в понедельник выложу.
Вложения
IM_scheme_1.rar
Файл протеуса.
(45.39 КБ) 228 скачиваний
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Сообщение 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?
Вложения
Измеритель_мощности_света_1.rar
Схема DipTrace, схема Proteus, исходник AtmelStudio6.0, прошивка HEX, бэта версии.
(408.93 КБ) 166 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Почитайте для начала статью
http://radiokot.ru/circuit/digital/measure/67/
Там в конце есть ссылка на ветку с обсуждением, в которой имеется адаптация проекта под AVR. Делать это на фотодиоде мягко говоря неразумно.
Реклама
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Сообщение service47 »

Посмотрел тему, программирование на асме для меня неинтересно, а на си уже умею. А вот замена фотодиода заинтересовала.
Нашел вот такое изделие ISL76671 - световой сенсор с усилителем, вместо отдельных фотодиода с операционным усилителем.
Даташит на ISL76671: http://www.intersil.com/content/dam/Int ... fn7716.pdf
Но его надо покупать и к тому-же не везде он есть, а ФД263-01 уже есть в наличии, собственно под него плату и сделал.

Может есть еще аналоги фотодиодов вместе с усилителем. Напряжение питания в схеме будет 3,8В. Желательно до 200руб.

Еще интересует какие номиналы напряжений будут после ОУ с ФД263 на входе АЦП MCU.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2564
Зарегистрирован: Ср янв 16, 2008 08:34:04
Откуда: KMV

Сообщение serg_svd »

Замечание по подключению индикаторов. Опять китайский вариант включения применен.
Резисторы надо ставить в сегменты, а общий анод или катод желательно через ключ на транзисторе. В вашем же включении будет разброс по яркости в зависимости от числа включенных сегментов.
Да и в протеусе есть модель 4х разрядного семисегментного индикатора
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Согласен с замечанием serg_svd. Вообще, не ясно чего Вы хотите добиться. Сделать прибор с аналогичным функционалом как в цитируемой выше статье но из подручного материала (фотодиод)? В каких пределах хотите измерять интенсивность (люкс) и какой длины волн? Согласно ДШ максимум чувствительности ФД24К приходится на инфракрасный диапазон 750-850 нм, что вне диапазона чувствительности глаза. Кроме того, максимальная рабочая освещенность этого фотодиода ограничена значением 1100 лк. Это, фактические, комнатный уровень освещенности у окна днем. На улице даже в тени днем она гораздо выше, я уже не говорю про солнечный день, когда она доходит до 100000 лк и выше. Даже если Вы хотите сделать измеритель для помещений, у ФД24К не нормируется чувствительность, ДШ гарантирует лишь его минимум. Т.е. прокалибровать прибор без образцового люксметра невозможно. А главное зачем все эти сложности, если есть нормальные датчики, снимающие разом все описанные проблемы.

Датчик от Intersil также предназначен для работы с малым уровнем освещенности. Вообще датчиков освещенности имеется много на любой вкус. Вот, выбирайте.
Прорезались зубы
Сообщения: 219
Зарегистрирован: Вт мар 12, 2013 16:05:45

Сообщение service47 »

2 serg_svd:
Это у нас в конторе принято подключать так индикаторы по "китайски". :)

2 Ser60:
Наша фирма выпускает стоматологические лампы и необходимо мерять мощность ламп, вот и создаю измеритель светового потока. Используются светодиоды XTEARY-0-D46-340-F0.
Калибровать хотел программно, еще интересовал вопрос, чтобы не сжечь вход АЦП.
За ссылку на датчики спасибо, присмотрел OPT101.
Даташит OPT101: http://pdf1.alldatasheet.com/datasheet- ... T101P.html
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Для нормальной работы АЦП следует подавать на его вход напряжение, не превышающее опорного. Если последнее будет равно напряжению питания, то это условие выполнится автоматически.

Посмотрел я параметры мекоторых светодиодов. Именно такого типа как выше не нашел, но у других этой серии, особенно тех что излучают холодный свет, в спектре излучения доминирует низкочатотные составляющие в районе 450 нм. В этом случае они опять вне зоны максимальной чувствительности датчика.

Я не понимаю, почему не применить калиброванный изготовителем датчик с цифровым интерфейсом, например тот-же МАХ44009, внесто того, чтобы сооружать нечто, как здесь гворят, "из говна и палок". Если делаете прибор для фирмы, можно и растрясти ее на заказ с дорогой доставкой, например с digikey.com. Для фирмы, особенно производящей медицинское оборудование, такие расходы - просто семечки. Если это так, то чего я еще больше не понимаю - это почему такой фирме просто не купить готовый сертифицированный измеритель и не заниматься самодеятельностью. Без обид, но Вы задаете на форуме вопросы уровня новичков, и в этом ничего нет зазорного - научитесь. Но я не понимаю как фирма доверила разработку прибора для контроля ее продукции молодому специалисту без опыта. И еще, если Ваша фирма не филиал китайской, почему не поставить резисторы к каждому светодиоду индикатора, как оно должно быть. Что-то я много чего не понимаю...
Ответить

Вернуться в «AVR»