|
|
  |
Аппаратный ШИМ на ATtiny2313, А также несколько вопросов относительно него |
|
|
|
Mar 8 2011, 14:44
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 5-03-11
Пользователь №: 63 417

|
Код #define F_CPU 8000000UL // указываем частоту в герцах #include <avr/io.h> #include <util/delay.h>
int main(void) // начало основной программы { while (1) { // Бесконечный цикл
// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ ФОТОДАТЧИКА
if (!(PIND & _BV(PD1))) // проверить "0" на линии 1 порта D { TCCR1A = (1<<COM1B1) | (1<<WGM10); TCCR1B = (1<<WGM12) | (1<<CS10); OCR1B = 100; DDRB |= (1<<PB4); } else { TCCR1A = (1<<COM1A1) | (1<<WGM10); TCCR1B = (1<<WGM12) | (1<<CS10); OCR1A = 100; DDRB |= (1<<PB3); } }
} http://myrobot.ru/stepbystep/r_firstbot2.php - делаю на основе этой статьи
Сообщение отредактировал bfrogg - Mar 8 2011, 14:45
|
|
|
|
|
Mar 9 2011, 09:46
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Это уже детали, смысл моего сообщения был в том, что если в начале программы сработало одно условие, и включился один двигатель, то робот начнёт двигаться по кругу. Пусть в некий момент наступит другое условие, включится второй двигатель, но первый-то не выключится. И второй тоже, несмотря на смену условий. Вместо того, чтобы следить за линией робот поедет куда глаза глядят...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Mar 11 2011, 21:51
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 5-03-11
Пользователь №: 63 417

|
Код /**************************************************************** ПРИМЕР 4 :: ПРОСТЕЙШИЙ АЛГОРИТМ СЛЕДОВАНИЯ ПО ЛИНИИ :: MYROBOT.RU *****************************************************************/
#include <avr/io.h>
int main(void) // начало основной программы { DDRB = 0xff; // все выводы порта B сконфигурировать как выходы DDRD = 0x00; // все выводы порта D сконфигурировать как входы
PORTD = 0xff; // установить "1" на всех выводах порта D, // включаем подтягивающие резисторы
while (1) { // Бесконечный цикл
// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ ФОТОДАТЧИКА
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D { // ---- включаем левый мотор, останавливаем правый -----
TCCR1A = (1<<COM1B1) | (1<<WGM10); TCCR1B = (1<<WGM12) | (1<<CS10); OCR1B = 100; DDRB |= (1<<PB4); DDRB |= (0<<PB3);
// ----------------------------------------------------- } else { // ---- останавливаем левый мотор, включаем правый -----
TCCR1A = (1<<COM1A1) | (1<<WGM10); TCCR1B = (1<<WGM12) | (1<<CS10); OCR1A = 100; DDRB |= (1<<PB3); DDRB |= (0<<PB4);
// ----------------------------------------------------- }
} // закрывающая скобка бесконечного цикла
} // закрывающая скобка основной программы Вроде работает, однако есть 2 проблемы 1: алгоритм срабатывает, если я проводком ведущим к PD1 тыкаю на минус. Фотодатчики как то не управляют работой) 2: с момента начала робот работает нестабильно: сначала крутится одно колесо, когда условие выполняется, после того как проводком на минус тыкнул, МК как будто сходит с ума и условие работает наоборот
|
|
|
|
|
Mar 12 2011, 02:48
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(bfrogg @ Mar 12 2011, 05:51)  ... 2: с момента начала робот работает нестабильно: сначала крутится одно колесо, когда условие выполняется, после того как проводком на минус тыкнул, МК как будто сходит с ума и условие работает наоборот Как можно узнать куда поворачивать, если сигнал с фотоэлемента только один? Куда отклонилась машина, влево или вправо, если пропал сигнал? Что бы следить за линией, нужно минимум 2 аналоговых фотоэлемента, один слева, другой справа. Расположить их так, чтобы каждый видел 50% ширины линии. Сигнал с фотоэлементов снимать аналоговый, к двигателям сигнал управления подавать пропорционально освещённости датчиков крест-накрест, т.е. чем ярче видит линию левый датчик, тем быстрее крутить правым двигателем. Другой вариант - поставить 3 логических фотоэлемента (да/нет, есть линия/нет линии), один в центре, два по бокам от него. Если едем ровно - сигнал есть только на центральном датчике. ушли в сторону - сигнал появится на боковом датчике и далее может совсем пропасть. Запомнив, в какую сторону сбилась машина, управляем двигателями, что бы вернуть её на линию.
|
|
|
|
|
Mar 12 2011, 07:10
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 5-03-11
Пользователь №: 63 417

