реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Приёмник и передатчик на ИК. Проблемы с передачей и приёмом., Схема и плата и софт, но вместе не работает хорошо...
Папа Карло
сообщение Feb 16 2008, 12:16
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Всем привет.

Собрал контроллер и передатчик ИК и написал программы.

Идея такая, чтоб через самосборный джойстик передавать команды на контроллер.

Принцип работы ИК передатчика такой:

1) нажимаем кнопку
2) на контроллер приёмника пускается импульс определённой длительности

Вот код который генерирует импульсы по прерыванию:
Код
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
if(empty) PORTB.0++;//генерация несущей 30кГц
        else PORTB.0 = 0;

timen1++;
timen2++;


//Вычисление длинны импульса
if(pulse)
        {
        empty = 1;
        pulse--;
        }
if(!pulse) { empty = 0;}
}


Пакетный режим пока не выходит организовать, т.к. что то сбоит.
Удалось только подавать пакет вида /старт бит/бит данных/стоп бит/.
МК передатчика генерирует прерывание с частотой 60кГц.
И если нужно передать импульс, то на выход поступает сигнал.

Например лог 0 означает, подать импульс длительностью 20 прерываний.
Лог 1, импульс длительностью 90 прерываний.
Пауза между импульсами 100 прерываний.

Если не передавать пакеты, то приёмник довольно хорошо принимает импульсы и загорается нужный светодиод, но таким макаром мне удалось закодировать только 3 команды.

Если передавать пакетом всё накрывается sad.gif

У приёмника похожая логика.
Ножка сигнальная TSOP1730 подключена к выводу МК и генерирует прерывание.
Код
// Pin change 0-7 interrupt service routine
interrupt [PCINT0] void pin_change_isr0(void)
{
if(PINB.1 == 0)
        {empty = 1;}
else
        {empty = 0;}
}


А прерывание по таймеру происходит с частотой 60кГц и меряет длительность импульса:
Код
// Timer 2 output compare interrupt service routine
interrupt [TIM2_COMPA] void timer2_compa_isr(void)
{
timen++;
timeoff++;
timecomand++;

if(empty) timecount++;//отчёт длинны импульсов

if(timecount && !empty)
       {
       if(timecount > 7 && timecount < 40) pulse = 1;//лог 0
       if(timecount > 50 && timecount < 100) pulse = 2;//лог 1
//       if(timecount > 120 && timecount < 230) pulse = 3;//доп. команда
//       if(timecount > 250 && timecount < 550) pulse = 4;//доп. команда
       timecount = 0;
       }
}


А в цикле функции main уже идёт обработка данных, как у приёмника так и у передатчика.

Ниже подшиваю фотки платы, схемы и исходников на СИ в CodeVisionAVR с комментариями.

Очень хотелось бы понять, где закралась ошибочка ?

----------------------------------------------

Есть ещё интересный глюк, если передатчик включить и положить рядом с приёмником, то приёмник ловит иногда команды, но если передатчик выключить, то приёмник ничего не ловит.

Сообщение отредактировал Папа Карло - Feb 16 2008, 12:46
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение

 

Прикрепленные файлы
Прикрепленный файл  code_C.rar ( 5.33 килобайт ) Кол-во скачиваний: 45
 
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 16 2008, 13:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Папа Карло @ Feb 16 2008, 16:16) *
Есть ещё интересный глюк, если передатчик включить и положить рядом с приёмником, то приёмник ловит иногда команды, но если передатчик выключить, то приёмник ничего не ловит.

А должно быть наоборот? smile.gif

Почему бы не использовать в качестве передатчика готовый пульт от телевизора ?

Что касается ошибок, то они могут быть и в той части текста программы, которую вы не привели.
Например, если переменные pulse и empty не определены, как volatile, запросто могут быть проблемы.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Feb 16 2008, 13:56
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Цитата(Dog Pawlowa @ Feb 16 2008, 16:33) *


1) Если не нажимать кнопки, то передатчик не должен излучать импульсы по программе.
Но если передатчик включён, но не нажимается, то приёмник всё равно ловит ...
А если выключить по питанию передатчик, то приёмник не ловит.

2) Идея хорошая, но я хотел сделать джойстик полноценный, а это пробный вариант для тестов.

