|
|
  |
Приёмник и передатчик на ИК. Проблемы с передачей и приёмом., Схема и плата и софт, но вместе не работает хорошо... |
|
|
|
Feb 16 2008, 12:16
|
Частый гость
 
Группа: Новичок
Сообщений: 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 команды. Если передавать пакетом всё накрывается У приёмника похожая логика. Ножка сигнальная 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
|
|
|
|
|
Feb 16 2008, 13:33
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Папа Карло @ Feb 16 2008, 16:16)  Есть ещё интересный глюк, если передатчик включить и положить рядом с приёмником, то приёмник ловит иногда команды, но если передатчик выключить, то приёмник ничего не ловит. А должно быть наоборот? Почему бы не использовать в качестве передатчика готовый пульт от телевизора ? Что касается ошибок, то они могут быть и в той части текста программы, которую вы не привели. Например, если переменные pulse и empty не определены, как volatile, запросто могут быть проблемы.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Feb 16 2008, 13:56
|
Частый гость
 
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Feb 16 2008, 19:27
|
Группа: Новичок
Сообщений: 3
Регистрация: 17-07-07
Пользователь №: 29 192

|
Приветствую ПАПУ... Я бы начал искать с передатчика
питане 3В на диоде падает 1,5-2В, на транзисторе 0,7 В кроме всего еще резистор 100ом...
Выход МК передатчика перевести в режим ШИМ на 30 КГц и убедиться осциллографом в наличии крутых фронтов
На приемник на базе TSOP повесить шунтирующую емкость по питанию, и в даташите наверняка можно найти типовое подключение и рекомендации
потом можно задаваться кодовыми посылками длительность импульса задавать по количеству периодов 30Кгц наверняка - это число переполнений..
Успехов
|
|
|
|
|
Feb 16 2008, 20:26
|
Группа: Новичок
Сообщений: 3
Регистрация: 17-07-07
Пользователь №: 29 192

|
Без осциллографа туго.... питание 3В я хотел сказать про драйвер диода, скорее всего он коряво работает. и вмесо прямоугольника стгнал в виде пилы ... а приемнику нужен четкий сигнал на 30кГц
диод можно попробовать повесить на контроллер я думаю удасться выдавить 15- 20ма резистор 30-100 ом желательно поставить. Можно запаралелить два вывода для увеличения тока
Я не знаю есть у тини возможность задать режим ШИМ и какие я их редко пользовал... но если совсем просто подойти если там только таймер 0 то это тоскливо. лучше уйти на mega8 я думаю по цене и размерам не большая разница
это для пробы пока 1{ установим бит и сбросим бит с задержкой} а на приемнике посмотреть - должна быть 1 пока работает передатчик....
На сегодня все... Удачи!
|
|
|
|
|
Feb 16 2008, 21:42
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Я уже бьюсь неделю с этой проблемой и много чего успел натестить. Драйвер диода вы имели ввиду npn транзистор КТ3102АМ ? Дело в том, что МК attiny13V маловольтная и ток почти не выдаёт на ноги. Да на ней только таймер 0, но сделать можно много на ней, только надо знать как Вот на atmega48 я спокойно вешал диоды. Режим ШИМ там есть, но как настроить 30кГц я не знаю. Может кто подскажет ? На самом деле приёмник выдаёт 1-ку и при поступлении сигнала скидывает на ноль, если сигнал долго поступает от передатчика, то TSOP опять ставит сам 1 лог. Причём мне удалось уже ловить на приёмники сигналы разной длительности и код который я дал, как раз и работает так. Он довольно чётко распознаёт 3 сигнала, но передать пакет сигналов не выходит. Ктому же у меня есть подозрения, что при передаче питание батарейное проседает и частота у МК начинает гулять. Я подумывал о смене резистора 100 Ом на 500 Ом. Сам диод ИК 30МВт. То есть ток 10мА, что означает нужен резистор на 300 Ом. Если я где ошибся поправьте плиз.
Сообщение отредактировал Папа Карло - Feb 16 2008, 21:43
|
|
|
|
|
Feb 17 2008, 20:38
|

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

