roboforum.ru

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

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

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

Сообщение sema-lap » 26 июн 2011, 02:10

мне кажется тогда код на 2 датчика должен выглядеть так: но он не работает. где ошибка?
Код: Выделить всёРазвернуть
ISR(ADC_vect)
{
      if (ADCH == 0)
      {
         MOTOR_PORT = STOP;
         DDRB = 1 << PB0;
         PORTB = 1 << PB0;
      }
      else
      {
              DDRB = 0 << PB0;
         MOTOR_PORT = FORWARD;
         ADMUX  = (0<<MUX0);//задаём порт ADC0
                        ADCSRA = (1 << ADSC);//запускаем преобразование
              OCR1A = ADCH;
         ADMUX  = (1<<MUX0);//задаём порт ADC1
         ADCSRA = (1 << ADSC);
                   OCR1B = ADCH; //мотор кртится с мощьностью пропорциональной освещённости на датчике
      }
}

void init()
{


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

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

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

Сообщение Radist » 26 июн 2011, 08:42

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

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

Сообщение sema-lap » 26 июн 2011, 15:46

проблема не в том, я знаю как сделать пид регулятор, я занимаюсь лего роботами и алгоритмы управления знаю и делал на лего лайнтрейсеров, проблема в том,что не получается получить показания с двух датчиков,нужен именно код программы.
правильно ли я понимаю эти регистры:
ADMUX = 0 << MUX0 - порт ADC0//если все mux2=0 и mux1=0;
ADMUX = 1 << MUX0 - порт ADC1
ADCSRA = 1 << ADSC - запускает еденичное преобразование
ADCSRA = 1 << ADATE - разрешает преобразование одно за другим?
Кто не рискует тот не пьёт морковный сок!
sema-lap
 
Сообщения: 20
Зарегистрирован: 14 янв 2011, 02:46
Откуда: Санкт-Петербург
ФИО: Лапко Сёма

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

Сообщение Radist » 26 июн 2011, 18:40

Я пишу только на асемблере, возможно вам поможет вот это:
http://proavr.narod.ru/z09.htm
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Пред.

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

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

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