3) volatile спасибо учту.

Остальной код я решил положить в архив т.к. там листинг не малый.

----------------------------

МК у передатчика attiny13V на 4.8 МГц
МК приёмника atmega48 на 4МГц

Сообщение отредактировал Папа Карло - Feb 16 2008, 14:02
Go to the top of the page
 
+Quote Post
Serg_Mitin
сообщение Feb 16 2008, 19:27
Сообщение #4





Группа: Новичок
Сообщений: 3
Регистрация: 17-07-07
Пользователь №: 29 192



Приветствую ПАПУ...
Я бы начал искать с передатчика

питане 3В
на диоде падает 1,5-2В, на транзисторе 0,7 В кроме всего еще резистор 100ом...

Выход МК передатчика перевести в режим ШИМ на 30 КГц
и убедиться осциллографом в наличии крутых фронтов

На приемник на базе TSOP повесить шунтирующую емкость по питанию, и в даташите наверняка можно найти типовое подключение и рекомендации

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

Успехов
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Feb 16 2008, 19:57
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



1) Шунтирующую емкость по питанию уже повесил на TSOP.
2) По поводу питания можно по подробнее, что это означает ?
3) Осциллографа увы нету.
4) Мне что то в голову не пришло как ШИМ настроить на 30кГц. По формуле смотрел в ДШ, если поставить делитель 1 на таймер, то переполнения будут с частотой 9кГц примерно у Т0. Или можно как то ещё его настроить ?

Сообщение отредактировал Папа Карло - Feb 16 2008, 19:58
Go to the top of the page
 
+Quote Post
Serg_Mitin
сообщение Feb 16 2008, 20:26
Сообщение #6





Группа: Новичок
Сообщений: 3
Регистрация: 17-07-07
Пользователь №: 29 192



Без осциллографа туго....
питание 3В я хотел сказать про драйвер диода, скорее всего он коряво работает. и вмесо прямоугольника стгнал в виде пилы ... а приемнику нужен четкий сигнал на 30кГц

диод можно попробовать повесить на контроллер я думаю удасться выдавить 15- 20ма резистор 30-100 ом желательно поставить. Можно запаралелить два вывода для увеличения тока

Я не знаю есть у тини возможность задать режим ШИМ и какие я их редко пользовал...
но если совсем просто подойти если там только таймер 0 то это тоскливо. лучше уйти на mega8 я думаю по цене и размерам не большая разница


это для пробы
пока 1{ установим бит и сбросим бит с задержкой}
а на приемнике посмотреть - должна быть 1 пока работает передатчик....

На сегодня все...
Удачи!
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Feb 16 2008, 21:42
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Я уже бьюсь неделю с этой проблемой и много чего успел натестить.
Драйвер диода вы имели ввиду npn транзистор КТ3102АМ ?
Дело в том, что МК attiny13V маловольтная и ток почти не выдаёт на ноги.
Да на ней только таймер 0, но сделать можно много на ней, только надо знать как 07.gif
Вот на atmega48 я спокойно вешал диоды.
Режим ШИМ там есть, но как настроить 30кГц я не знаю.
Может кто подскажет ?

На самом деле приёмник выдаёт 1-ку и при поступлении сигнала скидывает на ноль, если сигнал долго поступает от передатчика, то TSOP опять ставит сам 1 лог.

Причём мне удалось уже ловить на приёмники сигналы разной длительности и код который я дал, как раз и работает так.
Он довольно чётко распознаёт 3 сигнала, но передать пакет сигналов не выходит.

Ктому же у меня есть подозрения, что при передаче питание батарейное проседает и частота у МК начинает гулять.
Я подумывал о смене резистора 100 Ом на 500 Ом.
Сам диод ИК 30МВт. То есть ток 10мА, что означает нужен резистор на 300 Ом.

Если я где ошибся поправьте плиз.

Сообщение отредактировал Папа Карло - Feb 16 2008, 21:43
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Feb 17 2008, 19:22
Сообщение #8


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Потестил с пультом от телека контроллер.
Тестировал только приём импульса любого.
Приём отличный со всех углов.
С передатчика же принимает под меньшим углом и вдвое меньшей дальности.

