URL: http://www.daxia.com/bibis/moredata30_988327_74648.shtml
原理尚未看懂,且先保留
我一直在寻求一种不用太快的中断就可以得到高精度的PWM,尝试了许多种方法,发现有一种方法可以。 我模拟 Delta-Sigma的差分原理做了PWM,效果不错,只是在边沿的线性稍差。 这种方法适用于用RC滤波得到直流信号,而不适用于驱动马达。 这种方法可以使用比较小的RC值,在中点输出频率为中断频率的一半。 这段程序要放在 Timer中断中执行。 例程为100us中断,步进为1/5000,量程为5000,对应5V分辨率为1mV。 /****** 定义 **********/ sbit P_PWM=P1^0; //输出端口 #define D_PWM_DUTY 5000 //量程 #if D_PWM_DUTY < 256 uchar PWM_CNT,PWM=100; //初始化PWM值 #else uint PWM_CNT,PWM=2000; //初始化PWM值 #endif /****** 放Timer中断 **********/ if(PWM_CNT<PWM) { P_PWM=0; PWM_CNT=D_PWM_DUTY-PWM+PWM_CNT; } else { P_PWM=1; PWM_CNT=PWM_CNT-PWM; } /******************************/