реклама на сайте
подробности

 
 
> Гусеничный робот
Faoxis
сообщение Dec 13 2014, 21:08
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 3-12-14
Пользователь №: 83 952



Здравствуйте! Есть гусеничный робот. Спереди на нем стоят два фотодиода. Есть черная линия по которой он должен ездить и поворачивать с помощью ШИМа. У правляющий порт - С. Комбинация PORTC |= 0x82U; заставляет его ехать вперед. Вроде бы ничего сложного, но уже несколько дней не могу понять в чем накосячил. Стоит на месте и не едет. При этому, если без ШИМа подать на ножки напряжения, то начинает ехать прямо как ему и положено.

Я не прошу разбирать весь код (но и не откажусь Опубликованное фото), но не могли бы вы окинуть свежий взгяд на листинг программы ? Вдруг увидите что-нибудь. Спасибо!

CODE
#include <mega32.h>
#include <delay.h>

unsigned char x = 0, y = 0;
unsigned char K = 0;

/////////////////////////////////////////////////////////////////////////////////////////
////////////////////// Объявленияе функций //////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

//Заставляем робот ехать вперед (настройка портов)
//-----------------------------------------------------------------------------------------
void start();

//Настройка АЦП
//-----------------------------------------------------------------------------------------
void init_adc();

//Чтение из АЦП
//-----------------------------------------------------------------------------------------
unsigned int read_adc(unsigned char Pin_ADC);

//Настройка таймера 0 и 2
//-----------------------------------------------------------------------------------------
void init_timer02();

//Настройка таймера 0 и 2
//-----------------------------------------------------------------------------------------
void init_timer1();

// Вызов прерывания
//-----------------------------------------------------------------------------------------
interrupt [TIM1_OVF] void workplease(void);



/////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////// Функция main //////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
void main()
{
init_adc();
init_adc();
init_timer02();
init_timer1();

start();

#asm("sei") // Разрешение прерывания
while(1)
{


}
}




/////////////////////////////////////////////////////////////////////////////////////////
////////////////////// Описание функций /////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

// Установка АЦП
//-----------------------------------------------------------------------------------------
void init_adc()
{
ADMUX = 0x40U; //выбираем источник питания АЦП 5v
ADCSRA |= 0x07U; // устанавливаем предделитель 128 (ADPS2, ADPS1, ADPS0), он нужен из-за того, что ацп занимает много тактов
ADCSRA |= 0x80U; // Включаем АЦП (ADEN)
}

// Чтение из АЦП
unsigned int read_adc(unsigned char Pin_ADC)
{
ADMUX |= Pin_ADC & 0x07U; // Разрешаем менять только 3 последний бита
delay_us(10); // Задержка на 10 микросек по даташиту
ADCSRA |= 0x40U; // Выставлем бит ADIF для запуска преобразования
while((ADCSRA & 0x10) == 0); // Ждем пока оно совершится

return ADCW; // Возвращем сразу значение старшего и младшего бита АЦП
}

// Порты
//-----------------------------------------------------------------------------------------
void start()
{

DDRD |= 0x80U;
DDRB |= 0x08U;

DDRC |= 0x82U;

PORTC |= 0x82U;
}

// Таймеры 0 и 2
//-----------------------------------------------------------------------------------------
void init_timer02()
{
// Указываем явным образом начальное значение регистра счета
TCNT0 = 0x00U;
TCNT2 = 0x00U;

// Укахываем начальное значение регистра сравнения
// Впоследствии оно будет меняться ШИМом
OCR0 = 0x3F;
OCR2 = 0x3F;

// Регистр настройки
TCCR0 = 0x48U; // Fast PWM
TCCR0 |= 0x20U; // Сброс в 0 при прямом счете
TCCR0 |= 0x01U; // Считаем ипульсы кварцевого генератора без предделителя

TCCR2 = 0x48U; // Fast PWM
TCCR2 |= 0x20U; // Сброс в 0 при прямом счете
TCCR2 |= 0x01U; // Считаем ипульсы кварцевого генератора без предделителя

}

// Таймера 1
//-----------------------------------------------------------------------------------------
void init_timer1()
{
TCCR1B |= 0x04U; // устанавливаем режим СТС (сброс по совпадению
TIMSK |= 0x10U; // устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)

OCR1AH = 0b00000111; // определяем число сравнения. Определяем как часто делать прерывания
OCR1AL = 0b00000000;

TCCR1B |= 0x01U; //запуск таймера без предделителя
}

// Прерывание
//-----------------------------------------------------------------------------------------
interrupt [TIM1_OVF] void workplease(void)
{
x = read_adc(0x00); // Значение с ножки А0
y = read_adc(0x01); // Значение с ножки А1

K = x - y; // Модуль разности

if (x < y)
OCR0 = OCR0 - K * 10;
else
OCR2 = OCR2 - K * 10;


}



Сообщение отредактировал IgorKossak - Dec 14 2014, 00:03
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kovigor
сообщение Dec 13 2014, 21:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Faoxis @ Dec 14 2014, 01:08) *
Спереди на нем стоят два фотодиода. Есть черная линия по которой он должен ездить и поворачивать с помощью ШИМа.