|
Цитата(Папа Карло @ Feb 17 2008, 21:22)  Заменил резистор на ИК диоде на 1 кОм, качество приёма не изменилось совсем... Подскажите пожалуйста как лучше настроить и подавать импульсы 30кГц на attiny13V ? Подключил ИК диод сразу к ноге МК и приём сразу стал лучше раза в 1.5... Наверно мне надо было взять МК с кварцем, тогда можно было бы точно настроить МК. Вы R1 увеличили до 1к? И нечего не изменилось? Подключили светодиод на прямую к 5-й ноге и приём улучшился? Если так, у вас ключ не работает. Я так думаю. И не в частоте дело. Транзистор замените, что ли. Без осцила тяжко. З.Ы. Может, цифровой фотик есть? На ЖК-матрице ИК-светодиод отлично видно. З.З.Ы. Дело к ночи, соображаю туго, но скажите, на вашем ИК диоде прямое падение напряжения сколько? Может, он при питании 3В вообще не открывается? З.З.З.Ы. Если правильно ошибаюсь, ток через диод равен I=(Uпит-Uпр)/R
|
|
|
|
|
Feb 18 2008, 07:34
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Так и делал, вначале сменил резистор со 100 Ом на 1 000 Ом. Потом ИК диод сразу подключил к ноге МК без резистора и транзистора. И что интересно, когда я подключил диод прямо на ногу, то при изменении несущей частоты в два раза приёмник переставал принимать сигнал, а через транзистор с резистором, приёмник принимал сигнал даже если несущую изменить как угодно  Вот данные на ИК диод: Мощность излучения P,мВт: 30 Прямое напряжение,В: 1.2 при токе Iпр.,мА: 20 Длина волны,нм: 940 Ширина спектра излучения,нм: 50 Видимый телесный угол,град: 30 Максимальное время нарастания импульса,нс: - Максимальное время спада импульса,нс: - Максимальное обратное напряжение,В: 5 Максимальный прямой ток,мА: 50 Максимальный импульсный прямой ток,мА: 1200 Способ монтажа: в отверстие Рабочая температура,С: -40...85 Производитель: Kingbright Electronic Co. Ltd.
Сообщение отредактировал Папа Карло - Feb 18 2008, 07:44
|
|
|
|
|
Feb 18 2008, 11:27
|

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

|
Цитата(Папа Карло @ Feb 18 2008, 09:34)  Так и делал, вначале сменил резистор со 100...Что интересно, когда я подключил диод прямо на ногу, то при изменении несущей частоты в два раза приёмник переставал принимать сигнал, а через транзистор с резистором, приёмник принимал сигнал даже если несущую изменить как угодно  Ключ у вас не работает. Вам Serg_Mitin уже говорил: на светодиоде падает 1,2 вольта, на насыщенном транзисторе - где то 0,5 вольт. Остаётся 1,3 вольта. Для получения искомых 20 мА нужен резистор 1,3/0,02=65 Ом. Резистор R1 должен быть где - то 51 Ом. А порт может выдать миллиампер 30, в даташите посмотрите. Отпалите вы его нахрен. Или порт, или светодиод. З.Ы. Кондюк по питанию поставьте. Поближе к ключу. Микрофарад 40. Если вы меняете несущую, а ваш приёмник продолжает принимать сигнал, эт он не сигнал принимает, а какую то помеху. 2 модератор. Может, тему в раздел для начинающих? Блин, только заметил. Диод Д2 чем занимается? Ещё 0,6 Вольта отжирает?
|
|
|
|
|
Feb 18 2008, 11:35
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 18 2008, 12:01
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Цитата(Alex_Pol @ Feb 18 2008, 14:27)  Ещё 0,6 Вольта отжирает? Он для защиты от не правильного подключения, но уже можно и убрать его  Кондёр уже поставил 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кГц. Если что напутал поправьте плиз
Сообщение отредактировал Папа Карло - Feb 18 2008, 12:12
|
|
|
|
|
Feb 18 2008, 12:39
|

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

|
Цитата(Папа Карло @ Feb 18 2008, 14:01)  Резистор я поставил такой большой на ИК диод из-за того, что питание при включённом светодиоде сильно падало(на схеме его уже нет). Может у вас батарея дохлая?  Пока с железом не разберётесь, о софте говорить рано.
|
|
|
|
|
Feb 18 2008, 13:33
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Цитата(Alex_Pol @ Feb 18 2008, 15:39)  Может у вас батарея дохлая?  Пока с железом не разберётесь, о софте говорить рано. С железом всё ясно уже. Убрать диод Д2, уменьшить частоту МК до 2.4 и поставить транзистор с резистором на 50 Ом. Только у меня вопрос, что SS8050 лучше будет чем KT3102AM ? Типо KT3102AM не держит ток импульсный ?
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|