Перейти к содержанию

Рекомендуемые сообщения

Доброго времени суток.

Сделал механику хочу попробовать на AVR сделать STEP DIR 3х осевой.В режиме полушага.Теорию знаю читал.Програму начал писать но уже в начале столкнулся с проблемой:

Когда нужно крутить в другую сторону то иногда шаговик делает слишком крутой оборот вперёд и начинает работать нормально либо шаг назад и тоже потом нормально.

Я знаю что проблема точно с тем кодом что я написал.Очень прошу помочь исправить.Может я масив не так использую.?Хотел уже паять и тут на тебе)Всё тестирую в протеусе.

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date    : 22.10.2012
Author  :
Company :
Comments:

Chip type			   : ATmega8
Program type		    : Application
AVR Core Clock frequency: 4,000000 MHz
Memory model		    : Small
External RAM size	   : 0
Data Stack size		 : 256
*****************************************************/
#include <mega8.h>
   #include <delay.h>
// Declare your global variables here
unsigned char step=0;		   //Переменная крутящая масив
 unsigned char Data[8] = {0b00001000,0b00001100,0b00000100,0b00000110,0b00000010,0b00000011,0b00000001,0b00001001};// Масив для полушага в одну сторону
 unsigned char Datal[8] ={0b00001001,0b00000001,0b00000011,0b00000010,0b00000110,0b00000100,0b00001100,0b00001000};// в другую сторону
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTC=0x00;
DDRC=0x0F;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 0,977 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Inverted PWM
ASSR=0x00;			   //Это для будущего буду через Шим подавать на драйвер +
TCCR2=0x7F;
TCNT2=0x00;
OCR2=0x01;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// USART disabled
UCSRB=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC disabled
ADCSRA=0x00;
// SPI initialization
// SPI disabled
SPCR=0x00;
// TWI initialization
// TWI disabled
TWCR=0x00;
step=0;	
while (1)
   {

   if(PINB.0==0) {			 //	 Если на Дир 0

  if (PINB.1==1)			   //	 то крутим в одну сторону Если на STEP есть импульсы.
  PORTC=Data[step]; 
  step++;

  if (step >= 8)				 //   Проверка конца Масива
  step=0;   }

  else {						   //   Тут всё так же только использую другой масив для вращения обратно переменная step для вперёд и назад одна и таже
  if (PINB.1==1)
  PORTC=Datal[step]; 
  step++;

  if (step >= 8)				   //   Всё предельно просто.
  step=0;
  }
    PORTB.4=1;	   //   это чисто для себя чтоб давать сигнал на степ.Проверять.
    delay_ms(50);
    PORTB.4=0;
    delay_ms(50);
  }		  
}

Всё предельно просто и понимаю в чем проблема но не знаю как эту мелочь решить.Что то не так я делаю с масивом

Очень жду вразумительных ответов.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

В вашем коде походу step независимо от импульса приращивается:

	 if (PINB.1==1)						 // то крутим в одну сторону Если на STEP есть импульсы.
	 PORTC=Data[step];
	 step++;

Насколько я вижу - тут step++ отдельно от условия PINB.1==1, а в само условие входит только PORTC=, т.к. фигурных скобок не наблюдается. Получается, что step постоянно приращивается со скоростью главного цикла независимо от того, есть ли что на первом пине B или нет.

Можно проще сделать.

Попробуйте так:

if (PINB.1==1){	 //Есть импульс на STEP
PORTC=Data[step]; //Передача на двигатель

if (PINB.0==0){
//Если вращение --> , то увеличиваем степ, проверяем на конец массива
step++;
if (step==8) step=0;
}else{
//Если вращение <--, то уменьшаем степ, проверяем на начало массива
step--;
if (step<0) step=7;
}
}

Условие step<0 годится для знакового типа (signed char), у Вас выставлен беззнаковый тип (unsigned char) - в этом случае условие наверно будет так: step==255 (при вычитании из нуля унсигнед вроде как продолжает считать от максимально возможного для unsigned char - 255)

* второй массив для этого кода не нужен - он бегает вперед/назад по одному и тому же массиву.

Дополнение:

Я так понял, Вы 4 ножку соединяете с 1, чтобы подать импульсы потоворота? Если вращение происходит одиночными импульсами в алгоритме нужно не просто проверять на единичку, прежде чем шагать, а пасти смену с 0 на 1, иначе может сумбур получится (например срабатывание нескольких шагов в течение одного импульса шага, если цикл не будет специально заторможен), особенно если импульсы будут подаваться не из главного цикла, а откуда то извне.

*Хотя непонятно, импульс на PINB.4 появляется и сбрасывается в конце главного цикла, а значит если он соединен с входом 1, то там всегда будет 0. Путаница....

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

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Спасибо.Сделал до того как вы ответили вот так

//ОСЬ X
 if(PINB.0==0) {			 //	 Если на Дир 0

 if (PINB.1==1)			 //	 то крутим в одну сторону Если на STEP есть импульсы.
 PORTC=Data[stepx];
 stepx++;

 if (stepx >= 7)				 // Проверка конца Масива
 stepx=0; }//скобка закрывает if цикл

 else {						 // Тут всё так же только использую другой масив для вращения обратно переменная step для вперёд и назад одна и таже
 if (PINB.1==1)
 PORTC=Data[stepx];
 stepx--;

 if (stepx <= 0)				 //
 stepx=7;
 }

