Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков. |
01.08.2013, 23:17
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Маленькая дальность ИК барьера
Имеется девайс в котором используется ИК барьер, МК - tiny2313.В качестве ИК светодиода TSAL6100 выковырянный из китайской игрушки, в качестве приемника TSOP1736.
При токе через светодиод в районе 100ма, дальность обнаружения препятствия порядка 25 см, но сильно греется токоограничительный резистор (1206), если понизить ток до 28ма, то дальность падает до 10см, но ничего не греется.
схема с 100ма
сигнал на светодиоде, относительно питания
сигнал на входе TSOP (явно искажения)
как оно выглядит сверзу
с торца
Добиться "красивого" сигнала на TSOP удается кратковременно, поймав некоторое расстояние при котором только произошло отражение ИК сигнала, т.е. на самой границе.
Как поднять дальность ИК барьера без повышения мощности светодиода?
ШИМ для светодиода создается в таймере0 в режиме CTC, частоту удалось подобрать экспериментально 35,71 кгц, что для TSOP вполне приемлемо. Сигнал с TSOP обрабатываю в прерывании по низкому уровню, после 10 таких импульсов.
TSOP уверенно ловит на расстоянии 2м сигнал от пульта телевизора.
Как поднять дальность ИК барьера без повышения мощности светодиода?
Исходник схемы для МК:
PHP код:
|
//Chip type : AVRtiny2313
//Clock frequency : 8 mHz CKDIV8 unprogrammed (Division=0), clkCPU=8000000/1= 8000000 ГЦ !!!!!!
#include ‹util/delay.h›
#include ‹avr/interrupt.h›
#include ‹avr/io.h›
#include ‹avr/sleep.h›
#define led_on (PORTD|=(1‹‹4)) // ставим PIND4 в 1
#define led_off (PORTD&=(~(1‹‹4))) // ставим PIND4 в 0
#define IRled_on (PORTB|=(1‹‹3)) // ставим PINB3 в 1
#define IRled_off (PORTB&=(~(1‹‹3))) // ставим PINB3 в 0
#define keyUP ((PINA & (1‹‹1))?1:0) // читаем вход PINA1
#define keyDOWN ((PINA & (1‹‹0))?1:0) // читаем вход PINA0
#define keyRESET ((PIND & (1‹‹2))?1:0) // читаем вход PIND2 (INT0)
volatile unsigned char PWMcount=50; // Значение ШИМ DC мотора с которого начинаем считать до 255
unsigned char BUZERdelay=8; // Значение задержки для таймера для генерации звукового сигнала в 4кгц
volatile unsigned char BUZERdelay_temp=0; // Значение задержки для таймера для генерации звукового сигнала
volatile unsigned char Beep_count=0; // отсчет кол-ва пиков звукового сигнала
unsigned int Beep_delay_on=21739; // отсчет времени пищания звуковго сигнала
volatile unsigned int Beep_delay_on_tmp=0; // отсчет времени пищания звуковго сигнала
unsigned int Beep_delay_off=21739; // отсчет времени пищания звуковго сигнала
volatile unsigned int Beep_delay_off_tmp=0; // отсчет времени пищания звуковго сигнала
unsigned char IR_delay_on=18; // отсчет задержки включения и выключения ШИМ на ИК светодиоде
volatile unsigned char IR_delay_on_tmp=0;
unsigned char IR_delay_off=18; // отсчет задержки включения и выключения ШИМ на ИК светодиоде
volatile unsigned char IR_delay_off_tmp=0;
unsigned char IR_count=1; // считчик кол-ва импульсов в пачке
volatile unsigned char IR_count_tmp=0;
volatile unsigned char IRPWMcount=108; // Значение регистра OCR1A таймера1 для формирования нужной частоты ШИМ для ИК светодиода
unsigned int IR_pause=524; // отсчет задержки паузы между пачками ШИМ на ИК светодиоде
volatile unsigned int IR_pause_tmp=524;
volatile unsigned char TSOP_count=0; // счетчик импульсов от TSOP
unsigned long DC_pause=300000; // счетчик для задердки выключения DC мотора
volatile unsigned long DC_pause_tmp=0; // счетчик для задердки выключения DC мотора
ISR(ANA_COMP_vect){
// срботал компаратор, вода в емкости почти закончилась.
asm("nop"::);
}
void PWM_IRLED_config(void){
// настраиваем ШИМ для ИК светодиода
IR_delay_on_tmp=IR_delay_on;
IR_delay_off_tmp=IR_delay_off;
IR_count_tmp=IR_count;
BUZERdelay_temp=BUZERdelay;
Beep_delay_on_tmp=Beep_delay_on;
Beep_delay_off_tmp=Beep_delay_off;
OCR1A=IRPWMcount;
TIMSK|=(1‹‹OCIE1A);// Timer/Counter1, Output Compare A Match Interrupt Enable
// включаем ШИМ на ноге OC1A
TCCR1A|=(0‹‹WGM11)|(0‹‹WGM10); // CTC OCR1A Immediate MAX
TCCR1B|=(1‹‹WGM12);
TCCR1B|=(1‹‹CS10); // запустить timer1 с - clock/1
}
void PWM_IRLED_on(void){
TCCR1A|=(0‹‹COM1A1)|(1‹‹COM1A0); //Toggle OC1A/OC1B on Compare Match.
}
void PWM_IRLED_off(void){
TCCR1A &=~(1‹‹COM1A0); //Normal port operation, OC1A/OC1B disconnected.
IRled_off;
}
void PWM_DC_config(void){
// настраиваем ШИМ для двигателя с частотой 8000000/256= 31250 ГЦ
OCR0A=PWMcount;
TIMSK|=(1‹‹TOIE0);// Timer/Counter0 Overflow Interrupt Enable (разрешаем прерывание по переполнению в таймере0)
TCCR0A|=(1‹‹WGM01)|(1‹‹WGM00); // Fast PWM 0xFF TOP MAX
TCCR0B|=(1‹‹CS00); // запустить timer0 с - clock/1
}
void PWM_DC_on(void){
TCCR0A|=(1‹‹COM0A1); // Clear OC0A on Compare Match, set OC0A at TOP
}
void PWM_DC_off(void){
TCCR0A &=~(1‹‹COM0A1); //Normal port operation, OC0A/OC0B disconnected.
}
ISR(TIMER0_OVF_vect){
// таймер0 переполнился, отсчиталась задержка ШИМ DC мотора c частотой 31250 гц.
asm("nop"::);
OCR0A=PWMcount;
}
ISR(INT1_vect){
// прерывание от TSOP по низкому уровню
TSOP_count++;
_delay_ms(1); // задержка от дребезга
}
ISR(TIMER1_COMPA_vect){
static unsigned char beep_stat=0; // статус генерации бипера (1-вкл, 0-выкл)
// возникло прерывание по сравнению таймера в режиме CTC с часотой 86957 гц
// нужно 36000 гц, для этого OCR1A должно бытьравно 108 (подобрано оптным путем,генерирует 36,23кцг).
asm("nop"::);
OCR1A=IRPWMcount;
//генерим импульсы длительностью 600мкс (1666 гц) и паузой между ними 600мкс (1666 гц),
if (IR_delay_on_tmp›0){
// включаем ШИМ на ИК светодиод на 600мкс (1666 гц)
PWM_IRLED_on();
IR_delay_on_tmp--;
}else if (IR_delay_off_tmp›0){
// выключаем ШИМ на ИК светодиод на 600мкс (1666 гц)
PWM_IRLED_off();
IR_delay_off_tmp--;
}else{
IR_delay_on_tmp=IR_delay_on;
IR_delay_off_tmp=IR_delay_off;
}
// организуем прерывистую генерацию звукового сигнала
if (Beep_count›0){
if (Beep_delay_off_tmp›0){
Beep_delay_off_tmp--;
}else{
//Beep_delay_on_tmp=Beep_delay_on;
beep_stat=1;
}
if ((Beep_delay_off_tmp==0) && (Beep_delay_on_tmp›0)){
Beep_delay_on_tmp--;
}else if (Beep_delay_on_tmp==0){
beep_stat=0;
Beep_delay_off_tmp=Beep_delay_off;
Beep_delay_on_tmp=Beep_delay_on;
Beep_count--;
}
}else{
PORTB &= ~(1‹‹7);
Beep_delay_on_tmp=Beep_delay_on;
Beep_delay_off_tmp=Beep_delay_off;
}
// генерируем сигнал на пьезодинамике счастотой 4 кгц
if (beep_stat==1){
if (BUZERdelay_temp›0){
BUZERdelay_temp--;
}else{
PORTB ^= (1‹‹7); //инвертируем состояние седмого пина
BUZERdelay_temp=BUZERdelay;
}
}
if (DC_pause_tmp›0){
DC_pause_tmp--;
}
}
void pin_config(void){
// настраиваем порты(ножки)
DDRA=0b00000000; // делаем входами все порты PINA
PINA=0b00000011; // выводим на все выходы PORTA 1
PORTA=0b00000011; // и подягиваем на +питания.
DDRB=0b11111111; // делаем выходами все порты PINB
PINB=0b00000000; // выводим на все выходы PORTB 0
PORTB=0b00000000; // и НЕ подягиваем на +питания.
DDRD=0b00010001; // делаем входами все порты PIND, кроме 4 и 0.
PIND=0b00001100; // выводим на все выходы PORTD 0, кроме PD2 (INT0) и PD3 (INT1)
PORTD=0b00000000; // и НЕ подягиваем на +питания.
// настраиваем Аналоговый компаратор
//ACSR|=(0‹‹ACD)|(1‹‹ACBG)|(1‹‹ACO)|(1‹‹ACIE)|(1‹‹ACIS1)|(0‹‹ACIS0); // Analog Comparator Enable, Analog Comparator Bandgap=1,1v, Analog Comparator Interrupt Enable, Comparator Interrupt on Falling Output Edge.
// настраиваем прерывание на INT1 от TSOP
//MCUCR|=(0‹‹ISC11)||(0‹‹ISC10); // The low level of INT1 generates an interrupt request.
MCUCR|=(1‹‹ISC11)||(1‹‹ISC10); // The rising edge of INT0 generates an interrupt request.
GIMSK|=(1‹‹INT1); // External Interrupt Request 1 Enable
}
void pin_config_off(void){
// настраиваем порты(ножки)
DDRA=0b00000000; // делаем входами все порты PINA
PINA=0b00000000; // выводим на все выходы PORTA 1
PORTA=0b00000000; // и подягиваем на +питания.
DDRB=0b00000000; // делаем входами все порты PINB
PINB=0b00000000; // выводим на все выходы PORTB 0
PORTB=0b00000000; // и НЕ подягиваем на +питания.
DDRD=0b00000000; // делаем входами все порты PIND
PIND=0b00000000; // выводим на все выходы PORTD 0
PORTD=0b00000000; // и НЕ подягиваем на +питания.
// настраиваем Аналоговый компаратор
ACSR=0;
// настраиваем прерывание на INT1 от TSOP
MCUCR=0;
GIMSK=0;
ACSR=0b10000000; //Analog Comparator Disable
}
void go_sleep(void){
// вгоняем МК в POWER-DOWN
cli(); // зарещаем прерывания глобально
PWM_IRLED_off();
PWM_DC_off();
pin_config_off();
MCUCR|=(0‹‹ISC00)||(0‹‹ISC01); // The low level of INT0 generates an interrupt request.
GIMSK|=(1‹‹INT0); //External Interrupt Request 0 Enable
EIFR|=(1‹‹INTF0);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sei(); // разрешаем прерывания глобально
sleep_mode();
_delay_ms(20);
GIMSK=0; //Disable Pin Change Interrupt
pin_config(); // настраиваем порты(ножки)
PWM_IRLED_on();
PWM_DC_on();
_delay_ms(20);
}
ISR(INT0_vect){
// прерывание от кнопки RESET (INT0)
asm("nop"::);
}
int main(void){
// настраиваем порты(ножки)
pin_config();
PWM_IRLED_config();
PWM_IRLED_on();
PWM_DC_config();
//PWM_DC_on();
led_on;
_delay_ms(1000);
led_off;
_delay_ms(1000);
Beep_count=1;
sei(); // разрешаем прерывания глобально
//USART_Send_srt("START");
/****************** ГЛАВНЫЙ БЕСКОНЕЧНЫЙ ЦИКЛ ПРОГРАММЫ ********************/
while(1){
asm("nop"::);
//Beep_count=10;
if (keyUP==0){
DC_pause_tmp=DC_pause; // запускаем ШИМ для DC мотора
PWM_DC_on();
if (PWMcount‹254){
PWMcount++;
}else{
Beep_count=1;
}
led_on;
_delay_ms(1);
led_off;
_delay_ms(1);
}
if (keyDOWN==0){
DC_pause_tmp=DC_pause; // запускаем ШИМ для DC мотора
PWM_DC_on();
if (PWMcount›0){
PWMcount--;
}else {
Beep_count=1;
}
led_on;
_delay_ms(1);
led_off;
_delay_ms(1);
}
if (DC_pause_tmp‹=0){
// таймер досчитал до 10 секунд
PWM_DC_off(); // выключаем DC мотор
}
if (TSOP_count›=10){
// приняли от ИК светодиода все 10 импульсов
//Beep_count=1;
DC_pause_tmp=DC_pause; // запускаем ШИМ для DC мотора
PWM_DC_on();
led_on;
_delay_ms(5);
led_off;
TSOP_count=0;
}
if (keyRESET==0){
// нажат ресет
led_on;
_delay_ms(5);
led_off;
_delay_ms(1000);
_delay_ms(1000);
if (keyRESET==0){
// ресет нажат более 1 секунды, переводим МК в POWER_DOWN
Beep_count=1;
_delay_ms(1000);
_delay_ms(1000);
led_on;
_delay_ms(5);
led_off;
go_sleep();
Beep_count=1;
_delay_ms(1000);
_delay_ms(1000);
}
}
};/******************* КОНЕЦ БЕСКОНЕЧНОГО ЦИКЛА ********************/
}/*********************** КОНЕЦ ПРОГРАММЫ **************************/
|
|
|
|
|
01.08.2013, 23:27
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
|
|
|
|
01.08.2013, 23:41
|
|
Вид на жительство
Регистрация: 30.10.2007
Адрес: Ростов-на-Дону
Сообщений: 285
Сказал спасибо: 23
Сказали Спасибо 39 раз(а) в 33 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
В пульте телевизора ток через светодиод легко может быть и в 1 ампер, но там скважность более 10 (а напряжение питания как раз 3 В). Поднимайте ток, увеличивайте скважность и используйте 3-4 светодиода последовательно если есть место - у вас большая часть энергии греет резистор!
Если несколько сведодиодов использовать неудобно, то, чтобы не греть резисторы можно использовать трансформатор с трансформацией раза в 4 (надо смотреть, при каком напряжении ток через светодиод будет в 1 А примерно).
Быть может стоит взять светодиод с меньшим углом облучения, а фотоприемник поместить в трубку, защищающую от световых помех (TSOP чувствителен к газоразрядным лампам с электронным балластом)?
Для напряжения питания в 12 В я использовал три последовательно включенных светодиода и резистор в 7-8 Ом - дальность приема команд аппаратурой более 10 метров (это для устройства записи ИК команд использовалось).
Ещё обратите внимание на высокую чувствительность TSOPов к помехам по питанию - ШИМ-помеха от вашего двигателя может резко снизить чувствительность приемника - проведите проверку без двигателя.
Справка из документации на него про 1А или около того:
1. Мощность заявлена в 1 Вт против 130 мВт при импульсе в 1А и длительности в 100 мкс
2. График Figure 3. Pulse Forward Current vs. Pulse Duration сообщает, что он и 10 мс при 1 А держит при большой скважности.
Последний раз редактировалось vspvsp; 02.08.2013 в 00:04.
|
|
|
|
02.08.2013, 10:07
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
Сообщение от vspvsp
|
В пульте телевизора ток через светодиод легко может быть и в 1 ампер, но там скважность более 10 (а напряжение питания как раз 3 В). Поднимайте ток, увеличивайте скважность и используйте 3-4 светодиода последовательно если есть место - у вас большая часть энергии греет резистор!
Если несколько сведодиодов использовать неудобно, то, чтобы не греть резисторы можно использовать трансформатор с трансформацией раза в 4 (надо смотреть, при каком напряжении ток через светодиод будет в 1 А примерно).
Быть может стоит взять светодиод с меньшим углом облучения, а фотоприемник поместить в трубку, защищающую от световых помех (TSOP чувствителен к газоразрядным лампам с электронным балластом)?
Для напряжения питания в 12 В я использовал три последовательно включенных светодиода и резистор в 7-8 Ом - дальность приема команд аппаратурой более 10 метров (это для устройства записи ИК команд использовалось).
Ещё обратите внимание на высокую чувствительность TSOPов к помехам по питанию - ШИМ-помеха от вашего двигателя может резко снизить чувствительность приемника - проведите проверку без двигателя.
Справка из документации на него про 1А или около того:
1. Мощность заявлена в 1 Вт против 130 мВт при импульсе в 1А и длительности в 100 мкс
2. График Figure 3. Pulse Forward Current vs. Pulse Duration сообщает, что он и 10 мс при 1 А держит при большой скважности.
|
Трансформатор сразу отпадает, он места займет больше чем светодиоды и фонить будет.
Попробую постаивть три светодиода и повысить скважность до 10, в принципе 100ма мне хватает,но судя по датащиту на TSOP он должен в разы быть чувствительнее.
По питанию TSOP защищен правильно, керамика и электролит и резистор 100 ом.
|
|
|
|
02.08.2013, 10:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,643
Сказал спасибо: 5,454
Сказали Спасибо 25,005 раз(а) в 5,610 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
Цитата:
|
Как поднять дальность ИК барьера без повышения мощности светодиода?
|
Надо увеличить паузу между пачками импульсов и сами пачки сделать покороче (импульсов 20 с частотой 38кГц).
Если интересно почему, советую почитать даташит на фотоприёмник, раздел про АРУ.
__________________
«Совершенство — это не тогда, когда уже нечего больше добавить, а тогда, когда уже нечего отнять.»
/Эйнштейн/
моя домашняя страничка: http://www.eddy.com.ua/
|
|
|
|
02.08.2013, 10:40
|
|
Гражданин KAZUS.RU
Регистрация: 27.11.2012
Адрес: 30км от Софии
Сообщений: 732
Сказал спасибо: 89
Сказали Спасибо 310 раз(а) в 180 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
Suitable Data Format
The circuit of the TSOP17.. is designed in that way that
unexpected output pulses due to noise or disturbance
signals are avoided. A bandpassfilter, an integrator
stage and an automatic gain control are used to
suppress such disturbances.
The distinguishing mark between data signal and
disturbance signal are carrier frequency, burst length
and duty cycle.
The data signal should fullfill the following condition:
• Carrier frequency should be close to center
frequency of the bandpass (e.g. 38kHz).
• Burst length should be 10 cycles/burst or longer.
• After each burst which is between 10 cycles and 70
cycles a gap time of at least 14 cycles is neccessary.
• For each burst which is longer than 1.8ms a
corresponding gap time is necessary at some time in
the data stream. This gap time should have at least
same length as the burst.
• Up to 1400 short bursts per second can be received
continuously.
|
|
|
|
02.08.2013, 12:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.02.2008
Адрес: Ukraine, рядом с Полтавой
Сообщений: 9,643
Сказал спасибо: 5,454
Сказали Спасибо 25,005 раз(а) в 5,610 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
Совершенно верная цитата. Ещё добавлю, что время восстановления усиления от экземпляру к экземпляру в разы пляшет. Поэтому паузу между пачками (чтоб точно заработала) более 200мС надо.
__________________
«Совершенство — это не тогда, когда уже нечего больше добавить, а тогда, когда уже нечего отнять.»
/Эйнштейн/
моя домашняя страничка: http://www.eddy.com.ua/
|
|
|
|
02.08.2013, 12:37
|
|
Вид на жительство
Регистрация: 30.10.2007
Адрес: Ростов-на-Дону
Сообщений: 285
Сказал спасибо: 23
Сказали Спасибо 39 раз(а) в 33 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
"По питанию TSOP защищен правильно" - да кто его знает, судя по графику "VsRMS –AC Voltage on DC Supply Voltage ( mV )" при частоте близкой к несущей (30-40 кГц и вообще всё что выше 10 кГц) помеха всего в 2...10 милливольт снижает чутьё в 20-30 раз. Это если там размах в 12 В,то до 10 мВ надо додавить в 1000 раз.
А у вас в программе "настраиваем ШИМ для двигателя с частотой 8000000/256= 31250 ГЦ", а 31 КГц - очень близко к полосе приемника.
Ну не стесняйтесь ток поднимать. При скважности в 10 (пачек импульсов) делайте полампера, в норму уложитесь! При токе в полампера на светодиоде 2-2,5 В, так что резистор ом в 20 надо ставить.
Последний раз редактировалось vspvsp; 02.08.2013 в 12:43.
|
|
|
|
02.08.2013, 12:43
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
Сообщение от Eddy71
|
Надо увеличить паузу между пачками импульсов и сами пачки сделать покороче (импульсов 20 с частотой 38кГц).
Если интересно почему, советую почитать даташит на фотоприёмник, раздел про АРУ.
|
Пробовал как в датащите сделать: 10 имипульсов по 600мск и потом пауза в 60мс и т.д.
Не помогло, дальность не увеличилась, на выходе TSOP такач же картина.
|
|
|
|
02.08.2013, 12:53
|
|
Вид на жительство
Регистрация: 02.11.2008
Сообщений: 319
Сказал спасибо: 17
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
|
Re: Маленькая дальность ИК барьера
Сообщение от vspvsp
|
"
Ну не стесняйтесь ток поднимать. При скважности в 10 (пачек импульсов) делайте полампера, в норму уложитесь! При токе в полампера на светодиоде 2-2,5 В, так что резистор ом в 20 надо ставить.
|
Один светодиод дает падение 1.6в, если постаивть 3 шт. последовательно то для 100ма нужен резистор 72ом с мощностью 0,72вт, т.е. 1206 будет греться дайбоже...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:38.
|
|