Доброе время суток !!!
В программировании новичок по этому и спрашиваю ...
Нужно осуществить управление 3-мя двигателями. По сути 5-я, но так как 3 работают синхронно то будем считать как за один. Это будет специализированный станок.
Что нужно выполнить контроллеру:
Основная программа :
Задаются параметры для каждого двигателя персонально (скорость и направление вращения )
Двигатель №1 - Постоянно работает
Двигатель №2 - Изменяет направление движения при срабатывании концевиков
Двигатель №3 - Изменяет направление движения при срабатывании концевиков
Прерывания
На каждый двигатель есть 4 кнопки ( вперед/назад/скорость+/скорость - )
Они нужны для подстройки скоростей двигателей и когда нужно в ускорении работы или смены направления.
Было бы не плохо что бы после отключения питания все значения оставались в памяти.
Использовал процессор Atmega32. Код программы который я сделал на данный момент ниже. Также прикрепил електрическую схему, и печатную плату. Всем спасибо за помощь =)
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define VD5 PORTA
#define VD4 PORTB
int S1=350;
int S2=450;
int S3=550;
int main(void)
{
PORTA = 0b00000000;
DDRA = 0b11111111;
PORTB = 0b11110000;
DDRB = 0b00001111;
PORTC = 0b11111111;
DDRC = 0b00000000;
PORTD = 0b11111111;
DDRD = 0b00000000;
sei(); //разрешаем глобальные прерывания
unsigned char butcount=0;
void delay (int ms)
{
for (;ms;ms--)
_delay_us(0.1);
}
void right_M1 (void) //Функция поворота ротора дигателя М1 вправо
{
VD4 = 0b00000011; // шаг 1
delay(S1);
VD4 = 0b00000110; // шаг 2
delay(S1);
VD4 = 0b00001100; // шаг 3
delay(S1);
VD4 = 0b00001001; // шаг 4
delay(S1);
}
void left_M1 (void) //Функция поворота ротора дигателя М1 влево
{
VD4 = 0b00001001; // реверс шаг 1
delay(S1);
VD4 = 0b00001100; // реверс шаг 2
delay(S1);
VD4 = 0b00000110; // реверс шаг 3
delay(S1);
VD4 = 0b00000011; // реверс шаг 4
delay(S1);
}
void right_M2 (void) //Функция поворота ротора дигателя М2 вправо
{
VD5 = 0b00000011; // шаг 1
delay(S2);
VD5 = 0b00000110; // шаг 2
delay(S2);
VD5 = 0b00001100; // шаг 3
delay(S2);
VD5 = 0b00001001; // шаг 4
delay(S2);
}
void left_M2 (void) //Функция поворота ротора дигателя М2 влево
{
VD5 = 0b00001001; // реверс шаг 1
delay(S2);
VD5 = 0b00001100; // реверс шаг 2
delay(S2);
VD5 = 0b00000110; // реверс шаг 3
delay(S2);
VD5 = 0b00000011; // реверс шаг 4
delay(S2);
}
void right_M3 (void) //Функция поворота ротора дигателя М3 вправо
{
VD5 = 0b00110000; // шаг 1
delay(S3);
VD5 = 0b01100000; // шаг 2
delay(S3);
VD5 = 0b11000000; // шаг 3
delay(S3);
VD5 = 0b10010000; // шаг 4
delay(S3);
}
void left_M3 (void) //Функция поворота ротора дигателя М3 влево
{
VD5 = 0b10010000; // реверс шаг 1
delay(S3);
VD5 = 0b11000000; // реверс шаг 2
delay(S3);
VD5 = 0b01100000; // реверс шаг 3
delay(S3);
VD5 = 0b00110000; // реверс шаг 4
delay(S3);
}
while (1)
{
// -------------------------------------------------------------------------------------------------
if (!(PINC&0b01000000))
{
if(butcount < 5)
{
butcount++;
}
else
{
while (1)
{
right_M1 ();
if (!(PINC&0b00100000))
{
if(butcount<5)
{
butcount++;
}
else
{
S1=S1+1;
}
}
if (!(PINC&0b00010000))
{
if(butcount < 5)
{
butcount++;
}
else
{
S1=S1-1;
}
}
}
}
}
if (!(PINC&0b10000000))
{
if(butcount < 5)
{
butcount++;
}
else
{
while (1)
{
left_M1 ();
if (!(PINC&0b00100000))
{
if(butcount < 5)
{
butcount++;
}
else
{
S1=S1+1;
}
}
if (!(PINC&0b00010000))
{
if(butcount < 5)
{
butcount++;
}
else
{
S1=S1-1;
}
}
}
}
}
// -------------------------------------------------------------------------------------------
{
if (!(PINC&0b00001000))
{
if(butcount < 5)
{
butcount++;
}
else
{
while (1)
{
right_M2 ();
if (!(PINC&0b00000010))
{
if(butcount<5)
{
butcount++;
}
else
{
S2=S2+1;
}
}
if (!(PINC&0b00000001))
{
if(butcount < 5)
{
butcount++;
}
else
{
S2=S2-1;
}
}
}
}
}
if (!(PINC&0b00000100))
{
if(butcount < 5)
{
butcount++;
}
else
{
while (1)
{
left_M2 ();
if (!(PINC&0b00000010))
{
if(butcount < 5)
{
butcount++;
}
else
{
S2=S2+1;
}
}
if (!(PINC&0b00000001))
{
if(butcount < 5)
{
butcount++;
}
else
{
S2=S2-1;
}
}
}
}
}
// ----------------------------------------------------------------------------------------
{
if (!(PIND&0b00010000))
{
if(butcount < 5)
{
butcount++;
}
else
{
while (1)
{
right_M3 ();
if (!(PIND&0b01000000))
{
if(butcount<5)
{
butcount++;
}
else
{
S3=S3+1;
}
}
if (!(PIND&0b10000000))
{
if(butcount < 5)
{
butcount++;
}
else
{
S3=S3-1;
}
}
}
}
}
if (!(PIND&0b00100000))
{
if(butcount < 5)
{
butcount++;
}
else
{
while (1)
{
left_M3 ();
if (!(PIND&0b01000000))
{
if(butcount < 5)
{
butcount++;
}
else
{
S3=S3+1;
}
}
if (!(PIND&0b10000000))
{
if(butcount < 5)
{
butcount++;
}
else
{
S3=S3-1;
}
}
}
}
}
// -------------------------------------------------------------------------------------------
}
}
}
}
схема.pdf