|
Цитата(ae_ @ Mar 12 2011, 05:48)  ... http://myrobot.ru/stepbystep/el_simple_robot_for_line.php
Сообщение отредактировал IgorKossak - Mar 12 2011, 08:34
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Mar 12 2011, 18:21
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 17-08-07
Пользователь №: 29 855

|
Цитата алгоритм срабатывает, если я проводком ведущим к PD1 тыкаю на минус. Фотодатчики как то не управляют работой) Возьмите вольтметр и померяйте напряжение на PIND,1 в момент, когда фотодатчик над полосой и когда в стороне от полосы и увидите, проблема в датчике или программе. Цитата с момента начала робот работает нестабильно: сначала крутится одно колесо, когда условие выполняется, после того как проводком на минус тыкнул, МК как будто сходит с ума и условие работает наоборот А разве присваивание 0 биту не так пишется: DDRB &= (0<<PB4); Цитата Что бы следить за линией, нужно минимум 2 аналоговых фотоэлемента, один слева, другой справа. Это просто детская игрушка, Вы еще видеокамеру предложите поставить, с распознованием образов, чтоб хозяина узнавал и за ним ездил
|
|
|
|
|
Mar 12 2011, 19:15
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(bfrogg @ Mar 12 2011, 15:10)  Если управлять роботом по такому алгоритму:  то МК легко может "сойти с ума" при очередном манёвре, если робот проедет чуть дальше в сторону линии и пересечёт её уже с обратной стороны. В этом случае условия движения поменяются на обратные. Предлагаю реализовать такой алгоритм движения:
|
|
|
|
|
Mar 13 2011, 06:22
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 5-03-11
Пользователь №: 63 417

|
ae, спасибо за идею! Цитата(314 @ Mar 12 2011, 21:21)  А разве присваивание 0 биту не так пишется: DDRB &= (0<<PB4); Один из вариантов написания, присваивание работает
|
|
|
|
|
Mar 13 2011, 09:58
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(314 @ Mar 12 2011, 21:21)  А разве присваивание 0 биту не так пишется: DDRB &= (0<<PB4); Нет. Вот так правильно: Код DDRB &= ~(1<<PB4);
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 13 2011, 10:10
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 17-08-07
Пользователь №: 29 855

|
Цитата Нет. Вот так правильно: Ну пусть так (все равно sbi-cbi предпочитаю), а в варианте ТС работать-то будет?
Сообщение отредактировал 314 - Mar 13 2011, 10:11
|
|
|
|
|
Mar 20 2011, 20:19
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 5-03-11
Пользователь №: 63 417

|
Проблема в программе. В моей схеме МК работает на удивление нестабильно. Банальная программа по вращению моторами туда сюда без каких либо датчиков работает ужасно (то есть один мотор вращается от 4 до 10 секунд, потом другой вращается сколько хочет, когда оба должны поочередно работать 1 секунду). В схему поставил стабилизатор напряжения на 5 вольт. Питание 6 вольт. Может мне воспользоваться каким нибудь из этих советов? http://myrobot.ru/articles/mc_stab.phpВообще схема без МК спаяна без ошибок - все проверил тестером, двигатели вращаются когда надо (L293D не подводит) Еще ламерский вопрос. МК может испортиться от питани 6 вольт напрямую?
Сообщение отредактировал bfrogg - Mar 20 2011, 20:23
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|