- 打卡等级:以坛为家I
- 打卡总天数:363
- 最近打卡:2026-04-30 06:16:54
已绑定手机
金牌会员
- 积分
- 1401
|
发表于 2026-4-21 16:42:05
|
显示全部楼层
Sys_Sample.c 逐行超详细解释(51 单片机 / 嵌入式 采样程序)
我给你逐行、逐句、逐函数彻底讲透,你是新手也能完全看懂。
这份代码是电烙铁温控的采样核心:采集电源电压、室温、烙铁温度,带滤波 + 查表。
0. 文件开头(版权 / 版本)
c
运行
/*********************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2017-2018, XinJiang University. All right reserved
*
* 文件名 : Sys_Sample.c
* 描述 : 系统采样
*
* 版本 : V3.3.4
* 作者 : 王志浩
* 日期 : 2017-10-22
*
* 以下全部程序之著作权归属新疆大学所有...
**********************************************************************************/
解释:
这是注释,不参与程序运行。
作用:记录文件用途、作者、版权、版本。
1. 头文件 + 全局变量
c
运行
#include "config.h"
解释:
引入配置文件,里面定义了 u8 u16 ADC通道 PWM 等。
c
运行
float RoomTemp = 25.0f;
解释:
全局浮点变量,存储当前室温,默认 25℃。
c
运行
float VCCVoltage = 0.0f;
解释:
全局浮点变量,存储电源电压(24V)。
2. 中值滤波函数(采样降噪)
c
运行
static u16 mid_filter(void)
解释:
静态函数,只能本文件用。
功能:多次采样求平均,过滤噪声。
c
运行
{
u16 sum = 0;
解释:定义 16 位变量,用来累加采样值。
c
运行
u8 temp;
解释:循环用的 8 位变量。
c
运行
for(temp = 0; temp < NUM; temp++)
{
sum += Get_ADC10bitResult(ADC_IRON);
}
解释:
循环采样 NUM 次 烙铁温度 ADC 值,全部累加到 sum。
c
运行
return(sum >> DIV);
}
解释:
sum >> DIV = 右移 DIV 位 = 除以 2^DIV
用移位代替除法,单片机运行更快。
3. 读取 24V 电源电压
c
运行
float GetVoltage(void)
{
return (float)Get_ADC10bitResult(ADC_VCC) / 5550.0f * (float)FAC_DATA_Table.Adjust_s.Voltage;
}
解释:
读取电源电压通道 ADC 值
除以 5550 归一化
乘以校准系数,得到真实 24V 电压值
返回浮点型电压
4. NTC 室温对照表(-10℃ ~ 50℃)
c
运行
unsigned int code NTCTAB[61] =
{
324,318,...55 //共61个值
};
解释:
code = 存在单片机ROM(程序区),不占 RAM。
数组含义:
下标 0 → -10℃
下标 1 → -9℃
...
下标 60 → 50℃
数值是 NTC 热敏电阻对应的 ADC 值。
5. 读取室温(二分法查表)
c
运行
float GetRoomTemp(void)
{
u16 temp=0;
unsigned char det = 60,head = 0,tail = 60,mid = 0;
解释:
head:表开头(-10℃)
tail:表结尾(50℃)
mid:中间值
det:差值
c
运行
temp = Get_ADC10bitResult(ADC_ROOMTEMP);
解释:读取室温 NTC 的 ADC 值。
c
运行
if(temp >= NTCTAB[head])
{
return -10.0f;
}
解释:
ADC 值比 -10℃ 还大 → 温度 ≤ -10℃
c
运行
else if(temp <= NTCTAB[tail])
{
return 50.0f;
}
解释:
ADC 值比 50℃ 还小 → 温度 ≥ 50℃
c
运行
else
{
while(det > 1)
{
mid = (head + tail)/2;
if(temp > (NTCTAB[mid]))
{
tail = mid;
}
else
{
head = mid;
}
det = tail - head;
}
解释:
二分法快速查表,找到当前 ADC 值对应的温度下标。
c
运行
return ((float)(head-10) / 100.0f * (float)FAC_DATA_Table.Adjust_s.Temp);
}
}
解释:
head 是温度下标
head -10 就是真实温度(0→-10℃,10→0℃,60→50℃)
做精度校准
返回室温浮点值
6. 读取烙铁温度(核心温控函数)
c
运行
float GetIronTemp(unsigned char num)
解释:
输入:烙铁头编号(1-4)
输出:烙铁温度(float)
c
运行
{
u16 temp=0;
unsigned char det = 6,head = 0,tail = 6,mid = 0,i=0;
解释:二分法查表变量。
c
运行
PWM.Run = Disable;
IRON = 0;
解释:
关 PWM 加热 → 关烙铁
防止加热时干扰 ADC 采样,必须先断电再采温度。
c
运行
temp = mid_filter();
解释:调用滤波函数,采平均 ADC 值。
c
运行
if(temp < FAC_DATA_Table.Heater_Tip[num-1][tail])
{
while(det > 1)
{
mid = (head + tail) / 2;
if(temp < (FAC_DATA_Table.Heater_Tip[num-1][mid]))
{
tail = mid;
}
else
{
head = mid;
}
det = tail - head;
}
解释:
同样二分法查表,找到烙铁温度对应的区间。
c
运行
return RoomTemp + 100 * head + ((temp - ...) * 100 / (...));
}
解释:
线性插值计算精准温度
公式 = 室温 + 100℃档位 + 插值小数温度
最终得到真实烙铁温度。
c
运行
else
{
return 599.0f;
}
}
解释:
超出温度表范围 → 直接返回 599℃(最高温)
🔥 整份代码一句话总结
这是电烙铁控制器的采样核心:
采 24V 电压
采室温(NTC + 二分查表)
采烙铁温度(关加热→滤波→二分查表→插值算精准温度)
全部给温控逻辑使用
你最需要记住的 4 个关键点
mid_filter() = 多次采样求平均,降噪
NTCTAB[] = 室温 ADC 对照表
二分法 = 快速查表,不浪费 CPU
读烙铁温度前必须 关加热(IRON=0),否则采样不准 |
|