Подскажите по элетронике

Контроллеры, драйверы, датчики, управляющие устройства.
shurikss123
Новичок
Сообщения: 24
Зарегистрирован: 06 апр 2011, 19:29
Репутация: 0
Контактная информация:

Re: Подскажите по элетронике

Сообщение shurikss123 »

а четвертая ось для каких целей нужна, добавлять ее или не стоит. почти заканчиваю
2cme
Почётный участник
Почётный участник
Сообщения: 1043
Зарегистрирован: 24 янв 2012, 13:18
Репутация: -209

Re: Подскажите по элетронике

Сообщение 2cme »

shurikss123 писал(а):а четвертая ось для каких целей нужна, добавлять ее или не стоит. почти заканчиваю
фото чего получилось то?
shurikss123
Новичок
Сообщения: 24
Зарегистрирован: 06 апр 2011, 19:29
Репутация: 0
Контактная информация:

Re: Подскажите по элетронике

Сообщение shurikss123 »

Там по проводам пока не понятно, вид ужасает, но исходник такой

Код: Выделить всё

/*
 * main.c
 *
 *  Created on: 24.09.2012
 *      Author: shurik
 */
#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define a 0b1000
#define b 0b0100
#define c 0b0010
#define d 0b0001
#define z 0b0000

volatile uint8_t Control_Port = 0;

volatile int stepX = 0;
volatile int dirX = 0;
volatile int posX = 0;
volatile int stepY = 0;
volatile int dirY = 0;
volatile int posY = 0;
volatile int stepZ = 0;
volatile int dirZ = 0;
volatile int posZ = 0;

volatile int operation = 0;

volatile uint8_t Xcount[] =
{ a, b, c, d, z };
volatile uint8_t Ycount[] =
{ a, b, c, d, z };
volatile uint8_t Zcount[] =
{ a, b, c, d, z };

int main()
{
	PORTA = 0xff;
	while (1)
	{
		Control_Port = PINA;
		// control start
		// X
		switch (!(Control_Port & (1 << PIN0)))
		{
			case 1:
			{
				dirX = 1;
				break;
			}
			case 0:
			{
				dirX = 0;
				break;
			}
			default:
				break;
		}

		switch (!(Control_Port & (1 << PIN1)))
		{
			case 1:
			{
				if (stepX == 0)
				{
					stepX = 1;
				}
				break;
			}
			case 0:
			{
				if (stepX == 1)
				{
					stepX = 2;
				}
				break;
			}
			default:
				break;
		}
		// Y
		switch (!(Control_Port & (1 << PIN2)))
		{
			case 1:
			{
				dirY = 1;
				break;
			}
			case 0:
			{
				dirY = 0;
				break;
			}
			default:
				break;
		}

		switch (!(Control_Port & (1 << PIN3)))
		{
			case 1:
			{
				if (stepY == 0)
				{
					stepY = 1;
				}
				break;
			}
			case 0:
			{
				if (stepY == 1)
				{
					stepY = 2;
				}
				break;
			}
			default:
				break;
		}
		// Z
		switch (!(Control_Port & (1 << PIN4)))
		{
			case 1:
			{
				dirZ = 1;
				break;
			}
			case 0:
			{
				dirZ = 2;
				break;
			}
			default:
				break;
		}

		switch (!(Control_Port & (1 << PIN5)))
		{
			case 1:
			{
				if (stepZ == 0)
				{
					stepZ = 1;
				}
				break;
			}
			case 0:
			{
				if (stepZ == 1)
				{
					stepZ = 2;
				}
				break;
			}
			default:
				break;
		}

		//X
		if (stepX == 2)
		{
			if (dirX == 1)
			{
				if (posX < 3)
				{
					posX++;
				}
				else
				{
					posX = 0;
				}
			}
			else
			{
				if (posX > 0)
				{
					posX--;
				}
				else
				{
					posX = 3;
				}
			}
			operation = 1;
			stepX = 0;
		}

		//Y
		if (stepY == 2)
		{
			if (dirY == 1)
			{
				if (posY < 3)
				{
					posY++;
				}
				else
				{
					posY = 0;
				}
			}
			else
			{
				if (posY > 0)
				{
					posY--;
				}
				else
				{
					posY = 3;
				}
			}
			operation = 1;
			stepY = 0;
		}

		//Z
		if (stepZ == 2)
		{
			if (dirZ == 1)
			{
				if (posZ < 3)
				{
					posZ++;
				}
				else
				{
					posZ = 0;
				}
			}
			else
			{
				if (posZ > 0)
				{
					posZ--;
				}
				else
				{
					posZ = 3;
				}
			}

			operation = 1;
			stepZ = 0;
		}

		if (operation == 1)
		{
			DDRD = (Xcount[posX]) | (Ycount[posY] << 4);
			DDRC = Zcount[posZ];
			operation = 0;
			_delay_ms(20); //тут можно откалибровать под двигатель
		}

		else
		{
			DDRD = (Xcount[4]) | (Ycount[4] << 4);
			DDRC = Zcount[4];
		}

	}

}
Можно еще добить и пульт с дисплеем, приделать сюда
Аватара пользователя
wldev
Мастер
Сообщения: 1647
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: Подскажите по элетронике

