Контроллер одной оси на Atmega328

схемы на микро контроллерах

Модераторы: Ruz_and, Master-VRI, al-drw

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Контроллер одной оси на Atmega328

Сообщение okhtursky » Пн мар 04, 2013 18:57

Собрал изначально станок 3 оси контроллер на 555тм7 все работает, теперь следующий шаг думаю собрать step/dir контроллеры думаю так проще и надежнее чем один на три оси.

Далее код прошивки. Посмотрите пожалуйста может что где подправить или вообще все не покатит я думаю вроде должно работать. В данном случае пин STEP 1 цифровой(это пины Ардуино если что :) не самого контроллера), цифровой 2 - DIR, цифровой 3 - это выход в LPT(сигнал от концевика начало оси обработанный контроллером), фазы двигателя это выходы ШИМ Ардуино 9,10,11 и 6. Вход концевика к контроллеру цифровой 0. Вроде все :) Схему если надо выложу думаю тут и так понятно можно практически любые брать выходы-выходы.


int x=0;
int s=0;
int p=0;
int STEP=1;
int DIR=2;
int a=9;//PWM!!!
int b=10;//PWM!!!
int c=11;//PWM!!!
int d=6;//PWM!!!
int swin=0;
int swout=3;
void setup(){
pinMode(STEP, INPUT);
pinMode(DIR, INPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(swin, INPUT);
pinMode(swout, OUTPUT);
}
void loop(){
if(digitalRead(swin) == HIGH){
digitalWrite(swout, HIGH);
}
else{
digitalWrite(swout, LOW);
}
p=analogRead(A5);
p=map(p, 0, 1023, 0, 55);
Pausa:
if(digitalRead(STEP) == HIGH){
goto Pausa;
}
if(s==1){
analogWrite(a, p);
}
if(s==2){
analogWrite(a, p);
analogWrite(b, p);
}
if(s==3){
analogWrite(b, p);
}
if(s==4){
analogWrite(b, p);
analogWrite(c, p);
}
if(s==5){
analogWrite(c, p);
}
if(s==6){
analogWrite(c, p);
analogWrite(d, p);
}
if(s==7){
analogWrite(d, p);
}
if(s==8){
analogWrite(d, p);
analogWrite(a, p);
}
Pausa2:
if(digitalRead(STEP) == LOW){
goto Pausa2;
}
if(digitalRead(DIR)==LOW){
if(s==9){
s=0;
}
s=s+1;
if(s==9){
s=1;
}
if(s==1){
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
}
if(s==2){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
}
if(s==3){
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
}
if(s==4){
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
}
if(s==5){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
}
if(s==6){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
}
if(s==7){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
}
if(s==8){
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
}
}
else {
if(s==9){
s=8;
}
s=s-1;
if(s==0){
s=8;
}
if(s==1){
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
}
if(s==2){
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
}
if(s==3){
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
}
if(s==4){
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
}
if(s==5){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
}
if(s==6){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
}
if(s==7){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
}
if(s==8){
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
}
}
}

Bmax77
Сообщения: 22
Зарегистрирован: Ср янв 16, 2013 20:56

Re: Контроллер одной оси на Atmega328

Сообщение Bmax77 » Вт мар 05, 2013 10:42

А STEP у вас просто на пин идет или на внешнее прерывание? Не понял как вы в программе один импульс от следующего отличаете?

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение okhtursky » Вт мар 05, 2013 10:52

Да я прерывания не использовал просто обычный пин а различаются тем что в начале цикла стоит оператор ну в общем вот:
Pausa:
if(digitalRead(STEP) == HIGH){
goto Pausa;
}


проверяет цифровой пин и пока на нем HIGH постоянно будет позвращатся и проверять, как только появляется LOW программа идет дальше

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение okhtursky » Вт мар 05, 2013 11:00

Тут еще реализовано удержание шд шимом и сила удержания задается переменным резистором в моем слуае на А5 аналоговом входе. эт чтобы двигатели гораздо меньше нагревались в процессе.

Bmax77
Сообщения: 22
Зарегистрирован: Ср янв 16, 2013 20:56

Re: Контроллер одной оси на Atmega328

Сообщение Bmax77 » Вт мар 05, 2013 11:11

А теперь понял.
Pausa:
if(digitalRead(STEP) == HIGH){
goto Pausa;
}
Это не правильно!!! У вас контроллер успеет несколько шагов выдать пока уровень будет низким. Представьте: пришел сигнал степ (низкий уровень), программа вышла из ожидания и сделала шаг, вернулась в это же место, а уровень еще низкий, программа делает еще один шаг, и так далее.
Отслеживать степ нужно по внешнему прерыванию отслеживая фронт сигнала. Либо писать более сложную процедуру отслеживания степ. Я не осилил и вернулся к варианту с внешним прерыванием.

Я сам слепил драйвер на Атмега8, долго возился с шимом, нужен точный контроль тока, а не только его изменение, ШД быстро крутится только когда питается напряжением намного выше номинального, и тут без компаратора не обойтись.

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение okhtursky » Вт мар 05, 2013 12:58

Нет несколько шагов не сделает там дальше по такому же принципу ждет HIGH :) и задумывалось что управляющий это высокий уровень ну при необходимости моно и на отрицательны переделать. И на счет питания двигателя тут думаю и так ясно что надо драйвер в виде мосфетов думаю и все разве нет? :)
Pausa:
if(digitalRead(STEP) == HIGH){ //ждет пока не бдет LOW как только LOW идем дальше
goto Pausa;
}
if(s==1){
analogWrite(a, p); //тут включаем нужные нам выходы в необходимый уровень шим
}
if(s==2){
analogWrite(a, p);
analogWrite(b, p);
}
if(s==3){
analogWrite(b, p);
}
if(s==4){
analogWrite(b, p);
analogWrite(c, p);
}
if(s==5){
analogWrite(c, p);
}
if(s==6){
analogWrite(c, p);
analogWrite(d, p);
}
if(s==7){
analogWrite(d, p);
}
if(s==8){
analogWrite(d, p);
analogWrite(a, p);
}
Pausa2:
if(digitalRead(STEP) == LOW){ //и снова ждем HIGH для следующего шага :) блин да должно работать как не крути :)
goto Pausa2;
}

