polarimeter_software/User/board/bsp_tec.c

178 lines
4.7 KiB
C
Raw Normal View History

/*
* @Author: mypx
* @Date: 2025-10-15 13:03:38
* @LastEditTime: 2025-10-17 13:37:16
* @LastEditors: mypx mypx_coder@163.com
* @Description:
*/
#include "bsp_tec.h"
#include "main.h"
#include "spi.h"
#include "tim.h"
/*
*
* PE8-TEC-IN1(left) TIM1_CH1N默认为PE8
* PA8-TEC-IN2(right) TIM1_CH1默认为PA9,PA8
*
* PE8也要做映射使
*
* 1. PE8和PA8为TIM1_CH1N和TIM1_CH1
* 2. 使PE8和PA8的TIM1_CH1N和TIM1_CH1
* stm32cubemx 使TIM1_CH1N和TIM1_CH1默认的管脚为REMAP后的管脚bug
*
*/
static void stop_tec_pwm(void)
{
// 一块关闭,避免左右搞混没关掉
HAL_TIM_PWM_Stop(&TEC_TIM, TIM_CHANNEL_1);
HAL_TIMEx_PWMN_Stop(&TEC_TIM, TIM_CHANNEL_1);
}
static void tec_sd_disable(void)
{
HAL_GPIO_WritePin(GPIOA, TEC_LEFT_SD_Pin | TEC_RIGHT_SD_Pin, GPIO_PIN_RESET);
}
static void left_tec_sd_enable(void)
{
HAL_GPIO_WritePin(GPIOA, TEC_LEFT_SD_Pin, GPIO_PIN_SET);
}
static void right_tec_sd_enable(void)
{
HAL_GPIO_WritePin(GPIOA, TEC_RIGHT_SD_Pin, GPIO_PIN_SET);
}
// PE8-TEC-IN1(left) TIM1_CH1N, 需要做full remap
static void left_tec_reconfig_pwm(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Stop PWM outputs first to avoid both outputs being active during transition */
stop_tec_pwm();
/* Ensure GPIO clocks */
__HAL_RCC_GPIOE_CLK_ENABLE();
/* Enable TIM1 full remap if you need the remapped mapping (CubeMX generated code might expect this)
Note: remap affects mapping for all TIM1 channels - do this before initializing the GPIOs */
__HAL_AFIO_REMAP_TIM1_ENABLE();
/* Deinit any previous GPIO config on PE8/PA8 to be safe */
HAL_GPIO_DeInit(GPIOE, GPIO_PIN_8);
HAL_GPIO_DeInit(GPIOA, TEC_RIGHT_IN_Pin);
/**TIM1 GPIO Configuration
PE8 ------> TIM1_CH1N
*/
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/*
* Hardware note: main output (CH1) and complementary output (CH1N) cannot
* be enabled at the same time on this board. For the 'left' mapping (PE8)
* we only enable the complementary output (CH1N) and ensure CH1 is stopped.
*/
/* Ensure main channel is off, then start complementary output only */
HAL_TIMEx_PWMN_Start(&TEC_TIM, TIM_CHANNEL_1);
}
// PA8-TEC-IN2(right) TIM1_CH1,默认CH1不需要映射
void right_tec_reconfig_pwm(void)
{
stop_tec_pwm();
/* Disable TIM1 remap so TIM1_CH1 maps to the default (PA8/PA9 depending on device)
Do this before re-initializing the GPIO so HAL init uses the correct port/pin */
__HAL_AFIO_REMAP_TIM1_DISABLE();
/* Deinit any previous GPIO config on PE8/PA8 to be safe */
HAL_GPIO_DeInit(GPIOE, GPIO_PIN_8);
HAL_GPIO_DeInit(GPIOA, TEC_RIGHT_IN_Pin);
/* Re-run the post-init which will configure PA8 as AF (HAL_TIM_MspPostInit uses TEC_RIGHT_IN_Pin) */
HAL_TIM_MspPostInit(&TEC_TIM);
/*
* For the 'right' mapping (PA8) we only enable the main output (CH1) and
* ensure the complementary output (CH1N) is stopped to avoid hardware conflict.
*/
HAL_TIM_PWM_Start(&TEC_TIM, TIM_CHANNEL_1);
}
void bsp_fan_start(void)
{
HAL_GPIO_WritePin(FAN_CONTROL_GPIO_Port, FAN_CONTROL_Pin, GPIO_PIN_SET);
}
void bsp_fan_stop(void)
{
HAL_GPIO_WritePin(FAN_CONTROL_GPIO_Port, FAN_CONTROL_Pin, GPIO_PIN_RESET);
}
void bsp_left_tec_open(void)
{
tec_sd_disable();
left_tec_reconfig_pwm();
left_tec_sd_enable();
}
void bsp_right_tec_open(void)
{
tec_sd_disable();
right_tec_reconfig_pwm();
right_tec_sd_enable();
}
static void left_tec_adjust_duty_cycle(uint32_t duty_cycle)
{
__HAL_TIM_SET_COMPARE(&TEC_TIM, TIM_CHANNEL_1, duty_cycle);
}
static void right_tec_adjust_duty_cycle(uint32_t duty_cycle)
{
__HAL_TIM_SET_COMPARE(&TEC_TIM, TIM_CHANNEL_1, duty_cycle);
}
void bsp_tec_cooling_open(void)
{
bsp_left_tec_open();
}
void bsp_tec_heating_open(void)
{
bsp_right_tec_open();
}
// pwm: 0.0 ~ 1.0
void bsp_tec_cooling_adjust(float pwm)
{
extern TIM_HandleTypeDef TEC_TIM;
uint32_t max_period = __HAL_TIM_GET_AUTORELOAD(&TEC_TIM);
left_tec_adjust_duty_cycle((uint32_t)(pwm * max_period));
}
// pwm: 0.0 ~ 1.0
void bsp_tec_heating_adjust(float pwm)
{
extern TIM_HandleTypeDef TEC_TIM;
uint32_t max_period = __HAL_TIM_GET_AUTORELOAD(&TEC_TIM);
right_tec_adjust_duty_cycle((uint32_t)(pwm * max_period));
}
void bsp_tec_close(void)
{
stop_tec_pwm();
tec_sd_disable();
}
void bsp_tec_init(void)
{
MX_SPI3_Init();
MX_TIM1_Init();
}