你的思路是对的,
1ms的确不妥, 1ms 的间隔有点太长了误差可能会大。如果只是要得到频占比的话,定时器最好是 8位自动重载模式,定时20us左右, 采样次数尽可能的多一点,10000以上吧,结果会比较精确。程序大致如下(供参考):
#define Duty_Value 50000 //设置量程 (0~65535) 这里定义5万次,20us间隔,大约1秒 计算一次频占比,
bit PWM_Done; //标志
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;
//此处定义定时器
}
void T0_Int() interrupt 1 //中断
{
if(PWM_IO)
{
Duty_H++; //测量高电平比
}
else
{
Duty_L++; //测量低电平比
}
if(--Duty_count==0)
{
PWM_H = Duty_H; //保存高电平比
PWM_L = Duty_L; //保存低电平比
Duty_H = 0; //复位
Duty_L = 0;
Duty_count = Duty_Value;
PWM_Done = 1;
}
}
//主程序内:
if(PWM_Done)
{
PWM_Done = 0; //清标志
//计算 频占比 如: PWM_H * 100/ Duty_Value 得出 x% 高电平比,根据需要拟定
}
|