From 33c7200dde5acf4270b8fbd3af2944a75515a782 Mon Sep 17 00:00:00 2001 From: MQjehovah <1421706030@qq.com> Date: Wed, 21 Oct 2020 17:28:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=906=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- firmware/build/MDK/project.uvprojx | 2 +- firmware/src/Driver/hall.c | 3 +- firmware/src/Driver/inc/motor.h | 4 ++ firmware/src/Driver/inc/pwm.h | 2 +- firmware/src/Driver/motor.c | 72 +++++++++++++++--------------- firmware/src/Driver/pwm.c | 26 +++++++---- firmware/src/User/inc/main.h | 2 + firmware/src/User/main.c | 12 ++--- 8 files changed, 71 insertions(+), 52 deletions(-) diff --git a/firmware/build/MDK/project.uvprojx b/firmware/build/MDK/project.uvprojx index d20c6dd..209149c 100644 --- a/firmware/build/MDK/project.uvprojx +++ b/firmware/build/MDK/project.uvprojx @@ -16,7 +16,7 @@ STM32F103C8 STMicroelectronics - Keil.STM32F1xx_DFP.2.3.0 + Keil.STM32F1xx_DFP.2.2.0 http://www.keil.com/pack/ IROM(0x08000000,0x10000) IRAM(0x20000000,0x5000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE diff --git a/firmware/src/Driver/hall.c b/firmware/src/Driver/hall.c index 3172b39..923fa48 100644 --- a/firmware/src/Driver/hall.c +++ b/firmware/src/Driver/hall.c @@ -83,11 +83,12 @@ void TIM2_IRQHandler(void) if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); + motor_info.hall_position = get_hall_position(); + motor_step(); } else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); - motor_info.hall_position = get_hall_position(); //换相 // pwm_Commute(hallpos); } diff --git a/firmware/src/Driver/inc/motor.h b/firmware/src/Driver/inc/motor.h index ee35bb0..3aa0cc0 100644 --- a/firmware/src/Driver/inc/motor.h +++ b/firmware/src/Driver/inc/motor.h @@ -29,11 +29,15 @@ typedef struct _motor u8 state; //运行状态 u8 hall_position; //霍尔位置 s16 speed; //转速 + u32 step; } motor_t; /* Exported Functions --------------------------------------------------------*/ extern motor_t motor_info; +void motor_start(void); +void motor_stop(void); +void motor_step(void); #endif /*********************************END OF FILE**********************************/ diff --git a/firmware/src/Driver/inc/pwm.h b/firmware/src/Driver/inc/pwm.h index a534bda..5584cd9 100644 --- a/firmware/src/Driver/inc/pwm.h +++ b/firmware/src/Driver/inc/pwm.h @@ -14,6 +14,6 @@ /* Definition ----------------------------------------------------------------*/ /* Exported Functions --------------------------------------------------------*/ - +void PWM_Config(void); #endif /*********************************END OF FILE**********************************/ diff --git a/firmware/src/Driver/motor.c b/firmware/src/Driver/motor.c index 82a7aeb..cc89976 100644 --- a/firmware/src/Driver/motor.c +++ b/firmware/src/Driver/motor.c @@ -18,14 +18,15 @@ motor_t motor_info; * @retval None * @note 开启霍尔捕捉中断,提供启动力 *******************************************************************************/ -void motor_start() +void motor_start(void) { motor_info.state = 1; TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = 0; //TODO:开启霍尔捕捉中断 - motor_step(motor_info.hall_position); + motor_info.hall_position = get_hall_position(); + motor_step(); } /******************************************************************************* @@ -34,7 +35,7 @@ void motor_start() * @retval None * @note None *******************************************************************************/ -void motor_stop() +void motor_stop(void) { motor_info.state = MOTOR_STATE_STOP; TIM1->CCR1 = 0; @@ -56,12 +57,12 @@ void motor_stop() * @note H-PWM, L-ON * 电流始终由正极流向负极,所以PWM总是出现在A+、B+、C+,负极保持导通 *******************************************************************************/ -void motor_step() +void motor_step(void) { - u8 step = 0; + u8 step = motor_info.hall_position; switch (step) { - case 0x00: //第一步 A+ B- + case 0x01: //第一步 A+ B- TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); @@ -71,60 +72,61 @@ void motor_step() TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; - case 0x01: //第二步 A+ B- - TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); - TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); + case 0x02: //第二步 C+ B- + TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1); + TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); - TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); + TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable); TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; - case 0x02: //第三步 A+ B- - TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); - TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); + case 0x03: //第三步 C+ A- + TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1); + TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); - TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); - TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); - TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); - TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); + TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable); + TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_ForcedAction_Active); + TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable); + TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; - case 0x03: //第四步 A+ B- - TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); - TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); - TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); + case 0x04: //第四步 B+ A- + TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1); + TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); + TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); - TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); - TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); - TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); + TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_ForcedAction_Active); + TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable); + TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; - case 0x04: //第五步 A+ B- - TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); - TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); - TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); + case 0x05: //第五步 B+ C- + TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1); + TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); + TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); - TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); + TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); - TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); - TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); + TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); + TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable); break; - case 0x05: //第六步 A+ B- + case 0x06: //第六步 A+ C- TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); - TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); + TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); - TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); - TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); + TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); + TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable); break; default: motor_stop(); break; } + TIM_GenerateEvent(TIM1, TIM_EventSource_COM); } /*********************************END OF FILE**********************************/ diff --git a/firmware/src/Driver/pwm.c b/firmware/src/Driver/pwm.c index afd225c..76d6dd6 100644 --- a/firmware/src/Driver/pwm.c +++ b/firmware/src/Driver/pwm.c @@ -46,9 +46,6 @@ void PWM_Config(void) // GPIO_SetBits(GPIOB, GPIO_Pin_12); - // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; - // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; - // GPIO_Init(GPIOA, &GPIO_InitStructure); //PWM频率:12k TIM_DeInit(TIM1); @@ -59,24 +56,25 @@ void PWM_Config(void) TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); - TIM_OCInitStructure.TIM_OCMode = TIM_ForcedAction_InActive; //PWM2:递增计数时CNTCCRx,OC输出有效电平 + TIM_OCInitStructure.TIM_OCMode = TIM_ForcedAction_InActive; //PWM2:递增计数时CNTCCRx,OC输出有效电平 TIM_ForcedAction_InActive TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; - TIM_OCInitStructure.TIM_Pulse = 1400; + TIM_OCInitStructure.TIM_Pulse = 700; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; - TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //TIM_OCIdleState_Set; - TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; + TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //TIM_OCIdleState_Set;TIM_OCIdleState_Reset + TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set; TIM_OC1Init(TIM1, &TIM_OCInitStructure); - TIM_OCInitStructure.TIM_Pulse = 1400; + TIM_OCInitStructure.TIM_Pulse = 700; TIM_OC2Init(TIM1, &TIM_OCInitStructure); - TIM_OCInitStructure.TIM_Pulse = 1400; + TIM_OCInitStructure.TIM_Pulse = 700; TIM_OC3Init(TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //TIM输出通道4初始化,用来触发AD注入采样 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; + TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 1400; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC4Init(TIM1, &TIM_OCInitStructure); @@ -110,4 +108,14 @@ void PWM_Config(void) TIM_Cmd(TIM1, ENABLE); } +/******************************************************************************* + * @brief 高级定时器TIM1 COM中断初始化 + * @param None + * @retval None + * @note None +*******************************************************************************/ +void TIM1_TRG_COM_IRQHandler(void) +{ + TIM1->SR &= 0xff9f; +} /*********************************END OF FILE**********************************/ diff --git a/firmware/src/User/inc/main.h b/firmware/src/User/inc/main.h index 551aebc..f9cdc2d 100644 --- a/firmware/src/User/inc/main.h +++ b/firmware/src/User/inc/main.h @@ -15,6 +15,8 @@ #include "USART.h" #include "GPIO.h" #include "hall.h" +#include "pwm.h" +#include "motor.h" /* Definition ----------------------------------------------------------------*/ /* Exported Functions --------------------------------------------------------*/ diff --git a/firmware/src/User/main.c b/firmware/src/User/main.c index 0f27472..06592c5 100644 --- a/firmware/src/User/main.c +++ b/firmware/src/User/main.c @@ -21,7 +21,8 @@ void RCC_Config() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); - RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE); + // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE); + RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE); } /******************************************************************************* @@ -54,17 +55,18 @@ int main(void) GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭jtag,保留swd。 SysTick_init(); GPIO_Config(&PB5, GPIO_Mode_Out_PP); - USART_Config(USART1, 9600); + GPIO_Config(&PB12, GPIO_Mode_Out_PP); + GPIO_WritePin(&PB12, HIGH); + // USART_Config(USART1, 9600); HALL_Config(); - - USART_SendStr(USART1, "Init OK\n"); + PWM_Config(); + motor_start(); while (1) { GPIO_WritePin(&PB5, HIGH); delay_ms(500); GPIO_WritePin(&PB5, LOW); delay_ms(500); - USART_SendStr(USART1, "usart test\n"); } } /*********************************END OF FILE**********************************/