Самодельный бесколлекторный двигатель под управлением Arduino

Тема в разделе "Глядите, что я сделал", создана пользователем issaom, 28 янв 2018.

  1. issaom

    issaom Гуру

    Шаговый двигатель из консервных банок....



    circuit diagram - копия.jpg

    Код (C++):
    // подключаем библиотеку для управления дисплеем
    #include <LiquidCrystal.h>
    // инициализируем пины для упраления дислем
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    #define ENA 44
    #define IN1 40
    #define IN2 42
    #define ENB 45
    #define IN3 41
    #define IN4 43
    #define ACW 36  // anticlockwise button
    #define STP 37  // stop button
    #define CCW 38  // clockwise button
    #define SPD A8  // Speed potenciometr
    #define FRC 39  // force

    boolean ACW_STATE = false;
    boolean CCW_STATE = false;
    boolean STP_STATE = false;
    boolean FRC_STATE = false;

    byte CurrPosit = 11;
    int CurrSpeed = 0;  // об/мин
    int ItervSpeed = 0; //
    int MAXSPEED = 0;

    int ALLPosit[13];

    void setup() {
     
    ALLPosit[0]  = B00000000;   // Х/З & STOP
    ALLPosit[1]  = B11000000; // 30
    ALLPosit[2]  = B00011000; // 60
    ALLPosit[3]  = B10100000; // 90
    ALLPosit[4]  = B00010100; // 120
    ALLPosit[5]  = B11000000; // 150
    ALLPosit[6]  = B00011000; // 180
    ALLPosit[7]  = B10100000; // 210
    ALLPosit[8]  = B00010100; // 240
    ALLPosit[9]  = B11000000; // 270
    ALLPosit[10] = B00011000; // 300
    ALLPosit[11] = B10100000; // 330
    ALLPosit[12] = B00010100; // 360

    pinMode(ENA,OUTPUT);
    pinMode(IN1,OUTPUT);
    pinMode(IN2,OUTPUT);
    pinMode(ENB,OUTPUT);
    pinMode(IN3,OUTPUT);
    pinMode(IN4,OUTPUT);
    pinMode (ACW,INPUT_PULLUP);
    pinMode (STP,INPUT_PULLUP);
    pinMode (CCW,INPUT_PULLUP);
    pinMode (FRC,INPUT_PULLUP);
    lcd.begin(16, 2);
    clockwise();
    }

    void clockwise()  //вращение по часовой стрелке
    {
    CurrPosit = CurrPosit + 1;
    if (CurrPosit == 13) CurrPosit = 1;
    stepmotor();
    }

    void anticlockwise() //вращение против часовой стрелки
    {
    CurrPosit = CurrPosit - 1;
    if (CurrPosit == 0) CurrPosit = 12;
    stepmotor();
    }

    void stepmotor()  // 1 шаг на 30 градусов
    {
    digitalWrite(ENA,0);
    digitalWrite(ENB,0);
    digitalWrite(IN1,bitRead(ALLPosit[CurrPosit],6));
    digitalWrite(IN2,bitRead(ALLPosit[CurrPosit],5));
    digitalWrite(IN3,bitRead(ALLPosit[CurrPosit],3));
    digitalWrite(IN4,bitRead(ALLPosit[CurrPosit],2));
    digitalWrite(ENA,bitRead(ALLPosit[CurrPosit],7));
    digitalWrite(ENB,bitRead(ALLPosit[CurrPosit],4));
    }

    void superFRC() //Режим суперфорсажа (без дисплея)
    {
    label:
    MAXSPEED = map(analogRead(SPD), 0, 1023, 10000, 1000);
    delayMicroseconds(MAXSPEED);
    if  (ACW_STATE) clockwise();
    if  (CCW_STATE) anticlockwise();
    if (digitalRead(STP)) goto label;
    }

    void loop() {

    lcd.clear();
    //Читаем значение потеницометра
    int a = analogRead(SPD);
    //Значения в оборотах в винуту от 1 до 250 без форсажа и от 250 до 5010 с форсажем
    if (!FRC_STATE) CurrSpeed = map(a, 0, 1023, 1, 250); else CurrSpeed = map(a, 0, 1023, 5010, 250);

    //Расчитываем интервал
    ItervSpeed = int (60000/12/CurrSpeed);

    //Читаем значение кнопок и записываем их в переменные
    if (!ACW_STATE) ACW_STATE = !digitalRead(ACW);
    if (!CCW_STATE) CCW_STATE = !digitalRead(CCW);
    if (!FRC_STATE) FRC_STATE = !digitalRead(FRC);
    STP_STATE = !digitalRead(STP);
    if (STP_STATE) {
    ACW_STATE = 0;
    CCW_STATE = 0;
    FRC_STATE = 0;
    }

    if  (ACW_STATE) clockwise();
    if  (CCW_STATE) anticlockwise();

    //на полном ходу перестаем отображать значения на экране !!!
    //и уходим в режим суперфорсажа

    if (ItervSpeed != 0) {
    //Печатаем значения на экране
    lcd.setCursor(0,1);
    lcd.print(CurrSpeed);     //Обороты в минуту
    lcd.print("ob/min ");
    lcd.print(ItervSpeed);
    lcd.print("mS");          //Поворот на 30 градусов за mS
    lcd.setCursor(4, 0);
    lcd.print(ACW_STATE);
    lcd.print(STP_STATE);
    lcd.print(CCW_STATE);
    lcd.print(" M");
    lcd.print(MAXSPEED);      //минимальный интервал (мкс) до срыва синхронизации
    lcd.setCursor(15, 0);
    lcd.print(FRC_STATE);     //режим работы шаговый/форсированый
    lcd.setCursor(0,0);
    lcd.print(CurrPosit*30);  //Текущий угол поворота
    if (ACW_STATE || CCW_STATE) delay(ItervSpeed); else delay(125);
    } else superFRC();        // Взлетаем
    }
     
    ИгорьК, NikitOS и Securbond нравится это.
  2. issaom

    issaom Гуру

    А вот и двухфазный бесколлекторный моторчеГ:



    Кому лень смотреть видео несколько картиночек:

    logik.jpg

    вентильный электродвигатель.jpg

    DSC_0205.JPG

    обложка.JPG

    Скетч:

    Код (C++):
    #define SENS1 14  // А0
    #define SENS2 15  // А1
    #define SENS3 16  // А2
    #define BTyel 17  // А3  anticlockwise button
    #define BTred 18  // А4  stop button
    #define BTgre 19  // А5  clockwise button
    #define SPD A7    // Speed potenciometr

    int IN1=2; //2
    #define ENA 3 //~
    int IN2=4; //4
    int IN3=5; //5
    #define ENB 6 //~
    int IN4=7; //7

    boolean sen1;
    boolean sen2;
    boolean sen3;

    boolean yel;
    boolean gre;

    void setup() {
     
    pinMode(ENA,OUTPUT);
    pinMode(IN1,OUTPUT);
    pinMode(IN2,OUTPUT);
    pinMode(ENB,OUTPUT);
    pinMode(IN3,OUTPUT);
    pinMode(IN4,OUTPUT);
    pinMode (BTyel,INPUT_PULLUP);
    pinMode (BTred,INPUT_PULLUP);
    pinMode (BTgre,INPUT_PULLUP);
    pinMode (SENS1,INPUT);
    pinMode (SENS2,INPUT);
    pinMode (SENS3,INPUT);

    }

    void loop() {

    //Читаем значение потеницометра и преобразуем в 0...255
    int spd = map(analogRead(SPD), 0, 1020, 0, 255);
    if (spd == 255) digitalWrite(13,1); else digitalWrite(13,0);

    // читаем значения сенсоров
    sen1 = !digitalRead(SENS1);
    sen2 = !digitalRead(SENS2);
    sen3 = !digitalRead(SENS3);

    // читаем значения кнопок

    if (!gre){
    gre = !digitalRead(BTgre); //если кнопка нажата запоминаем значение и больше не опрашиваем
    IN1=2; //вращаем против часовой
    IN2=4;
    IN3=5;
    IN4=7;
    }

    if (!yel){
    yel = !digitalRead(BTyel); //если кнопка нажата запоминаем значение и больше не опрашиваем
    IN1=4; //вращаем по часовой
    IN2=2;
    IN3=7;
    IN4=5;
    }

    if (!digitalRead(BTred)) { //если нажата кнопка стоп обнуляем значения других кнопок
    yel = false;
    gre = false;
    digitalWrite(ENA,0);
    digitalWrite(ENB,0);
    }


    if (yel || gre) {
    if (sen1 && !sen2 && sen3) {
    digitalWrite(ENA,0);
    digitalWrite(ENB,0);
    digitalWrite(IN1,1);
    digitalWrite(IN2,0);
    digitalWrite(IN3,0);
    digitalWrite(IN4,0);
    analogWrite(ENA,spd);
    analogWrite(ENB,0);
    goto finale;
    }

    if (!sen1 && sen2 && sen3) {
    digitalWrite(ENA,0);
    digitalWrite(ENB,0);
    digitalWrite(IN1,0);
    digitalWrite(IN2,0);
    digitalWrite(IN3,1);
    digitalWrite(IN4,0);
    analogWrite(ENA,0);
    analogWrite(ENB,spd);
    goto finale;
    }

    if (sen1 && !sen2 && !sen3) {
    digitalWrite(ENA,0);
    digitalWrite(ENB,0);
    digitalWrite(IN1,0);
    digitalWrite(IN2,1);
    digitalWrite(IN3,0);
    digitalWrite(IN4,0);
    analogWrite(ENA,spd);
    analogWrite(ENB,0);
    goto finale;
    }

    if (!sen1 && sen2 && !sen3) {
    digitalWrite(ENA,0);
    digitalWrite(ENB,0);
    digitalWrite(IN1,0);
    digitalWrite(IN2,0);
    digitalWrite(IN3,0);
    digitalWrite(IN4,1);
    analogWrite(ENA,0);
    analogWrite(ENB,spd);
    goto finale;
    }

    }
    finale:;
    }
     
    Securbond нравится это.