И заработало как нужно.А вот по поводу того что пасти переход это заставило задуматься,вы правы.Только как это сделать?

И еще один вопрос очень сейчас важный.Мне нужно 3 оси сделать из этого кода.-Как на один порт выдать не зависимые сигналы для 2х драйверов...?Тоесть портд0123одна ось

портд4567 вторая ось.?Схема у меня не красивая так как набрасал для себя ради теста:

Изменено пользователем HOT ICE
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Ожидать перепад очень просто:

while (PINB.1==1){
//Если импульс еще установлен, ждем его спада - страховка от многократного шагания в течение одного степ-импульса.
}
while (PINB.2==0){
//Теперь непосредственно ждем степ-импульса - крутим пустой цикл, пока на пине ничего нет.
}

//Вот тут уже можно определять направление, делать шажок.
...

Поэтому сначала лучше наличие степ-импульса проверять, а потом уже направление - удобнее же. Другой вариант - сделать на прерываниях - в случае с использованием прерываний не будет необходимости "подвешивать" главный цикл в ожидании фронта степ-импульса. Только АВРами не занимаюсь, а потому не знаю, как конкретно там устроены прерывания.

======================================

По поводу управления двумя моторами через один порт - нужно выполнить пару нехитрых операций. Если один мотор подключен в 4 младших бита, а второй в 4 старших , то получается так:

Дано - step_x, step_y - "фазы" моторов X и Y

PORTC=data[step_x]*16+data[step_y];

При условии что мотор X подключен к RC4-RC7, а мотор Y к RC0-RC3. Умножением кода data[step_x] на 16 добиваемся, чтобы он сместился без искажений в старшие четыре бита, а потом простым сложением заполняем и младшую часть.

Для примера:

data[step_x]=1001 (9 в десятичной)

data[step_y]=0010 (2 в десятичной)

считаем: 9*16 + 2 =144 + 2 = 146 (10010010) - получился нужный код.

Дополнение: на схеме ничего не разобрать толком, разрешение маловато.

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

Спасибо за поддержку.Пробую что-то получается.В случае не поняток буду писать.Очень захотелось просто сделать очень простой не супер крутой контролер для тех кто себя мучает в создании ЧПУ=)как я.Дать полный код и схему чтоб было легко повторять.

Ссылка на комментарий
Поделиться на другие сайты

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

У Для других 2х осей тоже могуть приходить импульсы которые попросту при такой системе будут не замечены.Я прав?

Ссылка на комментарий
Поделиться на другие сайты

У меня там опечатка в коде, оба цикла while должны один пин проверять... Чета я два разных написал, 5 утра всё же было... :).

Схема с WHILE годится только в том случае, если один степ-импульс синхронно управляет всеми осями, а чтобы разделить управление моторами по одному импульсу, нужно сделать так, чтобы только нужные моторы реагировали на общий импульс (несколько условий).

Чтобы сделать раздельные импульсы с надёжным отслеживанием перепада, нужно использовать или прерывания, которые возникают именно по перепаду одной из нескольких линий (в пике это есть, значит и в авр наверно тоже), или придумать рядовой алгоритм, учитывающий все три импульса - но тут надо подумать.

И такой вопрос - Вы делаете что-то вроде контроллера нескольких шаговых двигателей на авр, а управляющее устройство где то отдельно, или планируете, что сам АВР будет реализовывать все необходимые движения в соответствии с заданной программой?

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

Решил кароче не париться куплю три меги 48.и сделаю на 3х разных контролерах по прерыванию=)В этом есть и свои плюсы.Будет быстро реагировать.

MACH3 будет управлять им через LPT

Ссылка на комментарий
Поделиться на другие сайты

ВАУ=)

Ну у меня гараздо меньше.

Кул я теперь еще больше хочу его запускать.Буду всю ночь печатки делать=)Если с прогой сложится

Ссылка на комментарий
Поделиться на другие сайты

начитался...Я очень не хочу заморачиваться с измерением тока фаз и т.д.

Можно сделать так:?

Если более 2х сек нет сигнала на степ то я подаю 50% ШИМ на ULN2803 через ключ.А когда сигнал есть то 100 %ШИМ. ПРОСТО НА ОБЩИЙ ПРОВОД.

Так будет работать?

Вообще планирую купить Китайский красный контролер.А на AVR делаю ради того чтоб быстрей начать гравировать.Пока нет финансов на китай. Да и с Китая месяц ждать нужно)

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Сделал на AVR в полушаге.

Через ULN2803

2 мотора от сидюшников 5,25 и один от принтера.

Но это ппц мощи просто 0.малейшее прикосновение к оси и он тормозит((( Питание от БП компа.програма МАЧ3.Что сделать?

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Добавить стабилизатор тока (ШИМ или линейный). Питание хотя бы 12-15В. Ток стабилизатора должен быть равен току двигателя номинальному. Или временно запитать через лампочку на ток равный току номинальному (например автомобильную).

Все можно наладить, если вертеть в руках достаточно долго!

Если ничто другое не помогает, прочтите, наконец, инструкцию!

Ссылка на комментарий
Поделиться на другие сайты

Еще вопрос появился.Чтоб новую тему не создавать.

переделал БП от компа.Но только поменял конденсаторы на мощнее.ну и по первой ноге поставил переменник.И всё.Всё работает.но вот вопрос)Это опасно или так можно оставить?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...