Выходит у меня передатчик не настроен на частоту 30кГц или частота меняется при подаче импульсов.

Заменил резистор на ИК диоде на 1 кОм, качество приёма не изменилось совсем.

Подскажите пожалуйста как лучше настроить и подавать импульсы 30кГц на attiny13V ?


Подключил ИК диод сразу к ноге МК и приём сразу стал лучше раза в 1.5.

И с больших углов принимает и дальше ловить стал.
Осталось как, то настроить МК точно на 30кГц, но боюсь это сделать не выйдет без осциллографа на attiny13.

Наверно мне надо было взять МК с кварцем, тогда можно было бы точно настроить МК.
Go to the top of the page
 
+Quote Post
Alex_Pol
сообщение Feb 17 2008, 20:38
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-03-05
Из: Украина. Днепропетровск
Пользователь №: 3 626



Цитата(Папа Карло @ Feb 17 2008, 21:22) *
Заменил резистор на ИК диоде на 1 кОм, качество приёма не изменилось совсем...
Подскажите пожалуйста как лучше настроить и подавать импульсы 30кГц на attiny13V ?
Подключил ИК диод сразу к ноге МК и приём сразу стал лучше раза в 1.5...
Наверно мне надо было взять МК с кварцем, тогда можно было бы точно настроить МК.
Вы R1 увеличили до 1к? И нечего не изменилось? Подключили светодиод на прямую к 5-й ноге и приём улучшился? Если так, у вас ключ не работает. Я так думаю. И не в частоте дело. Транзистор замените, что ли. Без осцила тяжко. З.Ы. Может, цифровой фотик есть? На ЖК-матрице ИК-светодиод отлично видно. З.З.Ы. Дело к ночи, соображаю туго, но скажите, на вашем ИК диоде прямое падение напряжения сколько? Может, он при питании 3В вообще не открывается?
З.З.З.Ы. Если правильно ошибаюсь, ток через диод равен I=(Uпит-Uпр)/R
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Feb 18 2008, 07:34
Сообщение #10


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Так и делал, вначале сменил резистор со 100 Ом на 1 000 Ом. Потом ИК диод сразу подключил к ноге МК без резистора и транзистора.

И что интересно, когда я подключил диод прямо на ногу, то при изменении несущей частоты в два раза приёмник переставал принимать сигнал, а через транзистор с резистором, приёмник принимал сигнал даже если несущую изменить как угодно crying.gif

Вот данные на ИК диод:

Мощность излучения P,мВт: 30
Прямое напряжение,В: 1.2
при токе Iпр.,мА: 20
Длина волны,нм: 940
Ширина спектра излучения,нм: 50
Видимый телесный угол,град: 30
Максимальное время нарастания импульса,нс: -
Максимальное время спада импульса,нс: -
Максимальное обратное напряжение,В: 5
Максимальный прямой ток,мА: 50
Максимальный импульсный прямой ток,мА: 1200
Способ монтажа: в отверстие
Рабочая температура,С: -40...85
Производитель: Kingbright Electronic Co. Ltd.

Сообщение отредактировал Папа Карло - Feb 18 2008, 07:44
Go to the top of the page
 
+Quote Post
Alex_Pol
сообщение Feb 18 2008, 11:27
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-03-05
Из: Украина. Днепропетровск
Пользователь №: 3 626



Цитата(Папа Карло @ Feb 18 2008, 09:34) *
Так и делал, вначале сменил резистор со 100...Что интересно, когда я подключил диод прямо на ногу, то при изменении несущей частоты в два раза приёмник переставал принимать сигнал, а через транзистор с резистором, приёмник принимал сигнал даже если несущую изменить как угодно crying.gif

Ключ у вас не работает. Вам Serg_Mitin уже говорил: на светодиоде падает 1,2 вольта, на насыщенном транзисторе - где то 0,5 вольт. Остаётся 1,3 вольта. Для получения искомых 20 мА нужен резистор 1,3/0,02=65 Ом. Резистор R1 должен быть где - то 51 Ом. А порт может выдать миллиампер 30, в даташите посмотрите. Отпалите вы его нахрен. Или порт, или светодиод. З.Ы. Кондюк по питанию поставьте. Поближе к ключу. Микрофарад 40. Если вы меняете несущую, а ваш приёмник продолжает принимать сигнал, эт он не сигнал принимает, а какую то помеху.
2 модератор. Может, тему в раздел для начинающих?
Блин, только заметил. Диод Д2 чем занимается? Ещё 0,6 Вольта отжирает?
Go to the top of the page
 
