tao_z
2021-06-14 b150690b6ebe42a4ffd50278d761b8994121eb94
添加霍尔外部中断
motot模块初次提交尚未调试
3 files added
4 files modified
284 ■■■■■ changed files
USR/INC/bldc_ctrl.h 46 ●●●●● patch | view | raw | blame | history
USR/INC/gd32e23x_it.h 2 ●●●●● patch | view | raw | blame | history
USR/INC/motor.h 31 ●●●●● patch | view | raw | blame | history
USR/SRC/Motor.c 43 ●●●●● patch | view | raw | blame | history
USR/SRC/bldc_ctrl.c 145 ●●●●● patch | view | raw | blame | history
USR/SRC/gd32e23x_it.c 11 ●●●●● patch | view | raw | blame | history
USR/SRC/pwm.c 6 ●●●● patch | view | raw | blame | history
USR/INC/bldc_ctrl.h
New file
@@ -0,0 +1,46 @@
#ifndef BLDC_CONTROL_H
#define BLDC_CONTROL_H
#include "gpio.h"
//Òý½Å¶¨Òå
/*******************************************************/
// Á¬½ÓÇý¶¯°åµÄ SD ½Å
#define SHUTDOWN_PIN GPIO_PIN_15
#define SHUTDOWN_GPIO_PORT GPIOD
// #define SHUTDOWN_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
/*******************************************************/
/* µç»ú SD or EN Ê¹ÄܽŠ*/
#define BLDCM_ENABLE_SD()     \
    do                        \
    {                         \
        Set_SDH2136_Enable(); \
    } while (0) // ¸ßµçƽ´ò¿ª-¸ßµçƽʹÄÜ
#define BLDCM_DISABLE_SD()     \
    do                         \
    {                          \
        Set_SDH2136_Disable(); \
    } while (0) // µÍµçƽ¹Ø¶Ï-µÍµçƽ½ûÓÃ
/* µç»ú·½Ïò¿ØÖÆÃ¶¾Ù */
typedef enum
{
    MOTOR_FWD = 0,
    MOTOR_REV,
} motor_dir_t;
typedef struct
{
    motor_dir_t direction; // µç»ú·½Ïò
    uint16_t dutyfactor;   // PWM Êä³öÕ¼¿Õ±È
    uint8_t is_enable;     // Ê¹Äܵç»ú
    uint32_t lock_timeout; // µç»ú¶Âת¼ÆÊ±
} bldcm_data_t;
void bldcm_init(void);
void set_bldcm_speed(uint16_t v);
void set_bldcm_direction(motor_dir_t dir);
motor_dir_t get_bldcm_direction(void);
void set_bldcm_enable(void);
void set_bldcm_disable(void);
void bldcm_pid_control(void);
#endif
USR/INC/gd32e23x_it.h
@@ -58,5 +58,7 @@
void PendSV_Handler(void);
/* this function handles SysTick exception */
void SysTick_Handler(void);
/* this function handles XTI4-15  exception */
void EXTI4_15_IRQHandler(void);
#endif /* GD32E23X_IT_H */
USR/INC/motor.h
New file
@@ -0,0 +1,31 @@
#ifndef MOTOR_H
#define MOTOR_H
#include ""
/* µç»ú¿ØÐýתʵÏֽṹÌå */
#define SPEED_FILTER_NUM 30 // ËÙ¶ÈÂ˲¨´ÎÊý
typedef struct
{
    unsigned long timeout;     // ¶¨Ê±Æ÷¸üмÆÊý
    float speed;               // µç»úËÙ¶È rps£¨×ª/·ÖÖÓ£©
    unsigned long enable_flag; // µç»úʹÄܱêÖ¾
    signed int speed_group[SPEED_FILTER_NUM];
} motor_rotate_t;
/* ÀۼƠTIM_Period¸öºó²úÉúÒ»¸ö¸üлòÕßÖжÏ
    µ±¶¨Ê±Æ÷´Ó0¼ÆÊýµ½65535£¬¼´Îª65535´Î£¬ÎªÒ»¸ö¼ÆÊýÖÜÆÚ */
