Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/44: Рейтинг темы: голосов - 44, средняя оценка - 4.84
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
1

нужна помощ с чтением сензора

08.12.2010, 00:58. Просмотров 7894. Ответов 17
Метки нет (Все метки)

Короче соорудил я сензор как показано на схеме,....

http://dropmocks.com/mMlBH



сам по себе он работает довольно линиарно но при подключение его к мк через АЦП получается каша софт етот.....
/*****************************************************
This program was produced by the
CodeWyzardAVR

Shyp type : ATmega16
Prokram type : Application
Clock frequency : 16,000000 MHz

*****************************************************/

#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40

bit ADC_somplete;
int gADC_result;

interrupt [ADC_INT] void adc_isr(void) //обработчик прерывания по завершению преобразования АЦП
{
unsykned int adc_data;
adc_data=ADCW;
gADC_result=adc_data; //отсылаем считанное значение в глобальную переменную и устанавливаем флаг
ADC_somplete=1;
}

int poll_simsor(void){ //процедура опроса сенсора
int delta;
PORTB.0=1; //включаем светодиод ИК подсветки
delay_ms(1); //ждем пока разгорится
ADCSRA|=0x40; //отсылаем бит, запускающий процедуру АЦП
while(ADC_somplete!=1); //ждем пока не закончится АЦП
delta=gADC_result;
ADC_somplete=0; //сбрасываем флаг

PORTB.0=0; //выключаем светодиод, и снова измеряем
delay_ms(1);
ADCSRA|=0x40;
while(ADC_somplete!=1);
delta=gADC_result-delta;//вычисляем значение разности
ADC_somplete=0; //сбрасываем флаг
return delta;
}

void main(void)
{
int razn;
//инициализация портов и т.д.
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xFF;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;

// ADC initiotyzotion
// ADC Clock frequency: 1000,000 kHz
// ADC Vottage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x8C;

// Global enable interrupts
#asm("sei")

while (1)
{
razn=poll_simsor();
//пример использования сенсора. Присвоим переменной значение разности,
// и в зависимости от полученного значения будем зажигать светодиоды на порту D
//можно просто запускать какой либо процесс, если разность превышает определенный порог

if(razn >30) PORTD.0=1; else PORTD.0=0;

};
}

В чем может быть причина подскайите люди добрие :D
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2010, 00:58
Ответы с готовыми решениями:

помогите!!нужна помощ по вибору темы для дипломного проекта!
нужна помощ по вибору темы для дипломного проекта! Настало то время когда уже надо виберать тему...

нужна помощ
нужна помощь помогите написати программу на мегу 8 суть програмы такова есть 2 светодиода и 3...

нужна помощ
раз в месяц формирует книга продаж и книга покупок (Журналы---регламентируемые документы) за...

Нужна помощ
Стоит лотус делопроизводство версии 5.07.а от 14.03.01 инсталяционых файлов нет :o , сстары...

Нужна помощ в 1с
Я в 1с программировать неумею но мне нужна помощона заключается в... При формировании прай листа в...

