Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Вопросы чайника

Страниц (17): [1] 2 3 4 5 6 7 8 9 ... » В конец
 

1. zatmenie - 09 Января, 2010 - 23:56:38 - перейти к сообщению
Всем привет. Вот надумал сделать какого нибудь робота, пока еще не знаю какого, но наткнулся вот на эту http://myrobot.ru/stepbystep/el_...bot_for_line.php статью и задумал использовать в своём роботе. Идея такая: одной ножкой МК с помощью логических элементов "НЕ" управлять мотором. Но что бы я не делал у меня на ножке МК всегда получалось 1 или 0, а что бы мотор не крутился нужно вообще отключить ножку. Вот я и не знаю как это сделать потому что в программировании совсем новичек. Надеюсь мне кто нибудь поможет.
(Добавление)
Ой забыл написать. МК-ATtiny2313, компилятор CVAVR
2. nest - 10 Января, 2010 - 00:44:35 - перейти к сообщению
zatmenie пишет:
одной ножкой МК с помощью логических элементов "НЕ" управлять мотором
ну... давайте либо с помощью МК, либо с помощью лог. элементов : )
zatmenie пишет:
Но что бы я не делал у меня на ножке МК всегда получалось 1 или 0, а что бы мотор не крутился нужно вообще отключить ножку
покажите, какой код использовали.
3. lamakazzz - 10 Января, 2010 - 00:46:00 - перейти к сообщению
Возможно, Вам есть смысл собрать робота без МК (микроконтроллера), а только на драйвере двигателя L293D, почитать и разобраться, как оно работает.

Когда в Вашей программе вы указываете 1 на выходе (ножке) МК, то, соответственно, передается сигнал высокого уровня на драйвер двигателя, в цепи идет ток и мотор крутится. Когда на выходе 0 - сигнал низкого уровня - мотор не крутится.

Для простоты можно представить, что это водопровод: когда подаётся 1 - это равносильно, что Вы открутили кран и идёт вода; когда подаётся 0 - Вы закрутили кран и вода не идёт. Т.е. всего два положения: 0 и 1 (закрыто и открыто). Соответственно, если Вы ставите лог.элемент "НЕ", то моторы будут крутиться, когда установлен "0".

Поправьте, если я что-то напутал.
4. zatmenie - 10 Января, 2010 - 10:50:00 - перейти к сообщению
nest пишет:
покажите, какой код использовали.

так я в генераторе кода менял настройки ножек, а так я не знаю какой код мне нужно сделать.

lamakazzz пишет:
Возможно, Вам есть смысл собрать робота без МК (микроконтроллера), а только на драйвере двигателя L293D, почитать и разобраться, как оно работает.

в принципе я разобрался как все это работает, смоделировал в протеусе.

lamakazzz пишет:
Т.е. всего два положения: 0 и 1 (закрыто и открыто). Соответственно, если Вы ставите лог.элемент "НЕ", то моторы будут крутиться, когда установлен "0".

Да на выходе всего 2 положения, но я читал в какой то книге что у avr 3 положения: вход, выход и отключено. Если ставить лог.элемент то из 0 он делает 1, а из 1 делает 0. Т.е. мотор всегда будет крутится. Вот а мне надо что бы она была отключена, но так что бы программа смогла менять её положение, т.е. сейчас она отключена, датчик сработал она стала 0 и мотор крутится в одну сторону, затем другой датчик сработал она стала 1 и омотор крутится в другую сторону, если ничего не сработало ножка становится отключена и мотор не крутится.
5. nest - 10 Января, 2010 - 12:37:06 - перейти к сообщению
zatmenie, что бы мотор не крутился, нужно:
1) ИЛИ: подавать на входы IN1 и IN2 (L293) одинаковые лог. сигналы, т.е. либо оба "1", либо оба "0".
2) ИЛИ: подавать "0" на вход ENABLE, тогда мотор окажется как бы "отключённым" от L293. В этом случае он будет некоторое время крутиться по инерции (возможно, очень коротко, в зависимости от нагрузки на его валу). Такое отключение произойдёт независимо от сигналов на IN1 или IN2.

Если используется вариант 1 - то мотор будет гарантированно заторможен. Т.к. его выводы будут как бы "замкнуты" через микросхему L293.
При варианте 2 - мотор будет останавливаться сам по инерции. Т.к. его выводы будут электрически никуда не подключены, "висеть в воздухе".

Тут ещё можно провести простой эксперимент: возмите моторчик в руки и крутните пальцами его вал. Заметте как он будет вращаться по инерции. А потом замкните проводком выводы мотора, и крутните вал ещё раз...

Но в любом случае вам требуется задействовать минимум две ноги микроконтроллера.

Логический элемент у вас в схеме, zatmenie, вообще то не нужен. Подавайте на IN1 и IN2 прямо с двух ножек микроконтроллера. И управляйте ими програмно как вам хочется.
По-мне лучше всё соединить так: IN1 - PB0, IN2 - PB1 , ENABLE - PB2. В таком варианте управление мотора будет наиболее гибким. Даже ШИМ можно будет потом использовать и регулировать скорость вращения мотора програмно.

zatmenie пишет:
я в генераторе кода менял настройки ножек, а так я не знаю какой код мне нужно сделать.
вот и покажите код, который есть.
6. zatmenie - 10 Января, 2010 - 13:46:13 - перейти к сообщению
nest пишет:
вот и покажите код, который есть.

/*****************************************************
Project :
Version :
Date : 09.01.2010
Author : Valera
Company : Home
Comments:


Chip type : ATtiny2313
Clock frequency : 4.000000 MHz
Memory model : Tiny
External SRAM size : 0
Data Stack size : 32
*****************************************************/

#include <tiny2313.h>

#include <delay.h>

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func2=In Func1=In Func0=In
// State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTB=0x00;
DDRB=0x01;

// Port D initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

while (1)
{
PORTB.0=~PIND.0;

};
}


А разве нельзя программно сделать что бы ножка МК "висела в воздухе"? Просто я задумал сделать с лог.элементами для экономии ножек (что бы на tiny13(25) можно было сделать более менее сложного робота, и для освоения электроники и программировании.
(Добавление)
Насчет моторчика: замкнул контакты между собой и почти не крутится по инерции.
7. nest - 10 Января, 2010 - 14:08:13 - перейти к сообщению
zatmenie пишет:
разве нельзя программно сделать что бы ножка МК "висела в воздухе"?
можно. нужно её включить как Input.
а для чего это вам ? повесить в воздухе ножку вам ничего не даст, т.к. драйвер двигателя L293 управляется "1" или "0", и никак больше. Прочитайте ещё раз, какие варианты "отключения"/останова мотора я описал.

Почему вам хочется именно на "малоногом" МК собрать робота ?
С точки зрения программинга - малое количество ног не имеет никаких достоинств. Зато значительно повышает требования к хитрым схематическим решениям. Да и дополнительный корпус микросхемы логики повышает потребление схемы и вероятность ошибок.
Тини2313 (20 ног, 8+7 из них свободно конфигурируемы) - наиболее оптимальный вариант для более-менее простого робота. Можно взять Мега8.
Если вас привлекает лишь малый размер корпуса - то можно взять многоногий и в SMD варианте. Но паять будет немного сложнее.
8. zatmenie - 10 Января, 2010 - 16:03:02 - перейти к сообщению
nest пишет:
можно. нужно её включить как Input.
а для чего это вам ? повесить в воздухе ножку вам ничего не даст, т.к. драйвер двигателя L293 управляется "1" или "0", и никак больше. Прочитайте ещё раз, какие варианты "отключения"/останова мотора я описал.

В том то и дело если я повешу ножку в воздухе - значит она будет и не 0 и не 1, а это значит мотор работать не будет. потом программа меняет её на 0 или 1 и мотор крутится туда или сюда! Вот в этом весь прикол, что бы одной ножкой управлял мотором через логические элементы.
nest пишет:
Почему вам хочется именно на "малоногом" МК собрать робота ?

Потому что мне так интересней.
nest пишет:
Зато значительно повышает требования к хитрым схематическим решениям.

мне это как таз и нужно!
nest пишет:
Если вас привлекает лишь малый размер корпуса - то можно взять многоногий и в SMD варианте. Но паять будет немного сложнее.

Дело не в размере.


А как программно ножку менять из OUTPUT в INPUT?
9. zatmenie - 10 Января, 2010 - 16:14:15 - перейти к сообщению
Щас попробовал в протеусе подключить лог.элемент ко входу. Сконфигурировал ПД1 с подтягивающим резистором и без него, но в обоих случаях мотор работает.
10. nest - 10 Января, 2010 - 16:46:32 - перейти к сообщению
zatmenie пишет:
как программно ножку менять из OUTPUT в INPUT?
почитать в даташите раздел про регистры DDRx или ещё где вам понятнее.

хм...
можно сделать так как вы хотите, но это как то ... некрасиво всё, когда есть микроконтроллер.

Поищите информацию про "диодное-ИЛИ" и "диодное-И". Есть такие схемы для сборки логических функций.

А потом давайте так: Покажите мне, как бы вы построили "диодное-И" и покажите в протеусе как это работает (картинкой). Тогда я покажу вам как сделать вашу схему : )
11. zatmenie - 10 Января, 2010 - 20:11:58 - перейти к сообщению
nest пишет:
Поищите информацию про "диодное-ИЛИ" и "диодное-И". Есть такие схемы для сборки логических функций.

Диодное И/ИЛИ это диодно-транзисторная логика верно?
12. zatmenie - 10 Января, 2010 - 20:43:51 - перейти к сообщению
Чето ничего не могу найти про диодно-транзисторную логику кроме этой картинки
13. nest - 10 Января, 2010 - 20:53:27 - перейти к сообщению
zatmenie, подойдёт. Просимулируйте это в протеусе. Или в реальной схеме.
14. lamakazzz - 10 Января, 2010 - 20:58:17 - перейти к сообщению
Можете обратить внимание на
http://window.edu.ru/window_cata...68&p_page=13 - тут в виде html, а PDF версию смотрите выше, либо

http://window.edu.ru/window_cata...file=stup081.pdf
15. zatmenie - 10 Января, 2010 - 21:18:45 - перейти к сообщению
nest пишет:
подойдёт. Просимулируйте это в протеусе. Или в реальной схеме.

А какие детали для протеуса?