Сообщение wldev »

shurikss123 писал(а):Там по проводам пока не понятно, вид ужасает, но исходник такой
Это исходник чего?
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
shurikss123
Новичок
Сообщения: 24
Зарегистрирован: 06 апр 2011, 19:29
Репутация: 0
Контактная информация:

Re: Подскажите по элетронике

Сообщение shurikss123 »

Bender писал(а):
shurikss123 писал(а):Там по проводам пока не понятно, вид ужасает, но исходник такой
Это исходник чего?
контроллера (atmega16)
Аватара пользователя
wldev
Мастер
Сообщения: 1647
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: Подскажите по элетронике

Сообщение wldev »

Тяжко читать ваш исходник...((
Оч. много лишних "{ }"

Код: Выделить всё

*
 * main.c
 *
 *  Created on: 24.09.2012
 *      Author: shurik
 */
#define F_CPU 8000000UL

#include <avr/io.h>
#include <avr/iom16.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define a 0b1000
#define b 0b0100
#define c 0b0010
#define d 0b0001
#define z 0b0000

volatile uint8_t Control_Port = 0;

volatile int stepX = 0;
volatile int dirX = 0;
volatile int posX = 0;
volatile int stepY = 0;
volatile int dirY = 0;
volatile int posY = 0;
volatile int stepZ = 0;
volatile int dirZ = 0;
volatile int posZ = 0;

volatile int operation = 0;

volatile uint8_t Xcount[] =
{ a, b, c, d, z };
volatile uint8_t Ycount[] =
{ a, b, c, d, z };
volatile uint8_t Zcount[] =
{ a, b, c, d, z };



int main()
{
   PORTA = 0xff;
   while (1)
   {
      Control_Port = PINA;
      // control start
      // X
      dirX=!(Control_Port & (1 << PIN0)))
      
      switch (!(Control_Port & (1 << PIN1)))
       {
       case 1: if (stepX == 0) stepX = 1;  break;
	   case 0: if (stepX == 1) stepX = 2;  break;
      }
      // Y
      dirY=!(Control_Port & (1 << PIN2)))
      
      switch (!(Control_Port & (1 << PIN3)))
       {
        case 1: if (stepY == 0) stepY = 1; break;
        case 0: if (stepY == 1) stepY = 2; break;
       }
      // Z
      dirZ=!(Control_Port & (1 << PIN4)))
      
      switch (!(Control_Port & (1 << PIN5)))
       {
         case 1: if (stepZ == 0) stepZ = 1;break;
         case 0: if (stepZ == 1) stepZ = 2;break;
       }

      //X
      if (stepX == 2)
      {
         if (dirX == 1)
           if (posX < 3) posX++;  else posX = 0;
         else
           if (posX > 0) posX--;  else posX = 3;
         
         operation = 1;
         stepX = 0;
      }

      //Y
      if (stepY == 2)
      {
         if (dirY == 1)
           if (posY < 3) posY++; else posY = 0;
         else
           if (posY > 0) posY--; else posY = 3;
         operation = 1;
         stepY = 0;
      }

      //Z
      if (stepZ == 2)
      {
         if (dirZ == 1)
            if (posZ < 3) posZ++; else posZ = 0;
         else
            if (posZ > 0) posZ--; else posZ = 3;

         operation = 1;
         stepZ = 0;
      }

      if (operation == 1)
      {
         DDRD = (Xcount[posX]) | (Ycount[posY] << 4);
         DDRC = Zcount[posZ];
         operation = 0;
         _delay_ms(20); //тут можно откалибровать под двигатель
      }

      else
      {
         DDRD = (Xcount[4]) | (Ycount[4] << 4);
         DDRC = Zcount[4];
      }

   }

}
Так вы просто по нажатию кнопки делаете шаг? И считаете его?
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
shurikss123
Новичок
Сообщения: 24
Зарегистрирован: 06 апр 2011, 19:29
Репутация: 0
Контактная информация:

Re: Подскажите по элетронике

Сообщение shurikss123 »

