diff --git a/Inc/tim.h b/Inc/tim.h index 6d3ffbd3..b11fa712 100644 --- a/Inc/tim.h +++ b/Inc/tim.h @@ -57,6 +57,7 @@ /* USER CODE END Includes */ extern TIM_HandleTypeDef htim1; +extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim4; extern TIM_HandleTypeDef htim8; @@ -68,12 +69,13 @@ extern TIM_HandleTypeDef htim8; extern void Error_Handler(void); void MX_TIM1_Init(void); +void MX_TIM2_Init(void); void MX_TIM3_Init(void); void MX_TIM4_Init(void); void MX_TIM8_Init(void); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); - + /* USER CODE BEGIN Prototypes */ diff --git a/Odrive.ioc b/Odrive.ioc index a055dcc7..50bdd67b 100755 --- a/Odrive.ioc +++ b/Odrive.ioc @@ -86,9 +86,10 @@ KeepUserPlacement=false Mcu.Family=STM32F4 Mcu.IP0=ADC1 Mcu.IP1=ADC2 -Mcu.IP10=TIM3 -Mcu.IP11=TIM4 -Mcu.IP12=TIM8 +Mcu.IP10=TIM2 +Mcu.IP11=TIM3 +Mcu.IP12=TIM4 +Mcu.IP13=TIM8 Mcu.IP2=ADC3 Mcu.IP3=CAN1 Mcu.IP4=FREERTOS @@ -97,7 +98,7 @@ Mcu.IP6=RCC Mcu.IP7=SPI3 Mcu.IP8=SYS Mcu.IP9=TIM1 -Mcu.IPNb=13 +Mcu.IPNb=14 Mcu.Name=STM32F405RGTx Mcu.Package=LQFP64 Mcu.Pin0=PC13-ANTI_TAMP @@ -230,11 +231,11 @@ PB1.Signal=TIM8_CH3N PB10.GPIOParameters=GPIO_Label PB10.GPIO_Label=AUX_L PB10.Locked=true -PB10.Signal=GPIO_Output +PB10.Signal=S_TIM2_CH3 PB11.GPIOParameters=GPIO_Label PB11.GPIO_Label=AUX_H PB11.Locked=true -PB11.Signal=GPIO_Output +PB11.Signal=S_TIM2_CH4 PB12.GPIOParameters=GPIO_Label PB12.GPIO_Label=EN_GATE PB12.Locked=true @@ -374,7 +375,7 @@ ProjectManager.StackSize=0x800 ProjectManager.TargetToolchain=SW4STM32 ProjectManager.ToolChainLocation=/home/oskar/ODriveFirmware ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL,2-MX_ADC1_Init-ADC1-false-HAL,3-MX_ADC2_Init-ADC2-false-HAL,4-MX_CAN1_Init-CAN1-false-HAL,5-MX_TIM1_Init-TIM1-false-HAL,6-MX_TIM8_Init-TIM8-false-HAL,7-MX_TIM3_Init-TIM3-false-HAL,8-MX_TIM4_Init-TIM4-false-HAL,9-MX_SPI3_Init-SPI3-false-HAL,10-MX_ADC3_Init-ADC3-false-HAL,11-SystemClock_Config-RCC-false-HAL +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL,2-MX_ADC1_Init-ADC1-false-HAL,3-MX_ADC2_Init-ADC2-false-HAL,4-MX_CAN1_Init-CAN1-false-HAL,5-MX_TIM1_Init-TIM1-false-HAL,6-MX_TIM8_Init-TIM8-false-HAL,7-MX_TIM3_Init-TIM3-false-HAL,8-MX_TIM4_Init-TIM4-false-HAL,9-MX_SPI3_Init-SPI3-false-HAL,10-MX_ADC3_Init-ADC3-false-HAL,11-SystemClock_Config-RCC-false-HAL,12-MX_TIM2_Init-TIM2-false-HAL RCC.48MHZClocksFreq_Value=48000000 RCC.AHBFreq_Value=168000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 @@ -460,6 +461,10 @@ SH.S_TIM1_CH2.0=TIM1_CH2,PWM Generation2 CH2 CH2N SH.S_TIM1_CH2.ConfNb=1 SH.S_TIM1_CH3.0=TIM1_CH3,PWM Generation3 CH3 CH3N SH.S_TIM1_CH3.ConfNb=1 +SH.S_TIM2_CH3.0=TIM2_CH3,PWM Generation3 CH3 +SH.S_TIM2_CH3.ConfNb=1 +SH.S_TIM2_CH4.0=TIM2_CH4,PWM Generation4 CH4 +SH.S_TIM2_CH4.ConfNb=1 SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface SH.S_TIM3_CH1.ConfNb=1 SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface @@ -497,6 +502,15 @@ TIM1.OffStateIDLEMode=TIM_OSSI_ENABLE TIM1.OffStateRunMode=TIM_OSSR_ENABLE TIM1.Period=TIM_PERIOD_CLOCKS TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE +TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 +TIM2.CounterMode=TIM_COUNTERMODE_CENTERALIGNED3 +TIM2.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,CounterMode,Period,OCMode_PWM-PWM Generation3 CH3,OCMode_PWM-PWM Generation4 CH4,OCPolarity_3,Pulse-PWM Generation4 CH4 +TIM2.OCMode_PWM-PWM\ Generation3\ CH3=TIM_OCMODE_PWM2 +TIM2.OCMode_PWM-PWM\ Generation4\ CH4=TIM_OCMODE_PWM2 +TIM2.OCPolarity_3=TIM_OCPOLARITY_LOW +TIM2.Period=TIM_PERIOD_CLOCKS +TIM2.Pulse-PWM\ Generation4\ CH4=TIM_PERIOD_CLOCKS+1 TIM3.EncoderMode=TIM_ENCODERMODE_TI12 TIM3.IC1Filter=4 TIM3.IC1Polarity=TIM_ICPOLARITY_RISING diff --git a/Src/gpio.c b/Src/gpio.c index 23707aa3..a14d7230 100644 --- a/Src/gpio.c +++ b/Src/gpio.c @@ -81,7 +81,7 @@ void MX_GPIO_Init(void) HAL_GPIO_WritePin(GPIOC, M1_DC_CAL_Pin|M0_DC_CAL_Pin, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, AUX_L_Pin|AUX_H_Pin|EN_GATE_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(EN_GATE_GPIO_Port, EN_GATE_Pin, GPIO_PIN_RESET); /*Configure GPIO pins : PCPin PCPin PCPin PCPin */ GPIO_InitStruct.Pin = M0_nCS_Pin|M1_nCS_Pin|M1_DC_CAL_Pin|M0_DC_CAL_Pin; @@ -96,12 +96,12 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /*Configure GPIO pins : PBPin PBPin PBPin */ - GPIO_InitStruct.Pin = AUX_L_Pin|AUX_H_Pin|EN_GATE_Pin; + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = EN_GATE_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + HAL_GPIO_Init(EN_GATE_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = M0_ENC_Z_Pin; diff --git a/Src/main.c b/Src/main.c index 0156ed10..344064e0 100644 --- a/Src/main.c +++ b/Src/main.c @@ -102,6 +102,7 @@ int main(void) MX_TIM4_Init(); MX_SPI3_Init(); MX_ADC3_Init(); + MX_TIM2_Init(); /* Initialize interrupts */ MX_NVIC_Init(); diff --git a/Src/tim.c b/Src/tim.c index a601e4d1..1cd9d28a 100644 --- a/Src/tim.c +++ b/Src/tim.c @@ -70,6 +70,7 @@ void OC4_PWM_Override(TIM_HandleTypeDef* htim) { /* USER CODE END 0 */ TIM_HandleTypeDef htim1; +TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim4; TIM_HandleTypeDef htim8; @@ -158,6 +159,48 @@ void MX_TIM1_Init(void) HAL_TIM_MspPostInit(&htim1); +} +/* TIM2 init function */ +void MX_TIM2_Init(void) +{ + TIM_MasterConfigTypeDef sMasterConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim2.Instance = TIM2; + htim2.Init.Prescaler = 0; + htim2.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3; + htim2.Init.Period = TIM_PERIOD_CLOCKS; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM2; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.Pulse = TIM_PERIOD_CLOCKS+1; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim2); + } /* TIM3 init function */ void MX_TIM3_Init(void) @@ -338,6 +381,22 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) } } +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspInit 0 */ + + /* USER CODE END TIM2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM2_CLK_ENABLE(); + /* USER CODE BEGIN TIM2_MspInit 1 */ + + /* USER CODE END TIM2_MspInit 1 */ + } +} + void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* tim_encoderHandle) { @@ -424,6 +483,27 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) /* USER CODE END TIM1_MspPostInit 1 */ } + else if(timHandle->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspPostInit 0 */ + + /* USER CODE END TIM2_MspPostInit 0 */ + + /**TIM2 GPIO Configuration + PB10 ------> TIM2_CH3 + PB11 ------> TIM2_CH4 + */ + GPIO_InitStruct.Pin = AUX_L_Pin|AUX_H_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM2_MspPostInit 1 */ + + /* USER CODE END TIM2_MspPostInit 1 */ + } else if(timHandle->Instance==TIM8) { /* USER CODE BEGIN TIM8_MspPostInit 0 */ @@ -493,6 +573,22 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) } } +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle) +{ + + if(tim_pwmHandle->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspDeInit 0 */ + + /* USER CODE END TIM2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM2_CLK_DISABLE(); + } + /* USER CODE BEGIN TIM2_MspDeInit 1 */ + + /* USER CODE END TIM2_MspDeInit 1 */ +} + void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* tim_encoderHandle) {