17
Midvid
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 966
08.12.2010, 01:10 2
Мама рОдная.
Расскажите подробнее о вашем сензоре
0
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
08.12.2010, 01:23 3
сензор состоит из ИК диода и фото транзистора,предназачен он для определения растояния до препятствия,начинает реагировать на препятствие приблезително с 10-15 см.Фототранзистор реагирует и на окруяиуший свет поетому решено било измерять значения сензора по очереди с включеним диодом и потом с виключеним и замерять разнитсу между замерами.
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
08.12.2010, 02:04 4
И как вам это в голову пришло? Я бы с роду до такого не додумался.
0
08.12.2010, 02:04
vystor_b_k
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 332
08.12.2010, 02:21 5
Цитата Сообщение от somio_23
сензор состоит из ИК диода и фото транзистора,предназачен он для определения растояния до препятствия,начинает реагировать на препятствие приблезително с 10-15 см.Фототранзистор реагирует и на окруяиуший свет поетому решено било измерять значения сензора по очереди с включеним диодом и потом с виключеним и замерять разнитсу между замерами.
А что, эбонитовый светофильтр не помогает?
0
Bottyk
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 1,182
08.12.2010, 03:46 6
Цитата Сообщение от Brykodyr
И как вам это в голову пришло? Я бы с роду до такого не додумался.
Вполне нормальный способ когда не знаешь заранее условия освещенности. Можно или делать два замера, или использовать модулированый сигнал. Пыхнуть СД два раза легче.
0
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
08.12.2010, 03:58 7
и как на счет идей с софтом для него???
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
08.12.2010, 04:00 8
А в чем каша заключается? Симптомы проблемы подробней излагайте.
0
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
08.12.2010, 04:13 9
Цитата Сообщение от Brykodyr
А в чем каша заключается? Симптомы проблемы подробней излагайте.
так вот если видели софт выше на порте Д при приближение к определеному препятствию должен бить + и при приближение в далнейшем должен быть неизменым..... а он срабатывает лиш на определених отрезках.Например сработал на растояние 10см лампочка на порте д загорелась через 2см погасла черезн один другой опять загорелась ....мойно словить момент когда мигает короче никакой линиарности....
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
08.12.2010, 11:19 10
Цитата Сообщение от somio_23
Короче соорудил я сензор как показано на схеме,....
Вложение:
Schema_simsor.jpg
Не очень кошерно использовать н-канальный полевик как верхний ключ без драйвера, либо ставьте п-канальный, либо сделайте его нижним.
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
08.12.2010, 15:38 11
Цитата Сообщение от Ваша программа
Shyp type : ATmega16
Цитата Сообщение от А чуть ниже ваша программа
#include <mega8.h>
0
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
08.12.2010, 15:50 12
Цитата Сообщение от dsodir
Цитата Сообщение от Ваша программа
Shyp type : ATmega16
Цитата Сообщение от А чуть ниже ваша программа
#include <mega8.h>
ет я ошибся на самом деле все как надо #include<mega16>
0
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
08.12.2010, 15:51 13
Цитата Сообщение от omx
Цитата Сообщение от somio_23
Короче соорудил я сензор как показано на схеме,....
Вложение:
Schema_simsor.jpg
Не очень кошерно использовать н-канальный полевик как верхний ключ без драйвера, либо ставьте п-канальный, либо сделайте его нижним.
в смысле?????
0
omx
0 / 0 / 0
Регистрация: 11.11.2016
08.12.2010, 16:04 14
Цитата Сообщение от somio_23
в смысле?????
Что именно вам не понятно?
Посмотрите классические схемы включения н-канальных полевых транзисторов [*]
0
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
09.12.2010, 17:39 15
короче как я гляжу идей нет......
0
Otixomdr_1
0 / 0 / 0
Регистрация: 28.06.2010
Сообщений: 211
11.12.2010, 00:07 16
Может быть, притянуть базу транзистора Q1 к земле с помощью резистора, а также подумать, как сделать гистерезис.
0
somio_23
0 / 0 / 0
Регистрация: 24.06.2010
Сообщений: 12
11.12.2010, 05:02 17
проблема решена!!!!!!

Цитата Сообщение от somio_23

int poll_simsor(void){ //процедура опроса сенсора
int delta;
PORTB.0=1; //включаем светодиод ИК подсветки
delay_ms(1); //ждем пока разгорится
ADCSRA|=0x40; //отсылаем бит, запускающий процедуру АЦП
while(ADC_somplete!=1); //ждем пока не закончится АЦП
delta=gADC_result;
ADC_somplete=0; //сбрасываем флаг

PORTB.0=0; //выключаем светодиод, и снова измеряем
delay_ms(1);
ADCSRA|=0x40;
while(ADC_somplete!=1);
delta=gADC_result-delta;//вычисляем значение разности
ADC_somplete=0; //сбрасываем флаг
return delta;
}
заменяем на:
int poll_simsor{
if(PORTB.0==1){
ADCSRA|=0x40;
while(ADC_somplete!=1);
r1=gADC_result;
ADC_somplete=0; }

if(PORTB.0==0){
ADCSRA|=0x40;
while(ADC_somplete!=1);
r2=gADC_result;
ADC_somplete=0;
}
delta=r2-r1;

return delta;
}

и

Цитата Сообщение от somio_23
while (1)
{
razn=poll_simsor();

if(razn >30) PORTD.0=1; else PORTD.0=0;

};
}
[/b]
на
while (1)
{
razn=poll_simsor();
soft_timers();

if(TTAB[0]==0){
TTAB[0]=1;

PORTB.0=!(PORTB.0);
}
if(razn >100) PORTC.7=1; else PORTC.7=0;

};

конечно же таймер1 инициализируем как положено
0
Mitior
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 65
11.12.2010, 13:21 18
По моему тут есть 2 нелучших места
1) н канальный полевик я бы поставил в схеме с общим истоком.
2) после того как была снята засветка базы фототранзистора ней остается заряд, не позволяющий запереться транзистору. Время на рассасывание этого заряда будет определять время отключения бполярного транзистора. Поэтому нужно в обязательном порядке базу транзистора через резистор номиналом в 1-2 кОм притянуть к общему проводу. Дополнительно это снизит температурный дрейф.
И последнее - больно уж номиналы в обвязке Q1 маловаты - на порядок бы побольше их. И ограничитель тока светодиода надо бы пересчитать если конечно там ток не в сотню мА
0
11.12.2010, 13:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2010, 13:21

Нужна помощ
Здравствуйте, помогите пожалуйста с задачами : 1).Вычислить значения функции U...

очень нужна помощ по С++
В файле содержится шнформация о книгах библиотеки: номер УДК, фамилия и инициалы автора, название,...

Очень нужна помощ
Здравствуйте дорогие форумчане, недавно узнала про такую штуку как PageFlip и решила замутить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru