Files
FilmForge/Inc/board_config.h
T
hulk 8900240c65 Heater: PID v0.1.14 - banded controller + sensor glitch guards
Rebuild PID as three-zone banded controller: far field P/D full power,
2026-10-15 20:55:02 +08:00

195 lines
10 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.
#ifndef BOARD_CONFIG_H
#define BOARD_CONFIG_H
#ifndef CFG_DISABLE
#define CFG_DISABLE 0
#endif
#ifndef CFG_ENABLE
#define CFG_ENABLE 1
#endif
#define PROTOCOL_BOARD_TYPE 0x01 /**< 板卡类型标识 */
#include "version.h"
/* GD32_FLASH_SIZE_KB(512/1024/2048)由 CMake 按 GD32_FLASH_CAPACITY 注入,
切换容量:cmake --preset Debug -DGD32_FLASH_CAPACITY=xG */
/* >>>>>>>>>>>>>>>>>>>>[IIC TYPE DEFINE]<<<<<<<<<<<<<<<<<<<< */
#define SOFTWARE_IIC CFG_DISABLE // CFG_DISABLE: Hardware IIC; CFG_ENABLE: Software IIC
/* TODO: I2C 驱动尚未从 GD32E23x 工程移植,先保证工程可编译(见 AGENTS.md 进度清单) */
/* >>>>>>>>>>>>>>>>>>>>[DEBUG MODE]<<<<<<<<<<<<<<<<<<<< */
#define DEBUG_MODE CFG_ENABLE // CFG_DISABLE: Release Mode; CFG_ENABLE: Debug Mode(发布/量产前改回 CFG_DISABLE)
/* >>>>>>>>>>>>>>>>>>>>[COMMAND DEBUG]<<<<<<<<<<<<<<<<<<<< */
#define COM_DEBUG CFG_DISABLE // CFG_DISABLE: Command debug off; CFG_ENABLE: Command debug on
/* 命令协议框架已移植(Src/command.c,数据口 RS485),业务命令待定义 */
/* >>>>>>>>>>>>>>>>>>>>[DEBUG ASSERTIONS DEFINE]<<<<<<<<<<<<<<<<<<<< */
#define DEBUG_VERBOSE CFG_DISABLE // CFG_DISABLE: Verbose debug off; CFG_ENABLE: Verbose debug on
/* >>>>>>>>>>>>>>>>>>>>[SEGGER RTT DETECTION]<<<<<<<<<<<<<<<<<<<< */
#define SEGGER_RTT_DETECTION CFG_ENABLE // CFG_DISABLE: SEGGER RTT off; CFG_ENABLE: SEGGER RTT on
#if SEGGER_RTT_DETECTION == CFG_ENABLE
#include "SEGGER_RTT.h"
#define RTT_printf(ch, ...) SEGGER_RTT_printf(ch, __VA_ARGS__)
#define RTT_WriteString(ch, s) SEGGER_RTT_WriteString(ch, s)
#define RTT_PutChar(ch, c) SEGGER_RTT_PutChar(ch, c)
#else
#define RTT_printf(ch, ...)
#define RTT_WriteString(ch, s)
#define RTT_PutChar(ch, c)
#endif
/* >>>>>>>>>>>>>>>>>>>>[RS485 MODE]<<<<<<<<<<<<<<<<<<<< */
#define RS485_MODE CFG_ENABLE // CFG_DISABLE: RS485 off; CFG_ENABLE: RS485 on
/* GD32F4xx USART 无硬件 RS485 DE 驱动(E23x 特有),DE 引脚由 GPIO 手动控制 */
#if RS485_MODE == CFG_ENABLE
/* 数据口 RS485:USART0(PA9 TX / PA10 RX,AF7),DE 引脚 PA8(GPIO 手动切换收发) */
#define RS485_RCU RCU_USART0
#define RS485_PHY USART0
#define RS485_IRQ USART0_IRQn
#define RS485_GPIO_RCU RCU_GPIOA
#define RS485_GPIO_PORT GPIOA
#define RS485_TX_PIN GPIO_PIN_9
#define RS485_RX_PIN GPIO_PIN_10
#define RS485_BAUDRATE 115200U
#define RS485_DE_RCU RCU_GPIOA
#define RS485_DE_PORT GPIOA
#define RS485_DE_PIN GPIO_PIN_8
#endif
/* >>>>>>>>>>>>>>>>>>>>[NTC TEMPERATURE]<<<<<<<<<<<<<<<<<<<< */
#define NTC_MODE CFG_ENABLE // CFG_DISABLE: NTC off; CFG_ENABLE: NTC on
#if NTC_MODE == CFG_ENABLE
/* 10K NTC 测温:PC5(ADC0_IN15),硬件 10K 上拉,NTC 接 GND 侧 */
#define NTC_ADC_RCU RCU_ADC0
#define NTC_GPIO_RCU RCU_GPIOC
#define NTC_GPIO_PORT GPIOC
#define NTC_GPIO_PIN GPIO_PIN_5
#define NTC_ADC ADC0
#define NTC_ADC_CHANNEL ADC_CHANNEL_15
#define NTC_SAMPLETIME ADC_SAMPLETIME_480 /* 长采样时间(高阻 NTC 分压源) */
#define NTC_SAMPLE_COUNT 16U /* 单次测温的采样次数 */
#define NTC_TRIM_COUNT 2U /* 修剪均值:每端去掉的最大/最小样本数(抗毛刺) */
#define NTC_VREF 3.3f /* ADC 参考电压 V */
#define NTC_ADC_MAX 4095.0f /* 12bit ADC 满量程 */
#define NTC_R_PULL 10000.0f /* 上拉电阻(硬件) */
#define NTC_R25 10000.0f /* NTC 标称阻值 @25C */
#define NTC_T25 298.15f /* 标称温度 K */
#define NTC_B_VALUE 3950 /* B 值:3950 或 3435,按实测确认后修改 */
#endif
/******************************************************************************/
/* 调试串口:USART1(PA2 TX / PA3 RX,AF7),纯串口,非 RS485。
注意 GD32F4xx 外设编号比 STM32 整体小 1:PA2/PA3 是 USART1(=STM32 的 USART2),
PA9/PA10 才是 USART0(=STM32 的 USART1) */
#define UART_RCU RCU_USART1
#define UART_PHY USART1
#define UART_IRQ USART1_IRQn
#define UART_GPIO_RCU RCU_GPIOA
#define UART_GPIO_PORT GPIOA
#define UART_TX_PIN GPIO_PIN_2
#define UART_RX_PIN GPIO_PIN_3
#define UART_BAUDRATE 115200U
/* USART中断处理函数声明(USART0 的处理在 rs485.c,USART1 的处理在 uart.c) */
void rs485_irq_handler(void);
void usart1_irq_handler(void);
/******************************************************************************/
/* I2C0: PB6 SCL / PB7 SDA, AF4 */
#define RCU_GPIO_I2C RCU_GPIOB
#define RCU_I2C RCU_I2C0
#define I2C_SCL_PORT GPIOB
#define I2C_SCL_PIN GPIO_PIN_6
#define I2C_SDA_PORT GPIOB
#define I2C_SDA_PIN GPIO_PIN_7
#define I2C_GPIO_AF GPIO_AF_4
/******************************************************************************/
/* LED: PA15(demo 板实测引脚,低电平点亮按原理图确认) */
#define LED_RCU RCU_GPIOA
#define LED_PORT GPIOA
#define LED_PIN GPIO_PIN_15
/******************************************************************************/
/* 加热控制参数(M3 开关 / M4 目标温度设定) */
#define HEATER_TEMP_MIN 0U /* 目标温度下限(整数摄氏度) */
#define HEATER_TEMP_MAX 200U /* 目标温度上限(整数摄氏度) */
/******************************************************************************/
/* >>>>>>>>>>>>>>>>>>>>[POWER HOLD(PMOS 自锁保持脚)]<<<<<<<<<<<<<<<<<<<< */
/* PA11:上电保持脚——main 入口即初始化为推挽输出高(先于一切外设初始化),
维持 PMOS 导通;复位期间由外部电路(按键/上拉)保持。 */
#define PWR_HOLD_RCU RCU_GPIOA
#define PWR_HOLD_PORT GPIOA
#define PWR_HOLD_PIN GPIO_PIN_11
/* >>>>>>>>>>>>>>>>>>>>[HEATER OUTPUT(加热驱动 PB12=HEAT_EN)]<<<<<<<<<<<<<<<<<<<< */
/* PB12:高 = 加热开,低 = 关(2N7002K 电平转换 → VBE2412 PMOS → 24V 加热回路)。
开关频率限制:慢 PWM 周期 1s、占空比 10% 步进——脉宽恒 >=100ms,开关频率恒 1Hz。 */
#define HEATER_EN_RCU RCU_GPIOB
#define HEATER_EN_PORT GPIOB
#define HEATER_EN_PIN GPIO_PIN_12
#define HEATER_PWM_PERIOD_MS 2000U /* PWM 载波周期(2s,载波 0.5Hz) */
#define HEATER_PWM_STEP_PCT 5U /* 占空比步进(每档脉宽 = 100ms,维持最小开关频率约束) */
#define HEATER_PID_PERIOD_MS 500U /* PID 计算周期 */
#define HEATER_PID_KP 8.0f /* PID 参数:带外下方 P 拉回增益(带内 P 退出) */
#define HEATER_PID_KI 0.15f /* 输出映射:u 贡献 = KI*I;I 全区域对称慢速学习 */
#define HEATER_PID_KD 30.0f /* 微分(仅带外下方起作用):爬升段提前退功率 */
#define HEATER_PID_BAND_C 0.3f /* 作用分区带宽:带内恒功率(Ki*I),带外
开关+P 修正——波动幅度被物理限制在
带宽+滑行量 */
#define HEATER_PID_INTEG_GAIN_IN 0.30f /* 带内/带外下方积分学习增益(对称):
I += err*GAIN;0.15 时 I 充满需 ~400s,
判定窗内驻留点偏低 0.5C(ASSIST 补缺口
但驻留偏欠温),加倍后 ~200s 到位 */
#define HEATER_PID_INTEG_BLEED 0.30f /* 带外上方每拍固定回退(=GAIN,对称) */
#define HEATER_NTC_SLEW_C 0.5f /* NTC 读数斜率限幅(C/PID 拍):单拍变化超过
此值判为读数毛刺(真实热速率 <=0.2C/拍),
沿限幅值过渡、连续 2 拍超限放行真实值 */
#define HEATER_NTC_JUMP_C 1.5f /* 秒级坏值冻结阈值:斜率超限持续且累计偏差超过
此值时冻结滤波值(真机焊接点接触不良会产出
-2.5C/4.5s 塌陷与顶格卡死,中值滤波挡不住) */
#define HEATER_PID_I_MAX 400.0f /* 积分钳位上限:KI*I_MAX = 60% 占空(120C 模具
维持功率余量);下限恒为 0 */
#define HEATER_FAULT_RESTORE_MAX_S 3.0f /* NTC 短故障(去抖确认后恢复)无扰还原积分的
时长上限;超过则从零重建(安全优先) */
#define HEATER_RAMP_CPS 2.0f /* 内部设定值斜坡速率(℃/s):实测 0.25 时斜坡
本身就是瓶颈(9C 走 36s,加热器只是"追"设定点);
2.0 基本不设障,到达速度由加热功率与温和带
上限决定。分区控制器爬升段不积分,快斜坡
不会像旧连续 PID 那样预充积分导致过冲 */
#define HEATER_SLOWBAND_C 3.0f /* 温和带宽度:缓爬段(原 7C 太宽,25% 上限下
净升温仅 0.08C/s,爬升 234s 的主瓶颈) */
#define HEATER_SLOWBAND_DUTY 35U /* 近场缓爬辅助满档(%):err=+SLOWBAND_C 处
的推力,随 err 线性退闸(提供与积分成熟度
无关的确定爬升推力,修复最后 2C 爬 141s) */
#define HEATER_NEAR_MAX_DUTY 50U /* 近场扩展区推力上限(%):快而不过冲 */
#define HEATER_OVERTEMP_C 150.0f /* 过温强制关断阈值(滞回保护) */
#define HEATER_OVERTEMP_HYST 5.0f /* 过温恢复滞回 */
/******************************************************************************/
#define DEBUG_UART USART1
#endif //BOARD_CONFIG_H