polarimeter_software/User/board/bsp_tec.c

178 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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();
}