summaryrefslogtreecommitdiff
path: root/software/main/stepper.c
blob: 71ac22758a094ccebb263247bfcfdaf61d240fc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"

#include "../include/stepper.h"

// FOR L928 DRIVER
// const uint8_t half_steps_phase[8] = {0x09, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08};

// void stepper_init(struct stepper_pins_t *stepper_ptr) {
//     gpio_set_direction(stepper_ptr->pin1, GPIO_MODE_OUTPUT);
//     gpio_set_direction(stepper_ptr->pin2, GPIO_MODE_OUTPUT);
//     gpio_set_direction(stepper_ptr->pin3, GPIO_MODE_OUTPUT);
//     gpio_set_direction(stepper_ptr->pin4, GPIO_MODE_OUTPUT);

//     printf("stepper init success\n");
// }

// void stepper_uninit(struct stepper_pins_t * stepper_ptr) {
//     gpio_set_direction(stepper_ptr->pin1, GPIO_MODE_INPUT);
//     gpio_set_direction(stepper_ptr->pin2, GPIO_MODE_INPUT);
//     gpio_set_direction(stepper_ptr->pin3, GPIO_MODE_INPUT);
//     gpio_set_direction(stepper_ptr->pin4, GPIO_MODE_INPUT);
// }

// void step(struct stepper_pins_t *stepper_ptr, int step) {
//     gpio_set_level(stepper_ptr->pin1, step & 1);
//     gpio_set_level(stepper_ptr->pin3, (step & 0b10) >> 1);
//     gpio_set_level(stepper_ptr->pin2, (step & 0b100) >> 2);
//     gpio_set_level(stepper_ptr->pin4, (step & 0b1000) >> 3);
// }

// void half_steps(struct stepper_pins_t *stepper_ptr, int steps, bool dir) {
//     int step_count;
//     int phase_index;

//     if(dir) {
//         phase_index = 0;
//         for(step_count = 0; step_count < steps; step_count++) {
//             if(phase_index > 7)
//                 phase_index = 0;
//             step(stepper_ptr, half_steps_phase[phase_index]);
//             vTaskDelay(10 / portTICK_PERIOD_MS);
//             phase_index++;
//         }
//     } else {
//         phase_index = 7;
//         for(step_count = 0; step_count < steps; step_count++) {
//             if (phase_index < 0)
//                 phase_index = 7;
//             step(stepper_ptr, half_steps_phase[phase_index]);
//             vTaskDelay(10 / portTICK_PERIOD_MS);
//             phase_index--;
//         }
//     }
// }

// FOR A4988 DRIVER
const uint8_t step_pin = 19;
const uint8_t dir_pin = 18;
const uint8_t en_pin = 5;

void stepper_init(void) {
    gpio_set_direction(en_pin, GPIO_MODE_OUTPUT);
    gpio_set_level(en_pin, HIGH);
    gpio_set_direction(dir_pin, GPIO_MODE_OUTPUT);
    gpio_set_direction(step_pin, GPIO_MODE_OUTPUT);
}

void stepper_uninit(void) {
    gpio_set_level(en_pin, HIGH);
    gpio_set_direction(en_pin, GPIO_MODE_DISABLE);
    gpio_set_direction(dir_pin, GPIO_MODE_DISABLE);
    gpio_set_direction(step_pin, GPIO_MODE_DISABLE);
}

void stepper_open(void) {
    gpio_set_level(en_pin, LOW);
    gpio_set_level(dir_pin, HIGH);
    for(uint16_t i = 0; i < 1600; i++) {
        gpio_set_level(step_pin, HIGH);
        vTaskDelay(10 / portTICK_PERIOD_MS);
        gpio_set_level(step_pin, LOW);
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}

void stepper_close(void) {
    gpio_set_level(en_pin, LOW);
    gpio_set_level(dir_pin, LOW);
    for(uint16_t i = 0; i < 1600; i++) {
        gpio_set_level(step_pin, HIGH);
        vTaskDelay(10 / portTICK_PERIOD_MS);
        gpio_set_level(step_pin, LOW);
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}