Atmega8+TSOP

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Сб фев 02, 2013 18:37:13

Сообщение L_A_V »

Пытаюсь реализовать передачу команд при помощи ИК сигнала. Сделал пульт на основе atmega8 + ик-диод + 4 кнопки. На пульте формирую сигнал с частотой 36 кГц. На графике синим цветом. Потом сделал приемник на основе atmega8 + TSOP31236. Как меняется выход TSOP изображено на графике желтым цветом. Посылаемая команда имеет следующую структуру: 30 импульсов начало команды, 15 импульсов пауза, 20 импульсов единица и 10 импульсов ноль.

Что я делаю в приемнике. Настраиваю таймер на 36кГц. Включаю прерывание таймера по совпадению(настройки таймера такие же как на пульте). Включаю прерывание на INT0 при изменении уровня. Когда уровень на INT0 падает запускаю таймер и увеличиваю переменную с количеством импульсов, когда срабатывает прерывание таймера. Когда уровень на INT0 снова увеличивается, останавливаю таймер и смотрю сколько насчиталось импульсов. Дальше определяю что пришло(стартовый пакет, ноль или единица)

Собственно в чем проблема. На приемнике не получается точно посчитать кол-во импульсов в пакете. Оно постоянно получается с какой-то погрешностью. При передаче 30 импульсов с пульта на приемнике приходится писать +-10 импульсов. С чем это моет быть связано? Или может у меня не правильный алгоритм?
Вложения
1.png
(101.58 КБ) 809 скачиваний
Реклама
Вымогатель припоя
Сообщения: 541
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Важна частота процессора, а так вроде должно работать.
Делал похожее https://sites.google.com/site/mariankmh/home/ir-to-com
Реклама
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Сб фев 02, 2013 18:37:13

Сообщение L_A_V »

процессор работает от внешнего кварца на 8 МГц
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Сб фев 02, 2013 18:37:13

Сообщение L_A_V »

Нашел в чем проблема.

Значит как формировал сигнал на пульте. Необходимо было сделать сигнал с частотой 36кГц, т.е. время одного такта 27,77 мкс. Для скважности 50% необходимо менять уровень сигнала каждые 13,89 мкс. На таймере кратность ставлю 1. Т.к. частота микроконтроллера равна 8МГц, то время одного такта равно 0,125 мкс. Следовательно включаю прерывание на Таймере1 на совпадение с 111(13,89 / 0,125) и при совпадении меняю уровень сигнала на противоположный и тут же обнуляю счетчик таймера. И так пока не выполнится определенное кол-во тактов. После того как все отправлю, выключаю таймер до следующей команды.

Что делал на приемнике. Также настроил таймер(кратность = 1, прерывание по совпадению на 111, при совпадении обнуляю счетчик). Включаю внешнее прерывание на INT0 при смене любого уровня. Когда на INT0 появляется 0 я запускаю таймер и считаю количество переполнений. При появлении 1 я останавливаю таймер.

И вот тут получаю проблему. По идее количество переполнений таймера на приемнике должно совпадать с количеством переполнений таймера при формировании сигнала. Ну допустим +- какая-то погрешность. Экспериментальным путем было установлено, что на пульте чтобы добиться 13,89 мкс нужно делать совпадение с 40. А на приемнике с 90.

Может кто-нибудь подсказать почему так происходит? Или может мой алгоритм ошибочен...
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 541
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

L_A_V писал(а):Нашел в чем проблема.
И в чем проблема?
L_A_V писал(а): Для скважности 50%
Скважность пультов устанавливают примерно 30%, правда 50% тоже будет работать.
L_A_V писал(а): Экспериментальным путем было установлено, что на пульте чтобы добиться 13,89 мкс нужно делать совпадение с 40.
Вот тут не понятно, установлено в при опытах в железе или в протеусе?
Если должно быть совпадение с 111, то не может быть совпадение с 40.

Выложите ваши файлы.(для протеуса не забудьте)
Реклама
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Сб фев 02, 2013 18:37:13

Сообщение L_A_V »

Сначала нашел несовпадение в протеусе, потом проверил на железе и подтвердилось.
Файлы приложил. Схема в протеусе в проекте Pult. Код рабочий поэтому не особо красивый:)

Проблема - по разному считало кол-во тактов.
Вложения
test.7z
(33.01 КБ) 216 скачиваний
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Хотя по описанию, вроде все должно работать, но, все равно подход у вас сложноватый чуть чуть.....

В передатчике, формировать сигнал 36000 Гц проще не с помощью изменения состояния вывода в прерывании, а соответствующей настройкой работы таймера с аппаратным управлением выводом.

Код: Выделить всё

//включение частоты 36000 Hz
void FreqOn (void) 
{
	TCCR2 = (1<<FOC2)					//принудительное изменение состояния вывода при совпадении
	|(1<<CS20)|(0<<CS21)|(0<<CS22)		//прямое тактирование от генератора
	|(1<<COM20)|(0<<COM21)				//состояние вывода меняется на противоположное
	|(0<<WGM20)|(1<<WGM21); 			//режим CTC (сброс при совпадении)

	TCNT2 = 0; 							//просто обнулил счетный регистр
	OCR2 = 0b01101111; 					//при достижении этого значения(111) в счетном регистре будет сброс и переключение ОС2
}


//выключение частоты 36000 Hz
void FreqOff (void) 
{
	TCCR2 = 0;							//выключить генератор 36000 Hz
	IR_PORT &= ~IR_HF_Line;				//высокочастотный вывод сбросить
}
Теперь будет достаточно через нужные промежутки времени вызывать соотвеетствующие процедуры.

А в приемнике уже контролировать сигналы по длительности.....
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Сб фев 02, 2013 18:37:13

Сообщение L_A_V »

Думал об такой реализации, но хотел эти выводы оставить под ШИМ
Вымогатель припоя
Сообщения: 541
Зарегистрирован: Вт фев 09, 2010 17:52:26

Сообщение codenamehawk »

Логическая ошибка в ISR(TIMER1_COMPB_vect)
сброс таймера должен стоять первым, так как счетчик продолжает считать, пока выполняется ваша программа, искажая длину импульса.

Еще необходимо учитывать время необходимое для входа в прерывание.
А это примерно 37 тактов процессора + выполнения команды сброса TCNT1 = 0;
А если в это время будут другие прерывания, то время еще затянется.

Так что разумней всего делать как советовал shads (в моей программе https://sites.google.com/site/mariankmh/home/ir-pult тоже применен такой код)

Инициализация может выглядеть примерно так

Код: Выделить всё

  OCR1B = 111-41;
Для проверки длины импульсов, прогу сокращают до минимума.
Примерно так
Pult.rar
(59.84 КБ) 211 скачиваний
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Сб фев 02, 2013 18:37:13

Сообщение L_A_V »

Спасибо за советы. Я конечно догадывался, что на формирование сигнала будут влиять доп вычисления, но не думал что на столько... Попробую реализовать на ШИМе...
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Тут полистай http://radiokot.ru/forum/viewtopic.php?f=20&t=87127
мож чего пригодится.....
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Сб фев 02, 2013 18:37:13

Сообщение L_A_V »

Наконец-то доделал, чтобы работало как хочу. Еще раз спасибо тем кто откликнулся. Выложу тут исходники. Может кому пригодиться. В папке Pult находится схема из Proteusa, на которой тестировал.
Вложения
AVR program.rar
(66.19 КБ) 290 скачиваний
Ответить

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