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),否則采樣不準 |