1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
while (1)
{
// --- 1. 信号采集与双重滤波 ---
uint32_t sum_A = 0;
for(int i = 0; i < SAMPLES; i++) {
sum_A += adc_buffer[i * CHANNELS];
}
// 原始电压计算 (基于 3.3V 理论值,若需更准可换回 VREFINT 公式)
float raw_volt_A = (float)sum_A / SAMPLES * 3.3f / 4095.0f;
// 一阶滞后滤波
filter_volt_A = alpha * raw_volt_A + (1.0f - alpha) * filter_volt_A;
float volt = filter_volt_A;
// --- 2. 零点校准逻辑 (PB0) ---
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
{
HAL_Delay(20); // 初步去抖
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET)
{
zero_offset_volt = volt; // 记录当前电压为新零点
// 亮灯反馈
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
// 在零点校准成功后的位置
zero_offset_volt = volt;
Save_Params_To_Flash(zero_offset_volt, slope_k); // 同步保存到 FLASH
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET); // 等待松开
}
}
// --- 3. 满量程校准逻辑 (PB1) ---
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
{
HAL_Delay(20);
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)
{
// 核心逻辑:斜率 k = 标准压力 / (当前满量程电压 - 零点电压)
float v_diff = volt - zero_offset_volt;
if (v_diff > 0.1f) // 安全检查:确保满位电压确实大于零点电压
{
slope_k = P_NOMINAL / v_diff;
// 在满量程校准成功后的位置
slope_k = P_NOMINAL / v_diff;
Save_Params_To_Flash(zero_offset_volt, slope_k); // 同步保存到 FLASH
// 成功后快闪两次灯
for(int i=0; i<4; i++) {
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(100);
}
}
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET);
}
}
// --- 4. 最终工业参数换算 ---
// 计算电流 (mA)
float current_mA = (volt / R_SAMPLE) * 1000.0f;
// 计算校准后的压力
float calibrated_pressure = (volt - zero_offset_volt) * slope_k;
// 负数截断保护
if (calibrated_pressure < 0.0f) calibrated_pressure = 0.0f;
// --- 5. VOFA+ 数据输出 ---
// 通道说明:1.电流(mA), 2.校准后压力(MPa), 3.零点偏置电压(V), 4.当前斜率k
printf("%.2f,%.3f,%.3f,%.4f\n",
current_mA,
calibrated_pressure,
zero_offset_volt,
slope_k);
HAL_Delay(100); // 10Hz 刷新率,适合观察
}
|