roboforum.ru

Технический форум по робототехнике.

2 датчика линии

2 датчика линии

Сообщение sema-lap » 21 июн 2011, 14:51

Решил сделать робота для линии, всё на писал, спаял, всё работает,но не могу разобраться как использовать одновременно два датчика света, с одним датчиком всё работает.
я пишу на avrstudio.
помогите разобраться, а то уже два месяца мучаюсь.
код прилагаю.
и как вообще подключать >1 датчика на ацп.
Код: Выделить всёРазвернуть
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

#define BACKWARD   ((0 << PC0)|(1 << PC1)|(1 << PC2)|(0 << PC3))      
#define FORWARD      ((1 << PC0)|(0 << PC1)|(0 << PC2)|(1 << PC3))

#define STOP      ((1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3))
#define MOTOR_PORT   PORTC

ISR(ADC_vect)
{
      if (ADCH == 0)
      {
         MOTOR_PORT = STOP;
         DDRB = 1 << PB0;
         PORTB = 1 << PB0;
      }
      else
      {
          DDRB = 0 << PB0;
         MOTOR_PORT = FORWARD;
      
      }
}

void init()
{

//////////PortC Initialization////////////////////////
   DDRC  = (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
   PORTC = (1 << PC0)|(1 << PC1)|(1 << PC2)|(1 << PC3);
//-----------------------------------------------------
//////////PortD Initialization/////////////////////////
   DDRD  = (1 << PD4)|(1 << PD5);
   PORTD = 0;
//-----------------------------------------------------

//////////Timer 1 Initialization//////////////////////
   TCCR1A = (1 << COM1A1)|(1 << COM1B1)|(1 << WGM10);
   TCCR1B = (1 << WGM12)|(1 << CS10);
   TCNT1  = 0;
   OCR1A  = 0;
   OCR1B  = 0;
//-----------------------------------------------------

//////////ADC0 Intitialization////////////////////////
   ADMUX  = (1 << ADLAR);
   ADCSRA = (1 << ADEN)|(1 << ADATE)|(1 << ADSC)|(1 << ADIE)|(3 << ADPS0);
//----------------------------------------------------
   MOTOR_PORT = STOP;
   




};



int main(void)
{
   init();
   sei();
   while(1)
   {
     OCR1A = ADCH;//здесь будет ПД регулятор на 2 датчика
     OCR1B = ADCH;//      
   };
}


заранее всем большое спасибо.
Кто не рискует тот не пьёт морковный сок!
sema-lap
 
Сообщения: 20
Зарегистрирован: 14 янв 2011, 02:46
Откуда: Санкт-Петербург
ФИО: Лапко Сёма

Re: 2 датчика линии

Сообщение osc » 21 июн 2011, 19:08

На разные каналы АЦП цепляете фотодатчики, выбираете нужный вам канал при помощи мультиплексора, записав байт в регистр ADMUX (см. даташит) и запускаете АЦ преобразование, установив 6-ой бит ADCSRA в 1.
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

Re: 2 датчика линии

Сообщение sema-lap » 21 июн 2011, 20:55

Да, можно и так, но как это сделать программно?
Я точно знаю, что на ATMEGE32 есть два входа АЦП.
Кто не рискует тот не пьёт морковный сок!
sema-lap
 
Сообщения: 20
Зарегистрирован: 14 янв 2011, 02:46
Откуда: Санкт-Петербург
ФИО: Лапко Сёма

Re: 2 датчика линии

Сообщение רגוזין רומאן » 21 июн 2011, 22:16

data sheet page 199
רגוזין רומאן
 

Re: 2 датчика линии

Сообщение sema-lap » 21 июн 2011, 23:40

возможно я ошибаюсь, но что тогда такое ADC1,ADC2...?
p.s. в моём даташите только 21 страница.
Кто не рискует тот не пьёт морковный сок!
sema-lap
 
Сообщения: 20
Зарегистрирован: 14 янв 2011, 02:46
Откуда: Санкт-Петербург
ФИО: Лапко Сёма

Re: 2 датчика линии

Сообщение =DeaD= » 22 июн 2011, 07:25

sema-lap писал(а):в моём даташите только 21 страница.

Это у вас не даташит, а так, буклетик. Скачайте даташит.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: 2 датчика линии

Сообщение Дмитрий К. » 22 июн 2011, 22:44

А зачем АЦП, на компараторах же проще - 1 или 0 на выходе, ничего мерять не надо
Дмитрий К.
 
Сообщения: 76
Зарегистрирован: 01 июл 2010, 20:58
Откуда: Санкт-Петербург
прог. языки: Си
ФИО: Дмитрий

Re: 2 датчика линии

Сообщение sema-lap » 23 июн 2011, 00:47

ну как бы хочется знать на сколько я заехал на линию или съехал,а не просто на линии датчик или нет, если так можно сделать при помощи компараторов расскажите.
Я понял что раньше я сморозил полную глупость про АЦП.Простите я только учусь.
Кто не рискует тот не пьёт морковный сок!
sema-lap
 
Сообщения: 20
Зарегистрирован: 14 янв 2011, 02:46
Откуда: Санкт-Петербург
ФИО: Лапко Сёма

Re: 2 датчика линии

Сообщение Radist » 23 июн 2011, 04:04

Пользуйтесь официальными источниками информации.
http://www.atmel.com/dyn/resources/prod ... oc2503.pdf
И учите английский. В даташите написан ответ на ваш вопрос.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: 2 датчика линии

Сообщение Дмитрий К. » 23 июн 2011, 15:51

sema-lap писал(а):ну как бы хочется знать на сколько я заехал на линию или съехал,а не просто на линии датчик или нет, если так можно сделать при помощи компараторов расскажите.

А как это сделать на АЦП? Линия либо есть, либо нет.
Дмитрий К.
 
Сообщения: 76
Зарегистрирован: 01 июл 2010, 20:58
Откуда: Санкт-Петербург
прог. языки: Си
ФИО: Дмитрий

Re: 2 датчика линии

Сообщение Radist » 23 июн 2011, 19:59

На ацп это сделать элементарно. Напряжение на фототранзисторе пропорционально освещенности, а освещенность зависит от того, сколько в световом пятне черного и сколько белого.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: 2 датчика линии

Сообщение osc » 24 июн 2011, 12:23

Да, можно и так, но как это сделать программно?
Я точно знаю, что на ATMEGE32 есть два входа АЦП.

Скачай нормальный даташит с оф. сайта и почитай описания регистров из раздела про АЦП, обрати внимание на то как каналы АЦП переключать (т.е. посмотри назначение битов регистра ADMUX). После этого должно стать понятно как сделать программно.
В меге 32 8 каналов АЦП.
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

Re: 2 датчика линии

Сообщение Дмитрий К. » 24 июн 2011, 19:08

Radist писал(а):На ацп это сделать элементарно. Напряжение на фототранзисторе пропорционально освещенности, а освещенность зависит от того, сколько в световом пятне черного и сколько белого.

Странная у вас линия, у меня такой небыло. АЦП актуально если на свет ехать.
И еще, изза инерции движения робот проскочит положение "половинной яркости", не успев на него среагировать.
Дмитрий К.
 
Сообщения: 76
Зарегистрирован: 01 июл 2010, 20:58
Откуда: Санкт-Петербург
прог. языки: Си
ФИО: Дмитрий

Re: 2 датчика линии

Сообщение Radist » 24 июн 2011, 20:05

Линия как у всех, черная на белом, ширина 2 см. Если у вас не получилось - это не значит что это не возможно. Сейчас мы говорим об одном датчике, который позволяет отслеживать край линии. Уже один этот датчик позволяет организовать ПИД управление. Попробуйте это сделать на одном компараторе. Два аналоговых датчика на краях линии еще круче. А если у вас линейка датчиков и с каждого приходит код АЦП, то можно получить смещение центра линии относительно центра робота с очень хорошим разрешением (а не несколько дискретов, как в случае с компараторами). Рекомендую посмотреть в подфоруме "Алгоритмы" мою темку, где я исследовал эти вопросы, а в подфоруме "Робоспорт/лайнтрейсеры" результаты заездов при разных линейках, дискретных и аналоговых.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: 2 датчика линии

Сообщение osc » 25 июн 2011, 21:44

Radist, +100, отлично работает этот способ с аналоговыми датчиками линии и ПИДом, проверено лично.
Аватара пользователя
osc
 
Сообщения: 333
Зарегистрирован: 07 сен 2009, 20:06
прог. языки: c, c#
ФИО: Евгений

След.

Вернуться в Сенсорика

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8