1. Сообщение очень просто отредактировать (кнопка "EDIT" -> "Быстрое редактирование").
2. "Спереди на нем стоят два фотодиода" - ключевые слова. Схему в студию. Как подключены фотодиоды ? Если это просто фотодиоды, напрямую подключенные к ножкам порта, то ничего из этой затеи не выйдет, и никто никуда не поедет. Нужны, как минимум, преобразователи тока в напряжение. Это как минимум. Кто подсвечивает эту самую линию ? Лампочка в комнате ? Как все это хозяйство защищено от посторонних засветок ? Или оно только в полной темноте ездить будет ?
Так что без схемы тут обсуждать, ИМХО, нечего. ПО нужно винить, писать и отлаживать в самую последнюю очередь, когда вы убедитесь (с помощью осциллографа или, в крайнем случае, мультиметра), что ваша аппаратная часть работает, как полагается ...
Go to the top of the page
 
+Quote Post
Faoxis
сообщение Dec 14 2014, 07:05
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 3-12-14
Пользователь №: 83 952



Цитата(kovigor @ Dec 14 2014, 01:24) *
2. "Спереди на нем стоят два фотодиода" - ключевые слова. Схему в студию. Как подключены фотодиоды ? Если это просто фотодиоды, напрямую подключенные к ножкам порта, то ничего из этой затеи не выйдет, и никто никуда не поедет. Нужны, как минимум, преобразователи тока в напряжение. Это как минимум. Кто подсвечивает эту самую линию ? Лампочка в комнате ? Как все это хозяйство защищено от посторонних засветок ? Или оно только в полной темноте ездить будет ?
Так что без схемы тут обсуждать, ИМХО, нечего. ПО нужно винить, писать и отлаживать в самую последнюю очередь, когда вы убедитесь (с помощью осциллографа или, в крайнем случае, мультиметра), что ваша аппаратная часть работает, как полагается ...


Это мой курсач. sm.gif Робот с фотодиодами работает, предыдущие курсы его запускали. Схема вот, но на ней 3 фотодиода, на самом деле их 2(A0,A1):



Цитата(ILYAUL @ Dec 14 2014, 01:22) *
И кстати не нашёл запуск преобразования ADSC


Как это ? В функции read_adc:
Код
ADCSRA |= 0x40U; // Выставлем бит ADIF  для запуска преобразования
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 14 2014, 12:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Faoxis @ Dec 14 2014, 10:05) *
Робот с фотодиодами работает

Хорошо работает ? Или плохо ? Или очень плохо ? Предыдущие курсы его запускали. А запустили ? Вот тут - самый главный вопрос. Мы с братом тоже в детстве реактивный самолет запускали, с балкона. Но он улетел не в небо, а на балкон соседа, расположенный этажом ниже, и прожег там дырку в марле, которая мирно сушилась на веревках (на самом деле, нам крупно повезло - пожар мог быть тот еще). На следующий день сосед нас вычислил и сообщил нам, что как авиастроители мы пока не состоялись.
По делу. Схема абсолютно нечитаема. Если хотите, чтобы вам помогли, потрудитесь предоставить более качественную схему ...
Go to the top of the page
 
+Quote Post
Faoxis
сообщение Dec 14 2014, 15:17
Сообщение #5





Группа: Новичок
Сообщений: 4
Регистрация: 3-12-14
Пользователь №: 83 952



Цитата(kovigor @ Dec 14 2014, 16:15) *
Хорошо работает ? Или плохо ? Или очень плохо ? Предыдущие курсы его запускали. А запустили ? Вот тут - самый главный вопрос. Мы с братом тоже в детстве реактивный самолет запускали, с балкона. Но он улетел не в небо, а на балкон соседа, расположенный этажом ниже, и прожег там дырку в марле, которая мирно сушилась на веревках (на самом деле, нам крупно повезло - пожар мог быть тот еще). На следующий день сосед нас вычислил и сообщил нам, что как авиастроители мы пока не состоялись.
По делу. Схема абсолютно нечитаема. Если хотите, чтобы вам помогли, потрудитесь предоставить более качественную схему ...


Спасибо за помощь! Очень помогла ваша история. Когда соберетесь написать книгу, пожалуйста, пришлите мне экземпляр.
А по схеме и не надо ничего понимать, кроме того, что есть два фотодиода на А0 и А1. И есть микросхема управления двигителями (L298). Все остальное не важно для данной задачи.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Dec 14 2014, 19:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Faoxis @ Dec 14 2014, 19:17) *
Спасибо за помощь! Очень помогла ваша история. Когда соберетесь написать книгу, пожалуйста, пришлите мне экземпляр.
А по схеме и не надо ничего понимать, кроме того, что есть два фотодиода на А0 и А1. И есть микросхема управления двигителями (L298). Все остальное не важно для данной задачи.

L298 к фотодиодам, как они есть, никаким боком не касается. Это просто драйвер двигателя:

https://www.sparkfun.com/datasheets/Robotic...98_H_Bridge.pdf

Еще раз. Я не хочу вас обидеть, а просто пытаюсь донести до вас, что начать вам следует с проверки аппаратной части, а никак не с отладки программы.
Итак, берем осциллограф (в идеале). Если же его нет (а в ВУЗовской лаборатории он быть обязан), то берем обычный мультиметр. И с его помощью пытаемся выяснить, почему проект не работает, как положено.
Схему вы не дали, а посему дальше говорить, увы, не о чем. Могу только сказать, что простейшая схема, описанная вами в двух словах, работать не будет, почти наверняка. И столь же наверняка о преобразователе тока в напряжение вы слышите впервые в жизни.
Можете попробовать запустить вашего робота в темной комнате, где нет никаких посторонних засветок. Если вам крупно повезет, то он хоть как-то зашевелится.
А вообще, это не подход. Вместо того, чтобы хорошо разобраться в курсовом проекте, вы ищете простейший путь, который чудом приведет вас к цели. В чем смысл такого обучения ? Не понимаю ...
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 19:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016