#define HALL_PERIOD_COUNT (0xFFFF)
/* Í¨ÓÿØÖƶ¨Ê±Æ÷ʱÖÓÔ´TIMxCLK = HCLK = 72MHz
     É趨¶¨Ê±Æ÷ƵÂÊΪ = TIMxCLK / (PWM_PRESCALER_COUNT) / PWM_PERIOD_COUNT = 9.987Hz
   ÖÜÆÚ T = 100ms */
#define HALL_PRESCALER_COUNT (110)
#define HALL_A_EXTI (EXTI_4)
#define HALL_B_EXTI (EXTI_5)
#define HALL_C_EXTI (EXTI_15)
extern void HAL_HallExti_TriggerCallback(void);
#endif
USR/SRC/Motor.c
@@ -1,3 +1,7 @@
#include "gpio.h"
#include "motor.h"
#include "gd32e23x_exti.h"
static motor_rotate_t motor_drive = {0};
/**
  * @brief  Ê¹ÄÜ»ô¶û´«¸ÐÆ÷
  * @param  ÎÞ
@@ -6,14 +10,15 @@
void hall_enable(void)
{
    /* Ê¹ÄÜ»ô¶û´«¸ÐÆ÷½Ó¿Ú */
    __HAL_TIM_ENABLE_IT(&htimx_hall, TIM_IT_TRIGGER);
    __HAL_TIM_ENABLE_IT(&htimx_hall, TIM_IT_UPDATE);
    exti_interrupt_enable(HALL_A_EXTI);
    exti_interrupt_enable(HALL_B_EXTI);
    exti_interrupt_enable(HALL_C_EXTI);
    HAL_TIMEx_HallSensor_Start(&htimx_hall);
    // HAL_TIMEx_HallSensor_Start(&htimx_hall);
    LED1_OFF;
    // LED1_OFF;
    HAL_TIM_TriggerCallback(&htimx_hall); // Ö´ÐÐÒ»´Î»»Ïà
    // HAL_TIM_TriggerCallback(&htimx_hall); // Ö´ÐÐÒ»´Î»»Ïà
    motor_drive.enable_flag = 1;
}
@@ -26,9 +31,10 @@
void hall_disable(void)
{
    /* ½ûÓûô¶û´«¸ÐÆ÷½Ó¿Ú */
    __HAL_TIM_DISABLE_IT(&htimx_hall, TIM_IT_TRIGGER);
    __HAL_TIM_DISABLE_IT(&htimx_hall, TIM_IT_UPDATE);
    HAL_TIMEx_HallSensor_Stop(&htimx_hall);
    exti_interrupt_disable(HALL_A_EXTI);
    exti_interrupt_disable(HALL_B_EXTI);
    exti_interrupt_disable(HALL_C_EXTI);
    // HAL_TIMEx_HallSensor_Stop(&htimx_hall);
    motor_drive.enable_flag = 0;
    motor_drive.speed = 0;
}
@@ -39,19 +45,19 @@
#if 1
    /* ¶ÁÈ¡»ô¶û´«¸ÐÆ÷ U µÄ״̬ */
    if (HAL_GPIO_ReadPin(HALL_INPUTU_GPIO_PORT, HALL_INPUTU_PIN) != GPIO_PIN_RESET)
    if (Get_HallSensorA_State())
    {
        state |= 0x01U << 0;
    }
    /* ¶ÁÈ¡»ô¶û´«¸ÐÆ÷ V µÄ״̬ */
    if (HAL_GPIO_ReadPin(HALL_INPUTV_GPIO_PORT, HALL_INPUTV_PIN) != GPIO_PIN_RESET)
    if (Get_HallSensorB_State())
    {
        state |= 0x01U << 1;
    }
    /* ¶ÁÈ¡»ô¶û´«¸ÐÆ÷ W µÄ״̬ */
    if (HAL_GPIO_ReadPin(HALL_INPUTW_GPIO_PORT, HALL_INPUTW_PIN) != GPIO_PIN_RESET)
    if (Get_HallSensorC_State())
    {
        state |= 0x01U << 2;
    }
