USR/INC/bldc_ctrl.h | ●●●●● patch | view | raw | blame | history | |
USR/INC/gd32e23x_it.h | ●●●●● patch | view | raw | blame | history | |
USR/INC/motor.h | ●●●●● patch | view | raw | blame | history | |
USR/SRC/Motor.c | ●●●●● patch | view | raw | blame | history | |
USR/SRC/bldc_ctrl.c | ●●●●● patch | view | raw | blame | history | |
USR/SRC/gd32e23x_it.c | ●●●●● patch | view | raw | blame | history | |
USR/SRC/pwm.c | ●●●●● 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)