tao_z
2021-06-14 b150690b6ebe42a4ffd50278d761b8994121eb94
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
 
#include <math.h>
#include <stdlib.h>
 
/* Ë½ÓбäÁ¿ */
static bldcm_data_t bldcm_data;
 
/* ¾Ö²¿º¯Êý */
static void sd_gpio_config(void);
 
/**
  * @brief  µç»ú³õʼ»¯
  * @param  ÎÞ
  * @retval ÎÞ
  */
void bldcm_init(void)
{
    PWM_TIMx_Configuration(); // µç»ú¿ØÖƶ¨Ê±Æ÷£¬Òý½Å³õʼ»¯
    hall_tim_config();        // »ô¶û´«¸ÐÆ÷³õʼ»¯
    sd_gpio_config();         // sd Òý½Å³õʼ»¯
}
 
/**
  * @brief  µç»ú SD ¿ØÖÆÒý½Å³õʼ»¯
  * @param  ÎÞ
  * @retval ÎÞ
  */
static void sd_gpio_config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
 
    /* ¶¨Ê±Æ÷ͨµÀ¹¦ÄÜÒý½Å¶Ë¿ÚʱÖÓʹÄÜ */
    SHUTDOWN_GPIO_CLK_ENABLE();
 
    /* Òý½ÅIO³õʼ»¯ */
    /*ÉèÖÃÊä³öÀàÐÍ*/
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    /*ÉèÖÃÒý½ÅËÙÂÊ */
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    /*Ñ¡ÔñÒª¿ØÖƵÄGPIOÒý½Å*/
    GPIO_InitStruct.Pin = SHUTDOWN_PIN;
 
    /*µ÷Óÿ⺯Êý£¬Ê¹ÓÃÉÏÃæÅäÖõÄGPIO_InitStructure³õʼ»¯GPIO*/
    HAL_GPIO_Init(SHUTDOWN_GPIO_PORT, &GPIO_InitStruct);
 
    BLDCM_ENABLE_SD(); // Ä¬ÈÏ¿ªÆô
    HAL_Delay(1);
}
 
/**
  * @brief  ÉèÖõç»úËÙ¶È
  * @param  v: ËÙ¶È£¨Õ¼¿Õ±È£©
  * @retval ÎÞ
  */
void set_bldcm_speed(uint16_t v)
{
    bldcm_data.dutyfactor = v;
 
    set_pwm_pulse(v); // ÉèÖÃËÙ¶È
}
 
/**
  * @brief  ÉèÖõç»ú·½Ïò
  * @param  ÎÞ
  * @retval ÎÞ
  */
void set_bldcm_direction(motor_dir_t dir)
{
    bldcm_data.direction = dir;
}
 
/**
  * @brief  »ñÈ¡µç»úµ±Ç°·½Ïò
  * @param  ÎÞ
  * @retval ÎÞ
  */
motor_dir_t get_bldcm_direction(void)
{
    return bldcm_data.direction;
}
 
/**
  * @brief  Ê¹Äܵç»ú
  * @param  ÎÞ
  * @retval ÎÞ
  */
void set_bldcm_enable(void)
{
    bldcm_data.is_enable = 1;
    hall_enable();
}
 
/**
  * @brief  ½ûÓõç»ú
  * @param  ÎÞ
  * @retval ÎÞ
  */
void set_bldcm_disable(void)
{
    /* ½ûÓûô¶û´«¸ÐÆ÷½Ó¿Ú */
    hall_disable();
 
    /* Í£Ö¹ PWM Êä³ö */
    stop_pwm_output();
 
    /* ¹Ø±Õ MOS ¹Ü */
    bldcm_data.is_enable = 0;
}
 
/**
  * @brief  µç»úλÖÃʽ PID ¿ØÖÆÊµÏÖ(¶¨Ê±µ÷ÓÃ)
  * @param  ÎÞ
  * @retval ÎÞ
  */
void bldcm_pid_control(void)
{
    int32_t speed_actual = get_motor_speed(); // µç»úÐýתµÄµ±Ç°ËÙ¶È
 
    if (bldcm_data.is_enable)
    {
        float cont_val = 0; // µ±Ç°¿ØÖÆÖµ
 
        cont_val = PID_realize(speed_actual);
 
        if (cont_val < 0)
        {
            cont_val = -cont_val;
            bldcm_data.direction = MOTOR_REV;
        }
        else
        {
            bldcm_data.direction = MOTOR_FWD;
        }
 
        cont_val = (cont_val > PWM_PERIOD_COUNT) ? PWM_PERIOD_COUNT : cont_val; // ÉÏÏÞ´¦Àí
 
        set_bldcm_speed(cont_val);
 
#ifdef PID_ASSISTANT_EN
        set_computer_value(SEND_FACT_CMD, CURVES_CH1, &speed_actual, 1); // ¸øÍ¨µÀ 1 ·¢ËÍʵ¼ÊÖµ
#else
        printf("ʵ¼ÊÖµ£º%d, Ä¿±êÖµ£º%.0f£¬¿ØÖÆÖµ: %.0f\n", speed_actual, get_pid_target(), cont_val);
#endif
    }
}