MVBMS - pwm generation code added
This commit is contained in:
		@ -13,13 +13,14 @@
 | 
			
		||||
#include "stm32f3xx_hal.h"
 | 
			
		||||
#include "stm32f3xx_hal_can.h"
 | 
			
		||||
#include "stm32f3xx_hal_def.h"
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  uint8_t pwrgndfans;
 | 
			
		||||
} rx_status_frame;
 | 
			
		||||
uint8_t txbuffer;
 | 
			
		||||
uint8_t rxbuffer;
 | 
			
		||||
void ams_can_init(CAN_HandleTypeDef* hcan);
 | 
			
		||||
 | 
			
		||||
void ams_can_handle_ams_msg(CAN_RxHeaderTypeDef* header, uint8_t* data);
 | 
			
		||||
 | 
			
		||||
void ams_can_send_status();
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Send an AMS Error via CAN.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										9
									
								
								Core/Inc/PWM_Control.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Core/Inc/PWM_Control.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
#ifndef INC_PWM_CONTROL_H_
 | 
			
		||||
#define INC_PWM_CONTROL_H_
 | 
			
		||||
 | 
			
		||||
#include "stm32f3xx_hal_conf.h"
 | 
			
		||||
 | 
			
		||||
void PWMControl_UpdatePWMs(uint8_t pwrgndfans );
 | 
			
		||||
void PWMControl_init(TIM_HandleTypeDef* timer3);
 | 
			
		||||
 | 
			
		||||
#endif /* INC_CHANNEL_CONTROL_H_ */
 | 
			
		||||
@ -63,10 +63,6 @@ void Error_Handler(void);
 | 
			
		||||
#define RELAY_EN_GPIO_Port GPIOA
 | 
			
		||||
#define _60V_EN_Pin GPIO_PIN_1
 | 
			
		||||
#define _60V_EN_GPIO_Port GPIOA
 | 
			
		||||
#define PWM_PG_FAN1_Pin GPIO_PIN_2
 | 
			
		||||
#define PWM_PG_FAN1_GPIO_Port GPIOA
 | 
			
		||||
#define PWM_PG_FAN2_Pin GPIO_PIN_3
 | 
			
		||||
#define PWM_PG_FAN2_GPIO_Port GPIOA
 | 
			
		||||
#define CSB_Pin GPIO_PIN_4
 | 
			
		||||
#define CSB_GPIO_Port GPIOA
 | 
			
		||||
#define STATUS_LED_R_Pin GPIO_PIN_0
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@
 | 
			
		||||
#define INITIAL_COMMAND_PEC        0x0010
 | 
			
		||||
#define INITIAL_DATA_PEC           0x0010 
 | 
			
		||||
#define ADBMS_SPI_TIMEOUT          100 // Timeout in ms
 | 
			
		||||
#warning ask about the timeout value
 | 
			
		||||
 | 
			
		||||
SPI_HandleTypeDef* adbmsspi;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -24,11 +24,14 @@
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#define CAN_ID_SLAVE_PANIC       0x009
 | 
			
		||||
#define CAN_ID_SLAVE_STATUS_BASE 0x080
 | 
			
		||||
#define CAN_ID_SLAVE_LOG_BASE    0x600
 | 
			
		||||
 | 
			
		||||
rx_status_frame rxstate = {};
 | 
			
		||||
volatile uint8_t canmsg_received = 0;
 | 
			
		||||
void ams_can_init(CAN_HandleTypeDef* hcan) { ftcan_init(hcan); }
 | 
			
		||||
 | 
			
		||||
#define ITER_COUNT 10
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										31
									
								
								Core/Src/PWM_Control.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								Core/Src/PWM_Control.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,31 @@
 | 
			
		||||
#include "PWM_Control.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t timer2_running = 0;
 | 
			
		||||
TIM_HandleTypeDef* pwmtimer2;
 | 
			
		||||
 | 
			
		||||
