somio_23
1

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

08.12.2010, 00:58. Показов 7987. Ответов 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
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2010, 00:58
Ответы с готовыми решениями:

STM8S - АЦП Нужна помощ!
Доброго времени суток! Я только начал разбиратся с 8ми битными контроллерами от ST(ранее...

Алкотестер МЕТА на stm32f103zet6 нужна помощ!!!
Доброго времени суток! Взялся прочистить воздушный клапан на этом злополучном устройстве, и собрав...

STM32 IAP UART bootloader. Нужна помощ!
Много написано об этом, но все равно - не прёт, зараза... Работаю в IARe. Имеется 2 проекта: 1)...

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

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

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

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

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

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

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

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


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

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

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