Bmax77
Сообщения: 22
Зарегистрирован: Ср янв 16, 2013 20:56

Re: Контроллер одной оси на Atmega328

Сообщение Bmax77 » Вт мар 05, 2013 13:55

Тогда согласен, вроде должно работать.
Да естественно силовая часть нужна, я сделал на IRLZ44N. Я интересуюсь как вы ток собираетесь контролировать в обмотках шд?

Аватара пользователя
Ruz_and
Сообщения: 510
Зарегистрирован: Вс ноя 09, 2008 00:00
Откуда: РТ г. Лениногорск
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение Ruz_and » Вт мар 05, 2013 15:15

замен if на switch. это будет быстрее и меньше ложных срабатываний.
Не стреляйте из пушки по комарам (Конфуций)

Bmax77
Сообщения: 22
Зарегистрирован: Ср янв 16, 2013 20:56

Re: Контроллер одной оси на Atmega328

Сообщение Bmax77 » Вт мар 05, 2013 15:19

Ruz_and писал(а):замен if на switch. это будет быстрее и меньше ложных срабатываний.

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

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение okhtursky » Вт мар 05, 2013 15:39

В момент после того как двигатель сделал шаг активные выходы (фазы) переходят ну например в 20% ШИМ до следующего шага

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение okhtursky » Вт мар 05, 2013 15:47

Ruz_and писал(а):замен if на switch. это будет быстрее и меньше ложных срабатываний.

Так то да наверное правильнее конечно, но вот про ложные срабатывания что то не пойму, разница на мой взгляд если переделаю с if на switch чисто эстетическая :)

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение okhtursky » Вт мар 05, 2013 16:29

Bmax77 писал(а):Тогда согласен, вроде должно работать.
Да естественно силовая часть нужна, я сделал на IRLZ44N. Я интересуюсь как вы ток собираетесь контролировать в обмотках шд?

Да такой транзистор думаю подошел бы возможно такие и приобрету

Bmax77
Сообщения: 22
Зарегистрирован: Ср янв 16, 2013 20:56

Re: Контроллер одной оси на Atmega328

Сообщение Bmax77 » Вт мар 05, 2013 18:10

У меня между МК и транзисторами стоит повторитель, микросхема 2И быстродействующая с умощненным выходом, так как то спокойнее.
Я в симуляторе попробовал кусочек программы которая отлавливает step, да работает. Но минус такой реализации в том что мк будет много времени простаивать, а мог бы делать что то полезное. У меня например он контролирует ток.

Аватара пользователя
okhtursky
Сообщения: 12
Зарегистрирован: Пт мар 01, 2013 13:12
Откуда: Вологодская обл. г. Сокол
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение okhtursky » Вт мар 05, 2013 18:30

Не понимаю заем его контролировать? У меня сразу после шага когда на STEP появляется LOW активные фазы шаговика переходят в 20% ШИМ например.

Аватара пользователя
Ruz_and
Сообщения: 510
Зарегистрирован: Вс ноя 09, 2008 00:00
Откуда: РТ г. Лениногорск
Контактная информация:

Re: Контроллер одной оси на Atmega328

Сообщение Ruz_and » Вт мар 05, 2013 18:44

я в свое время делал контроллер на atmega 8 и столкнулся с такой проблемой как двойное срабатывание сигналов по dir и step при использовании шима. после того как поставил двойной контроль сигнала Step все проблемы решились.
пример реализации.
#define Step PORTB_Bit0
#define Dir PORTB_Bit1
char tik = 0;
while(1)
{
while (Step)
{}

if (Step == 0)
Delay_ns(5) // задержка на успокоение сигнала (mach3 этот параметр можно задавать до 10 ns)
if(Step == 0)
{
обработка сигнала dir
swithc(dir)
{
case 0: tik++
if (tik > 7) tik=0;
break;
case 1: tik--
if (tik < 0) tik=7;
break;
default: break;
}
}
}
общий пример реализации
Не стреляйте из пушки по комарам (Конфуций)


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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 24 гостя

cron