ИК барьер
ИК барьер
Собрал схему ик барьера на atmega16 частота 8 мегагерц , на PORTB.3 модулирую сигнал кодом,
#include<mega16.h>
void main (void){
DDRB.3=1;
ASSR=0x80;
TCCR0=0x19;
TCNT0=0x00;
OCR0=110;
while(1);
}
на ИК диод через резистор 100 ом. Принимаю Tsop1836 выводы GND на массу, VCC через 220 ом на питание, OUT на ногу МК PINA.0
Далее направил ик диод на Tsop. Программа состоит в следующем, если луч между ик диодом и TSOP прерывается, то загорается сетодиод на PORTD.1
if (PINA.0==1){
PORTD.1==1;
else{
PORTD.1==0
}
}
Включил, не работает. На сколько я понимаю я не правильно принимаю сигнал. Подскажите пожалуйста что не так. Схемку добавил)
#include<mega16.h>
void main (void){
DDRB.3=1;
ASSR=0x80;
TCCR0=0x19;
TCNT0=0x00;
OCR0=110;
while(1);
}
на ИК диод через резистор 100 ом. Принимаю Tsop1836 выводы GND на массу, VCC через 220 ом на питание, OUT на ногу МК PINA.0
Далее направил ик диод на Tsop. Программа состоит в следующем, если луч между ик диодом и TSOP прерывается, то загорается сетодиод на PORTD.1
if (PINA.0==1){
PORTD.1==1;
else{
PORTD.1==0
}
}
Включил, не работает. На сколько я понимаю я не правильно принимаю сигнал. Подскажите пожалуйста что не так. Схемку добавил)
- Вложения
-
- reciver2.gif
- (9.3 КБ) 721 скачивание
- Реклама
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
Так Вам нужно промодулировать светодиод частотой 36 кГц (TSOP на другие частоты не должен реагировать). Делал подобное - все работало.
while(1); - бесконечный цикл
как программа доберется до if (PINA.0==1){..... не понятно
while(1); - бесконечный цикл
как программа доберется до if (PINA.0==1){..... не понятно
Re: ИК барьер
Код так и выглядит, я просто его по кускам написал. я его и моделирую на выходе PORTB.3. Или не правильно модулирую?
#include<mega16.h>
void main (void){
PORTA=0xFF;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ASSR=0x80;
TCCR0=0x19;
TCNT0=0x00;
OCR0=110;
while(1);
if (PINA.0==1){
PORTD.1==1;
else{
PORTD.1==0
}
}
}
#include<mega16.h>
void main (void){
PORTA=0xFF;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ASSR=0x80;
TCCR0=0x19;
TCNT0=0x00;
OCR0=110;
while(1);
if (PINA.0==1){
PORTD.1==1;
else{
PORTD.1==0
}
}
}
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
У Вас все зависнет на while(1);
наверное так
while(1){
if (PINA.0==1) PORTD.1==1;
else PORTD.1==0;
}
а так как считали частоту ШИМ? Проверте осцилографом. Я делал немного не так. Ибо для 8 мГц тактовой частоту ШИМ можно получить максимум 8000000/256=31250Гц или я ошибаюсь?
наверное так
while(1){
if (PINA.0==1) PORTD.1==1;
else PORTD.1==0;
}
а так как считали частоту ШИМ? Проверте осцилографом. Я делал немного не так. Ибо для 8 мГц тактовой частоту ШИМ можно получить максимум 8000000/256=31250Гц или я ошибаюсь?
Re: ИК барьер
На пульт от телика реагирует) я модулирую не шимом а внутренним таймером
считаю по формуле OCR=(8000000/36000*K*2)-1
К - коэффициент предделителя
считаю по формуле OCR=(8000000/36000*K*2)-1
К - коэффициент предделителя
- Реклама
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
Вроде все правильно - проверил в протеусе
Код: Выделить всё
#include <mega16.h>
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
}
// Declare your global variables here
void main(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0xFF;
PORTD=0x00;
DDRD=0xFF;
ASSR=0x80; // Это вроде относится к Timer2 ???????????
TCCR0=0x19;
TCNT0=0x00;
OCR0=110;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
Re: ИК барьер
значит из последнего эксперимента получилось вот что. На расстоянии пол метра направлен ик диод на тсоп. Меряю на выходе тсопа напряжение. один конец на выход , другой на + . Показывает 0.03 вольта. Если закрыть ик диод и потом убрать руку то на Tsop Напряжение подпрыгивает до 4.5 вольта и опять 0.03. При изменении расстояния разницы никакой.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
Так все правильно - ик пульт посылает пачки 36кГц импульсов на выходе TSOP уже низкочастотные импульсы:
http://myrobot.ru/wiki/index.php?n=Components.TSOP
Вам тоже можно подавать 36 кГц пачки определеной длительности а на выходе TSOP будет импульс нужной длительности без 36 кГц.
Я делал немного сложнее - выход TSOP подключал на вход UART, светодиод модулировал несущую 36 кГц выходом UART. Грубо - подал сивол на передачу UART, затем програмно проверяю ногу выхода UART - если 1 включаю на светодиод 36 кГц, если 0 выключаю. По окончанию передачи в приемнике UART тот же символ.
http://myrobot.ru/wiki/index.php?n=Components.TSOP
Вам тоже можно подавать 36 кГц пачки определеной длительности а на выходе TSOP будет импульс нужной длительности без 36 кГц.
Я делал немного сложнее - выход TSOP подключал на вход UART, светодиод модулировал несущую 36 кГц выходом UART. Грубо - подал сивол на передачу UART, затем програмно проверяю ногу выхода UART - если 1 включаю на светодиод 36 кГц, если 0 выключаю. По окончанию передачи в приемнике UART тот же символ.
Re: ИК барьер
А как с посылать пачками ик сигнал , модулирую на 36 кгц но как я понимаю мой Тсоп затыкается от постоянной передачи. нужно передавать определенным промежутком, но не знаю как...
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
Ну типа как то так:
TCCR0=0x19;
delay_us(300);
TCCR0=0x00;
delay_us(300);
TCCR0=0x19;
delay_us(300);
TCCR0=0x00;
delay_us(300);
Re: ИК барьер
А как тогда обрабатывать?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
Ну может так:
Код: Выделить всё
while(1){
TCCR0=0x19;
for(n=0; n<30; n++)
{
delay_us(10);
if (PINA.0==1) PORTD.1=1;
else PORTD.1=0;
}
TCCR0=0x00;
for(n=0; n<30; n++)
{
delay_us(10);
if (PINA.0==1) PORTD.1=1;
else PORTD.1=0;
}
}
Re: ИК барьер
Спасибо, буду пробовать
Re: ИК барьер
а можно ли просто генерировать 36 кгц на PORTB.3 а в программе для импульсов дергать им
PORTB.3==1
задержка
PORTB.3==0
задержка.
таким образом можно делать задержку между посланным сигналом
PORTB.3==1
задержка
PORTB.3==0
задержка.
таким образом можно делать задержку между посланным сигналом
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
PORTB.3==1 так нельзя - надо PORTB.3=1 (== операция сравнения, = присваивание)
а почему не хотите модулировать таймером
Вам нужно управлять реле или просто зажигать светодиод?
Я бы так еще попробовал:
а почему не хотите модулировать таймером
Вам нужно управлять реле или просто зажигать светодиод?
Я бы так еще попробовал:
Код: Выделить всё
while(1){
TCCR0=0x19;
for(n=0; n<30; n++)
{
delay_us(10);
if (PINA.0==1) PORTD.1=1;
else PORTD.1=0;
}
TCCR0=0x00;
delay_us(300);
}
Re: ИК барьер
Ну так я и модулирую таймером. Конечно хочется управлять реле, светодиод так для тестов)
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: ИК барьер
Вот из форума:
Делать ИК-барьер на TSOP-ах - не самая лучшая идея, я уже на этом обжёгся. Во-первых, TSOP-ы имею огромную чувствительность - они ловят сигнал, отражённый от стен, потолка и различных препятствий. Во-вторых, TSOP-ы реагируют только на несущую (36кГц для TSOP1736). В-третьих, они ещё и имеют автоматическую регулировку усиления, т. е. непрерывную несущую, не промодулированную импульсами, будут считать помехой и быстро перестанут реагировать на неё. То есть, для нормальной работы TSOP-у нужен сигнал вроде такого:
_____~_~_~_~_~__________~_~_~_~_~__________~_~_~_~_~______
Кроме того, из-за инерционности АРУ TSOP-ы плохо реагируют на пересечение луча. То есть, реагируют-то хорошо, но изменения уровня подстраивают АРУ, и начинают ловить отражённый сигнал, и мы получаем на выходе не импульс, а кашу из множества фронтов.
В общем, для ИК-барьера лучше подошёл бы простой фототранзистор в глубине затемнённого цилиндра.
вот готовое устройство (как и я делал - выход TSOP на RX микроконтроллера):
http://progm.nm.ru/arh76.html
тут еще:
http://parts.roboclub.ru/index.shtml?ik
Делать ИК-барьер на TSOP-ах - не самая лучшая идея, я уже на этом обжёгся. Во-первых, TSOP-ы имею огромную чувствительность - они ловят сигнал, отражённый от стен, потолка и различных препятствий. Во-вторых, TSOP-ы реагируют только на несущую (36кГц для TSOP1736). В-третьих, они ещё и имеют автоматическую регулировку усиления, т. е. непрерывную несущую, не промодулированную импульсами, будут считать помехой и быстро перестанут реагировать на неё. То есть, для нормальной работы TSOP-у нужен сигнал вроде такого:
_____~_~_~_~_~__________~_~_~_~_~__________~_~_~_~_~______
Кроме того, из-за инерционности АРУ TSOP-ы плохо реагируют на пересечение луча. То есть, реагируют-то хорошо, но изменения уровня подстраивают АРУ, и начинают ловить отражённый сигнал, и мы получаем на выходе не импульс, а кашу из множества фронтов.
В общем, для ИК-барьера лучше подошёл бы простой фототранзистор в глубине затемнённого цилиндра.
вот готовое устройство (как и я делал - выход TSOP на RX микроконтроллера):
http://progm.nm.ru/arh76.html
тут еще:
http://parts.roboclub.ru/index.shtml?ik