+Quote Post
bbill
сообщение Feb 18 2008, 11:35
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 76
Регистрация: 21-10-05
Пользователь №: 9 941



В передатчике уберите диод по питанию, на микрохему поступает не более 2,3В или поставте хотя бы диод шоттки. Из даташита: ATtiny13V: 0 - 4 MHz @ 1.8 - 5.5V, 0 - 10 MHz @ 2.7 - 5.5V.

Используйте таймер в режиме(см.даташит) Clear Timer on Compare Match (CTC) Mode и формула расчета:
fOCnx= (fclk_I/O)/2⋅N⋅(1 + OCRnx).
The N variable represents the prescale factor (1, 8, 64, 256, or 1024).

Резистор в цепи диода должен быть 5-10Ом, транзистор на импульсный ток до 1А, например SS8050.
Да, и проверьте мультиметром(лампочкой) отдают ли ток батареи.
Успехов.

Сообщение отредактировал bbill - Feb 18 2008, 11:40
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Feb 18 2008, 12:01
Сообщение #13


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Цитата(Alex_Pol @ Feb 18 2008, 14:27) *
Ещё 0,6 Вольта отжирает?


Он для защиты от не правильного подключения, но уже можно и убрать его 05.gif
Кондёр уже поставил 470мкФ на микруху, а ключ рядом 1 см стоит.
Принимает точно сигнал с передатчика, похоже хитрый сигнал не фильтрует TSOP
Резистор я поставил такой большой на ИК диод из-за того, что питание при включённом светодиоде сильно падало(на схеме его уже нет).
Из чего я пришёл к выводу, что МК может не стабильно работать из-за питания.
Но выходит, что МК работал нестабильно из-за того, что частота его была 4.8МГц, а по паспорту он только до 4МГц держит.

Думаю мне будет проще убрать диод Д2 и МК опустить до 2.4МГц.

Померил мультиметром на ИК диоде падает 1.3 вольта

Цитата(bbill @ Feb 18 2008, 14:35) *
Используйте таймер в режиме(см.даташит) Clear Timer on Compare Match (CTC) Mode и формула расчета:
fOCnx= (fclk_I/O)/2⋅N⋅(1 + OCRnx).
The N variable represents the prescale factor (1, 8, 64, 256, or 1024).


Вот код которым я так и считал:
Код
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4800,000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=79;//тут делитель
OCR0B=0x00;


Вот код который генерирует сигнал на ножке МК:
Код
// Timer 0 output compare A interrupt service routine
interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
if(empty) PORTB.0++;//
        else PORTB.0 = 0;
}


fOCnx= (4 800 000)/2*1*(1 + 79) = 60кГц.

То есть за 2 прерывания выдаётся импульс с частотой 30кГц.
Если что напутал поправьте плиз help.gif

Сообщение отредактировал Папа Карло - Feb 18 2008, 12:12
Go to the top of the page
 
+Quote Post
Alex_Pol
сообщение Feb 18 2008, 12:39
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-03-05
Из: Украина. Днепропетровск
Пользователь №: 3 626



Цитата(Папа Карло @ Feb 18 2008, 14:01) *
Резистор я поставил такой большой на ИК диод из-за того, что питание при включённом светодиоде сильно падало(на схеме его уже нет).
Может у вас батарея дохлая? sad.gif Пока с железом не разберётесь, о софте говорить рано.
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Feb 18 2008, 13:33
Сообщение #15


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Цитата(Alex_Pol @ Feb 18 2008, 15:39) *
Может у вас батарея дохлая? sad.gif Пока с железом не разберётесь, о софте говорить рано.


С железом всё ясно уже.
Убрать диод Д2, уменьшить частоту МК до 2.4 и поставить транзистор с резистором на 50 Ом.
Только у меня вопрос, что SS8050 лучше будет чем KT3102AM ?
Типо KT3102AM не держит ток импульсный ?
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016