|
單片機(jī)型號為STC/AI 8G1K08A
工程前半部分做了市電的過零檢測,P33引腳通過限流電阻、RC濾波結(jié)構(gòu)直連市交流電(火線),并開啟外部中斷INT1,檢測到下降沿后,在INT1中斷內(nèi)開啟定時器進(jìn)行延時補償(考慮到繼電器響應(yīng)到吸合需要一定時間)
為了驗證延時的效果,使用單片機(jī)P32端口監(jiān)控用電器端的電壓情況(反饋腳),繼電器吸合后用電器與火線相連接入市電,那么,只要測量P32端口初次通電的脈沖寬度,即可確認(rèn)火線進(jìn)入用電器端的初始相位
測量脈沖寬度的方法是,當(dāng)P32端口(ADC2)采集到高電平時,立即開啟PCA計數(shù),記錄初始PCA數(shù)值,并配置為下降沿中斷,中斷觸發(fā)后記錄當(dāng)前計數(shù)值,兩者相減,即為高電平持續(xù)時間,即脈沖寬度
理想情況下,經(jīng)定時器延時補償 T1 + 繼電器響應(yīng)時間 T2 后,如果在P32端口 測量初次通電的脈沖寬度為 10 ms(近似),說明繼電器觸頭導(dǎo)通瞬間,恰好正是市電零點
51hei圖片_20250606084611.jpg (3.85 MB, 下載次數(shù): 0)
下載附件
測量模型
2025-6-6 09:23 上傳
51hei圖片_20250606084629.jpg (3.99 MB, 下載次數(shù): 0)
下載附件
P33 P32引腳波形
2025-6-6 09:23 上傳
PCA 配置:
void PCA_Init(void){
P_SW1 &= 0x00; //P_SW1 是外設(shè)功能腳切換寄存器,可以控制相關(guān)引腳啟用串口、PCA、SPI等功能,本例中置位 00 ,使得CCP0功能映射到 P3.2 端口上,其實也是CCP0的默認(rèn)引腳
CMOD = 0x0C; //PCA 模式寄存器,[3:1] 控制PCA 計數(shù)脈沖源選擇位即單次計數(shù)的周期 末位ECF-是否允許PCA 計數(shù)器溢出中斷,0-禁止 1-使能
//0000 1100 系統(tǒng)時鐘/6 禁止計數(shù)器溢出中斷
CCON = 0x00; //B7-CF:PCA計數(shù)器溢出中斷標(biāo)志 B6-CR:PCA計數(shù)器允許控制位 B[2:0]-CCFn PCA模塊中斷標(biāo)志
//PCA 控制寄存器 0000 0000 清除所有標(biāo)志位
CL=CH=0; //清零PCA 計數(shù)器
EA = 1;
}
PCA中斷服務(wù)函數(shù):
void PCA_ISP() interrupt 7{
unsigned int capture=0; //記錄此時進(jìn)入中斷的時間節(jié)點
if(CCF0){ //PCA 模塊只有一個中斷向量而包含多個中斷源, 需要先分辨中斷源再進(jìn)行中斷操作
CCF0=0; //清除標(biāo)志
capture=((unsigned int)CH) <<8|(unsigned int)CL;
T_end = capture;
T_state = 1;
CR=0;
}
}
PCA計數(shù)調(diào)用:
if(check_flag){
Va=ADC_Read(2); //ADC采樣P32端口電壓
if(Va>370){ //采樣值370轉(zhuǎn)換為電壓值為 1.2V 只有當(dāng)檢測到高電平時才會啟用PCA 計數(shù)功能
CR=1;
T_start = ((unsigned int)CH )<<8|(unsigned int)CL; //記錄當(dāng)前計數(shù)值
CCAPM0 = 0x11; //CCAPMn PCA模塊模式控制寄存器 詳情參見數(shù)據(jù)手冊
//B5-CCAPPn 允許 PCA模塊n進(jìn)行上升沿捕獲; B4-CCAPNn 允許 PCA模塊n進(jìn)行下降沿捕獲; B0 ECCFn 允許 PCA模塊n 的匹配/捕獲中斷
//0001 0001 下降沿捕獲并使能中斷
check_flag=0;
}
}
if(T_state){
if(T_start<=T_end)
high_time=T_end-T_start;
else
high_time=65536-T_start+T_end;
T_state=0;
}
if(timer>=(high_time/100)){ //PCA計數(shù)周期是1us,定時器變量timer 的計時基準(zhǔn)是100ms,high_time/1000得到ms量級,將ms量級的數(shù)字,乘以1000轉(zhuǎn)換為秒量級,觀察燈亮?xí)r間(秒級別),即可獲得脈沖寬度
state=OFF;
timer=0;
}
經(jīng)測試,定時器補償3ms時,PCA測量脈沖寬度為15.8ms;
定時器補償1ms時,PCA測量脈沖寬度為17.8ms;
可以發(fā)現(xiàn),定時器補償部分正常運行,但PCA脈沖測量結(jié)果出現(xiàn)極大偏差,理論上最大值僅為10ms(市電周期20ms的一半)
求大佬幫忙看看,是哪里配置有誤? |
|