void PWMControl_init( TIM_HandleTypeDef* timer2) 
 | 
			
		||||
{
 | 
			
		||||
  pwmtimer2 = timer2;
 | 
			
		||||
  PWMControl_UpdatePWMs(0);
 | 
			
		||||
}
 | 
			
		||||
                         
 | 
			
		||||
 | 
			
		||||
 void PWMControl_UpdatePWMs(uint8_t pwrgndfans)
 | 
			
		||||
 
 | 
			
		||||
 {
 | 
			
		||||
 | 
			
		||||
  pwmtimer2->Instance->CCR3 = pwrgndfans << 8;
 | 
			
		||||
 | 
			
		||||
  if (timer2_running) {
 | 
			
		||||
    if ((pwrgndfans == 0)) {
 | 
			
		||||
      timer2_running = 0;
 | 
			
		||||
      HAL_TIM_PWM_Stop(pwmtimer2, TIM_CHANNEL_3); 
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if ( (pwrgndfans != 0)) {
 | 
			
		||||
      timer2_running = 1;
 | 
			
		||||
      HAL_TIM_PWM_Start(pwmtimer2, TIM_CHANNEL_3);       
 | 
			
		||||
}
 | 
			
		||||
} 
 | 
			
		||||
}               
 | 
			
		||||
@ -30,6 +30,8 @@
 | 
			
		||||
#include "errors.h"
 | 
			
		||||
#include "stm32f3xx_hal.h"
 | 
			
		||||
#include "stm32f3xx_hal_gpio.h"
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
/* USER CODE END Includes */
 | 
			
		||||
 | 
			
		||||
/* Private typedef -----------------------------------------------------------*/
 | 
			
		||||
@ -55,7 +57,7 @@ I2C_HandleTypeDef hi2c1;
 | 
			
		||||
SPI_HandleTypeDef hspi1;
 | 
			
		||||
 | 
			
		||||
TIM_HandleTypeDef htim1;
 | 
			
		||||
TIM_HandleTypeDef htim15;
 | 
			
		||||
TIM_HandleTypeDef htim2;
 | 
			
		||||
 | 
			
		||||
UART_HandleTypeDef huart1;
 | 
			
		||||
 | 
			
		||||
@ -69,9 +71,9 @@ static void MX_GPIO_Init(void);
 | 
			
		||||
static void MX_CAN_Init(void);
 | 
			
		||||
static void MX_I2C1_Init(void);
 | 
			
		||||
static void MX_SPI1_Init(void);
 | 
			
		||||
static void MX_TIM15_Init(void);
 | 
			
		||||
static void MX_USART1_UART_Init(void);
 | 
			
		||||
static void MX_TIM1_Init(void);
 | 
			
		||||
static void MX_TIM2_Init(void);
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
@ -113,9 +115,9 @@ int main(void)
 | 
			
		||||
  MX_CAN_Init();
 | 
			
		||||
  MX_I2C1_Init();
 | 
			
		||||
  MX_SPI1_Init();
 | 
			
		||||
  MX_TIM15_Init();
 | 
			
		||||
  MX_USART1_UART_Init();
 | 
			
		||||
  MX_TIM1_Init();
 | 
			
		||||
  MX_TIM2_Init();
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  tmp1075_init(&hi2c1);
 | 
			
		||||
  AMS_Init(&hspi1);
 | 
			
		||||
@ -148,6 +150,9 @@ int main(void)
 | 
			
		||||
      HAL_GPIO_WritePin(STATUS_LED_R_GPIO_Port, STATUS_LED_R_Pin, relay_target ? GPIO_PIN_RESET : GPIO_PIN_SET);
 | 
			
		||||
      target_time = HAL_GetTick() + 10000;
 | 
			
		||||
      relay_target = !relay_target;
 | 
			
		||||
            ChannelControl_UpdatePWMs( x.pwrgndfans )
 | 
			
		||||
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE END 3 */
 | 
			
		||||
@ -397,72 +402,51 @@ static void MX_TIM1_Init(void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief TIM15 Initialization Function
 | 
			
		||||
  * @brief TIM2 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void MX_TIM15_Init(void)
 | 
			
		||||
static void MX_TIM2_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM15_Init 0 */
 | 
			
		||||
  /* USER CODE BEGIN TIM2_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_Init 0 */
 | 
			
		||||
  /* USER CODE END TIM2_Init 0 */
 | 
			
		||||
 | 
			
		||||
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 | 
			
		||||
  TIM_OC_InitTypeDef sConfigOC = {0};
 | 
			
		||||
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM15_Init 1 */
 | 
			
		||||
  /* USER CODE BEGIN TIM2_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_Init 1 */
 | 
			
		||||
  htim15.Instance = TIM15;
 | 
			
		||||
  htim15.Init.Prescaler = 0;
 | 
			
		||||
  htim15.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim15.Init.Period = 65535;
 | 
			
		||||
  htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim15.Init.RepetitionCounter = 0;
 | 
			
		||||
  htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim15) != HAL_OK)
 | 
			
		||||
  /* USER CODE END TIM2_Init 1 */
 | 
			
		||||
  htim2.Instance = TIM2;
 | 
			
		||||
  htim2.Init.Prescaler = 0;
 | 
			
		||||
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim2.Init.Period = 65535;
 | 
			
		||||
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 | 
			
		||||
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim15, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
 | 
			
		||||
  sConfigOC.Pulse = 0;
 | 
			
		||||
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 | 
			
		||||
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 | 
			
		||||
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim15, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim15, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 | 
			
		||||
  sBreakDeadTimeConfig.DeadTime = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakFilter = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim15, &sBreakDeadTimeConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN TIM15_Init 2 */
 | 
			
		||||
  /* USER CODE BEGIN TIM2_Init 2 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_Init 2 */
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim15);
 | 
			
		||||
  /* USER CODE END TIM2_Init 2 */
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim2);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -540,6 +524,12 @@ static void MX_GPIO_Init(void)
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin : PA3 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_3;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : STATUS_LED_R_Pin STATUS_LED_B_Pin STATUS_LED_G_Pin PRECHARGE_EN_Pin
 | 
			
		||||
                           AUX_IN_Pin */
 | 
			
		||||
  GPIO_InitStruct.Pin = STATUS_LED_R_Pin|STATUS_LED_B_Pin|STATUS_LED_G_Pin|PRECHARGE_EN_Pin
 | 
			
		||||
 | 
			
		||||