@@ -61,7 +67,7 @@
    return state; // ·µ»Ø´«¸ÐÆ÷״̬
}
static uint8_t count = 0;
static void update_motor_speed(uint8_t dir_in, uint32_t time)
{
    int speed_temp = 0;
@@ -69,14 +75,14 @@
    float f = 0;
    /* ¼ÆËãËÙ¶È£º
     µç»úÿתһȦ¹²ÓÃ12¸öÂö³å£¬(1.0/(72000000.0/128.0)Ϊ¼ÆÊýÆ÷µÄÖÜÆÚ£¬(1.0/(72000000.0/128.0) * time)Ϊʱ¼ä³¤¡£
     µç»úÿתһȦ¹²ÓÃ12¸öÂö³å£¬(1.0/(48000000.0/128.0)Ϊ¼ÆÊýÆ÷µÄÖÜÆÚ£¬(1.0/(48000000.0/128.0) * time)Ϊʱ¼ä³¤¡£
  */
    if (time == 0)
        motor_drive.speed_group[count++] = 0;
    else
    {
        f = (1.0f / (72000000.0f / HALL_PRESCALER_COUNT) * time);
        f = (1.0f / (48000000.0f / HALL_PRESCALER_COUNT) * time);
        f = (1.0f / 12.0f) / (f / 60.0f);
        motor_drive.speed_group[count++] = f;
    }
@@ -182,19 +188,20 @@
/**
  * @brief  »ô¶û´«¸ÐÆ÷´¥·¢»Øµ÷º¯Êý
  * @param  htim:¶¨Ê±Æ÷¾ä±ú
  * @param  void
  * @retval ÎÞ
  */
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)
void HAL_HallExti_TriggerCallback(void)
{
    /* »ñÈ¡»ô¶û´«¸ÐÆ÷Òý½Å״̬,×÷Ϊ»»ÏàµÄÒÀ¾Ý */
    uint8_t step = 0;
    step = get_hall_state();
    if (htim == &htimx_hall) // ÅжÏÊÇ·ñÓÉ´¥·¢ÖжϲúÉú
    if (exti_interrupt_flag_get(HALL_A_EXTI | HALL_B_EXTI | HALL_C_EXTI)) // ÅжÏÊÇ·ñÓÉ´¥·¢ÖжϲúÉú
    {
        update_motor_speed(step, __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1));
        // update_motor_speed(step, __HAL_TIM_GET_COMPARE(htim, TIM_CHANNEL_1));//TODO Ö÷¶¨Ê±Æ÷´¦»ñµÃ¼ÆÊýʱ¼ä
        motor_drive.timeout = 0;
        exti_interrupt_flag_clear(HALL_A_EXTI | HALL_B_EXTI | HALL_C_EXTI);
    }
    if (get_bldcm_direction() == MOTOR_FWD)
USR/SRC/bldc_ctrl.c
New file
@@ -0,0 +1,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
    }
}
USR/SRC/gd32e23x_it.c
@@ -35,6 +35,7 @@
*/
#include "gd32e23x_it.h"
#include "motor.h"
/*!
    \brief      this function handles NMI exception
@@ -142,3 +143,13 @@
{
    delay_decrement();
}
/*!
    \brief      this function handles EXTI4-15 exception
    \param[in]  none
    \param[out] none
    \retval     none
*/
void EXTI4_15_IRQHandler(void)
{
    HAL_HallExti_TriggerCallback();
}
USR/SRC/pwm.c
@@ -129,12 +129,12 @@
void TimerInit(void)
{
    rcu_periph_clock_enable(RCU_TIMER2);
    // rcu_periph_clock_enable(RCU_TIMER2);
    rcu_periph_clock_enable(RCU_TIMER0);
    Timer0Init();
    Timer2Init();
    // Timer2Init();
    timer_enable(TIMER0);
    timer_enable(TIMER2);
    // timer_enable(TIMER2);
}
void SetPwmDuty(uint16_t ch, uint32_t duty)