|
你的思路是對(duì)的,
1ms的確不妥, 1ms 的間隔有點(diǎn)太長(zhǎng)了誤差可能會(huì)大。如果只是要得到頻占比的話,定時(shí)器最好是 8位自動(dòng)重載模式,定時(shí)20us左右, 采樣次數(shù)盡可能的多一點(diǎn),10000以上吧,結(jié)果會(huì)比較精確。程序大致如下(供參考):
#define Duty_Value 50000 //設(shè)置量程 (0~65535) 這里定義5萬次,20us間隔,大約1秒 計(jì)算一次頻占比,
bit PWM_Done; //標(biāo)志
unsigned short Duty_H,Duty_L,PWM_H,PWM_L,Duty_ount; //用到的變量
sbit PWM_IO = P3^2; //定義 PWM輸入引腳 (任意引腳)
void PWM_Get_Inti() //初始化
{
Duty_H = 0;
Duty_L = 0;
Duty_count = Duty_Value;
PWM_Done = 0;
//此處定義定時(shí)器
}
void T0_Int() interrupt 1 //中斷
{
if(PWM_IO)
{
Duty_H++; //測(cè)量高電平比
}
else
{
Duty_L++; //測(cè)量低電平比
}
if(--Duty_count==0)
{
PWM_H = Duty_H; //保存高電平比
PWM_L = Duty_L; //保存低電平比
Duty_H = 0; //復(fù)位
Duty_L = 0;
Duty_count = Duty_Value;
PWM_Done = 1;
}
}
//主程序內(nèi):
if(PWM_Done)
{
PWM_Done = 0; //清標(biāo)志
//計(jì)算 頻占比 如: PWM_H * 100/ Duty_Value 得出 x% 高電平比,根據(jù)需要擬定
}
|
|