@ -305,16 +305,16 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM15)
 | 
			
		||||
  else if(htim_pwm->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspInit 0 */
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspInit 0 */
 | 
			
		||||
  /* USER CODE END TIM2_MspInit 0 */
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_TIM15_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspInit 1 */
 | 
			
		||||
    __HAL_RCC_TIM2_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspInit 1 */
 | 
			
		||||
  /* USER CODE END TIM2_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -342,27 +342,26 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim->Instance==TIM15)
 | 
			
		||||
  else if(htim->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspPostInit 0 */
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspPostInit 0 */
 | 
			
		||||
  /* USER CODE END TIM2_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
    /**TIM15 GPIO Configuration
 | 
			
		||||
    PA2     ------> TIM15_CH1
 | 
			
		||||
    PA3     ------> TIM15_CH2
 | 
			
		||||
    /**TIM2 GPIO Configuration
 | 
			
		||||
    PA2     ------> TIM2_CH3
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = PWM_PG_FAN1_Pin|PWM_PG_FAN2_Pin;
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_2;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF9_TIM15;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
 | 
			
		||||
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspPostInit 1 */
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspPostInit 1 */
 | 
			
		||||
  /* USER CODE END TIM2_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -385,16 +384,16 @@ void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM15)
 | 
			
		||||
  else if(htim_pwm->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspDeInit 0 */
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspDeInit 0 */
 | 
			
		||||
  /* USER CODE END TIM2_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM15_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspDeInit 1 */
 | 
			
		||||
    __HAL_RCC_TIM2_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspDeInit 1 */
 | 
			
		||||
  /* USER CODE END TIM2_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user