Bender писал(а):Тяжко читать ваш исходник...((
А мне наоборот удобней и ясней.
Bender писал(а):Оч. много лишних "{ }"
Бросается в глаза. да.
Bender писал(а):Так вы просто по нажатию кнопки делаете шаг? И считаете его?
Почему кнопки? я не считаю, шаги он их делает в зависимости от направления и сигнала степ.
Аватара пользователя
wldev
Мастер
Сообщения: 1647
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

Re: Подскажите по элетронике

Сообщение wldev »

shurikss123 писал(а):Почему кнопки? я не считаю, шаги он их делает в зависимости от направления и сигнала степ.
Это оч. просто...
Сделайте разгон и торможение + переходы с торможения на разгон.
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Подскажите по элетронике

Сообщение Nick »

Насколько я понял это простой контроллер для управления микродрайверами шаговых двигателей, который выдает драйверам задание в виде такой обмотке такой ток.

Кстати, продумай микрошаговый режим - с ним будет интереснее.
shurikss123
Новичок
Сообщения: 24
Зарегистрирован: 06 апр 2011, 19:29
Репутация: 0
Контактная информация:

Re: Подскажите по элетронике

Сообщение shurikss123 »

Ну если вы мне опишите то что вам требуется могу и сделать, 4-й день мебель в свою комнату собираю по этому немного не до этого, кстати хочу сделать при запуске контроллера, чтоб он делал 10 шагов + после 5 шагов назад, чтоб соответствовала двигателя и контроллера
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Подскажите по элетронике

Сообщение Nick »

shurikss123 писал(а):чтоб он делал 10 шагов + после 5 шагов назад, чтоб соответствовала двигателя и контроллера
Чего делал?
shurikss123
Новичок
Сообщения: 24
Зарегистрирован: 06 апр 2011, 19:29
Репутация: 0
Контактная информация:

Re: Подскажите по элетронике

Сообщение shurikss123 »

Nick писал(а):Чего делал?
чтоб первый шаг соответствовал позиции двигателя.
2cme
Почётный участник
Почётный участник
Сообщения: 1043
Зарегистрирован: 24 янв 2012, 13:18
Репутация: -209

Re: Подскажите по элетронике

Сообщение 2cme »

В железе (hardware) что-то воплотилось? Прошивку (firmware) для авр отладили?

p.s.
МК целесобразно применять если реализовывать фичи, или в какойто степени рагрузить комп, а также если подключать к USB. Иначе овчинка выделки не стоить.
Последний раз редактировалось 2cme 01 окт 2012, 19:33, всего редактировалось 1 раз.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Подскажите по элетронике

Сообщение Nick »

shurikss123 писал(а):чтоб первый шаг соответствовал позиции двигателя.
А это имхо не так важно, все равно, при любом перемещении произойдет тоже самое.
shurikss123
Новичок
Сообщения: 24
Зарегистрирован: 06 апр 2011, 19:29
Репутация: 0
Контактная информация:

Re: Подскажите по элетронике

Сообщение shurikss123 »

2cme писал(а):В железе (hardware) что-то воплотилось? Прошивку (firmware) для авр отладили?.
не до конца нет нормального кабеля(LPT), так что тока один двигатель тестил, вроде работает как надо,будем тестить в конце недели.
2cme
Почётный участник
Почётный участник
Сообщения: 1043
Зарегистрирован: 24 янв 2012, 13:18
Репутация: -209

Re: Подскажите по элетронике

Сообщение 2cme »

shurikss123 писал(а):будем тестить в конце недели.
???
Аватара пользователя
Rafiq
Мастер
Сообщения: 1053
Зарегистрирован: 28 сен 2012, 18:11
Репутация: 6
Откуда: Tatarstan Respublikası, Yar Çallı şəhəre
Контактная информация:

Re: Подскажите по элетронике

Сообщение Rafiq »

Тоже интересует этот вопрос. Оно конечно можно на AVR реализовать шаг и полушаг, даже аппноты есть на Атмеле, но подойдет ли это для станка? Обязательно ли для станка микрошаг? Не будет ли заметной "лесенки" на диагональных линиях в режиме шага и полушага? Ведь даже дешевые драйверы на TB6560 юзают микрошаг.

Да и дешевле наверное взять упомянутую TB6560 (всего ~$3 на Ибэе, урвал сейчас на аукционе одну за $2.26, сильно удивился, почему не могу взять три, ведь в Buy It Now можно указать количество, а когда аукцион выигрываешь, почему то нет), ведь для МК придется либо городить мосты на дискретных транзисторах, либо подвешивать к нему специализированную микросхему.

Да, еще момент, shurikss123, перед тем как цеплять к компу, комп должен быть опторазвязан от станка быстрыми оптронами, например 6N137. Иначе будут помехи, и даже могут возникнуть зрелищные пиротехнические эффекты.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Подскажите по элетронике

Сообщение Nick »

Rafiq писал(а):Не будет ли заметной "лесенки"
Лесенки не будет, насколько я понимаю микрошаг в основном делают для более плавной работы двигателей.
2cme
Почётный участник
Почётный участник
Сообщения: 1043
Зарегистрирован: 24 янв 2012, 13:18
Репутация: -209

Re: Подскажите по элетронике

Сообщение 2cme »

Nick писал(а):Лесенки не будет, насколько я понимаю микрошаг в основном делают для более плавной работы двигателей.
Если я не ошибаюсь: Микрошаг делают для того чтобы получить большую разрешающую способность, избавится от резонанса и т.д.
Недостаток микрошага: уменьшается крутящий момент.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5182
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Подскажите по элетронике

Сообщение Serg »

Микрошаг не увеличивает разрешающую способность т.к. не гарантируется, что например в режиме полушага ротор можно спозиционировать точно посередине между полными шагами. И чем мельче микрошаг (больше цифра) тем больше будут отклонения от теоретического положения.
Но за счёт микрошага апроксимация получается более плавная.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

Вернуться в «Электроника»