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;//      
   };
}


заранее всем большое спасибо.

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

osc » 21 июн 2011, 19:08

На разные каналы АЦП цепляете фотодатчики, выбираете нужный вам канал при помощи мультиплексора, записав байт в регистр ADMUX (см. даташит) и запускаете АЦ преобразование, установив 6-ой бит ADCSRA в 1.

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

sema-lap » 21 июн 2011, 20:55

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

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

רגוזין רומאן » 21 июн 2011, 22:16

data sheet page 199

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

sema-lap » 21 июн 2011, 23:40

возможно я ошибаюсь, но что тогда такое ADC1,ADC2...?
p.s. в моём даташите только 21 страница.

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

=DeaD= » 22 июн 2011, 07:25

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

Это у вас не даташит, а так, буклетик. Скачайте даташит.

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

Дмитрий К. » 22 июн 2011, 22:44

А зачем АЦП, на компараторах же проще - 1 или 0 на выходе, ничего мерять не надо

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

sema-lap » 23 июн 2011, 00:47

ну как бы хочется знать на сколько я заехал на линию или съехал,а не просто на линии датчик или нет, если так можно сделать при помощи компараторов расскажите.
Я понял что раньше я сморозил полную глупость про АЦП.Простите я только учусь.

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

Radist » 23 июн 2011, 04:04

Пользуйтесь официальными источниками информации.
http://www.atmel.com/dyn/resources/prod ... oc2503.pdf
И учите английский. В даташите написан ответ на ваш вопрос.

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

Дмитрий К. » 23 июн 2011, 15:51

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

А как это сделать на АЦП? Линия либо есть, либо нет.

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

Radist » 23 июн 2011, 19:59

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

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

osc » 24 июн 2011, 12:23

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

Скачай нормальный даташит с оф. сайта и почитай описания регистров из раздела про АЦП, обрати внимание на то как каналы АЦП переключать (т.е. посмотри назначение битов регистра ADMUX). После этого должно стать понятно как сделать программно.
В меге 32 8 каналов АЦП.

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

Дмитрий К. » 24 июн 2011, 19:08

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

Странная у вас линия, у меня такой небыло. АЦП актуально если на свет ехать.
И еще, изза инерции движения робот проскочит положение "половинной яркости", не успев на него среагировать.

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

Radist » 24 июн 2011, 20:05

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

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

osc » 25 июн 2011, 21:44

Radist, +100, отлично работает этот способ с аналоговыми датчиками линии и ПИДом, проверено лично.


cron
Rambler\'s Top100 Mail.ru counter