Автор Тема: инфракрасный детектор препятствия  (Прочитано 5880 раз)

0 Пользователей и 1 Гость просматривают эту тему.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #15 : 13 Март 2013, 13:55:40 »
у тебя же двухканальный осцилл.
сделай два сигнала оновременно
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #16 : 13 Март 2013, 14:23:25 »
хотя уже кое-что вырисовывается
Имеем задержку сработки примерно 400мкс и всё тот же странный импульс 300мкс.
Было бы неплохо попробовать разные ТСОПы.
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 937
(Нет темы)
« Ответ #17 : 13 Март 2013, 18:12:51 »
Луча два,рук не хватает.Щупы держать,нажать на осциле сохранить.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #18 : 14 Март 2013, 10:25:31 »
вот прошивка с таймингами пачки по стандарту RC-5


вот так выглядит
пачка
пакет-15пачек
пакеты
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 937
(Нет темы)
« Ответ #19 : 14 Март 2013, 10:46:27 »
вот картинка

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #20 : 14 Март 2013, 10:53:14 »
ну, уже на что-то похоже.
Пакеты  нормально принимаются?
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 937
(Нет темы)
« Ответ #21 : 14 Март 2013, 10:55:42 »
Да нормально.Ну хоть стабильно по выходу

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #22 : 14 Март 2013, 10:59:58 »
ща сделаю контроль приема
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #23 : 14 Март 2013, 12:06:35 »
вот пробуй
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 937
(Нет темы)
« Ответ #24 : 14 Март 2013, 12:47:25 »
на выходе не меняется

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #25 : 14 Март 2013, 13:15:13 »
вот еще вариант. в протеусе вроде работает
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #26 : 14 Март 2013, 13:43:44 »
вот вариант с генератором случайного кода пакета
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #27 : 14 Март 2013, 14:07:58 »
вот, собственно, получилась такая писанина
/****************************************************
made slav0n

Chip type           : ATtiny13
9.6 MHz
фузы  заводские, только снять галку CKDIV8
;Hfuse FF
;Lfuse 7A
****************************************************/


#include <avr/io.h>
#include <avr/interrupt.h>
//#include <util/delay.h>     /* for _delay_ms() */
//#include "m8_128.h"


#define out_36kHz PB1
#define swch_36_38 PB4
#define out_1 PB0
#define out_2 PB2
#define TSOP PB3


volatile unsigned char flg_err;

ISR(SIG_OUTPUT_COMPARE0B)
{
static unsigned char timer_strob;
static unsigned char timer_paket;
static unsigned char flg_err_paket;

timer_strob++;

if(timer_strob==66)//середина пачки
{
if(timer_paket <15)
{
//проверяем принял-ли TSOP сигнал и поднимаем флаг ошибки
if(PINB&(1<<TSOP) && TCCR0A&(1<<COM0B0))flg_err_paket =1;

TCCR0A ^= (1<<COM0B0);//изменяем сигнал на противоположный
}
}
else
if(timer_strob==66+66)//конец-начало пачки
{
timer_strob =0;
timer_paket++;
if(timer_paket ==65)//конец-начало пакета
{
timer_paket =0;

if(flg_err_paket)flg_err =1;//были-ли ошибки в пакете?
else flg_err =0;

flg_err_paket =0;
}

if(timer_paket <15)
{
//конфигурация Галуа, рандомгенератор
static unsigned char Q = 1;
Q = (Q>>1) ^ (Q&1 ? 0b11010111 : 0);

if(Q&1)TCCR0A |= (1<<COM0B0);
else TCCR0A &=~(1<<COM0B0);
}
else TCCR0A &=~(1<<COM0B0);//отключаем выход если пауза пакета
}
}

//============================================================

int __attribute__((naked)) main(void)
{
PORTB = (1<<swch_36_38)|(1<<TSOP);//подтяжка
DDRB = (1<<out_36kHz)|(1<<out_1)|(1<<out_2);//выходы

TCCR0A = (1<<COM0B0)|(1<<WGM01); //на выходе меандр. сброс при совпадении
TCCR0B = 1; //предделитель на 1, запуск таймера
//TCCR0B = 0; //стоп таймер

TIMSK0 = (1<<OCIE0B);//разрешаем прерывание по совпадению В

if(PINB & (1<<swch_36_38))OCR0A = 124; //38khz
else  OCR0A = 131; //36khz

sei();

while(1)
{
if(flg_err){PORTB |=(1<<out_1);PORTB &=~(1<<out_2);}
else {PORTB |=(1<<out_2);PORTB &=~(1<<out_1);}
}
}
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4684
(Нет темы)
« Ответ #28 : 14 Март 2013, 16:56:07 »
код легко модифицируется.
Можно поставить желаемое количество символов в пакете, период пакетов.
И еще одна идея.
В таком виде сработка будет даже если пропущен хотя-бы один символ.
Но можно сделать счетчик допустимых ошибок в пакете, как-бы программное загрубление чувствительности.
while(1||!1);
зберігай спокій

Speys

  • Глобальный модератор
  • .
  • *****
  • Сообщений: 937
(Нет темы)
« Ответ #29 : 16 Март 2013, 10:36:29 »
Схема,и плата. Чувствительность очень большая.