51单片机软模PWM误差率之研究
时间为810us-773us=37us,低电平持续时间897us-810us=87us,实际输出PWM波的占空比为:37/(37+87)=0.298387,占空比误差率为(0.298387-0.25)/0.25=19.35%;一般工程实践要求的误差率不超过5%,显然这19.35%的误差率是不符合要求的。(注-Proteus的图形仿真精度:对模拟量的采样最小间隔为1e-18s,典型值为1e-09,参见Proteus使用手册。)
5、接着取PWM_CYCLE, PWM_HIGH, PWM_LOW分别为10、2、8,则设定的PWM波频率为100kHz,占空比0.2。编译连接正确后在Proteus中仿真(12.0mHz晶振)后抓出的单个周期波形图如下:
由图可计算得:实际输出的PWM_HIGH, PWM_LOW分别为15、19,占空比0.4412,占空比误差率120.59%,也就是说,实际输出的PWM波占空比翻番了。
6、继续取PWM_CYCLE, PWM_HIGH, PWM_LOW分别为1000、250、750,则设定的PWM波频率为1kHz,占空比0.25。编译连接正确后在Proteus中仿真(12.0mHz晶振)后抓出的单个周期波形图如下:
由图可计算:实际输出的PWM_HIGH, PWM_LOW分别为262、762,占空比0.2558,占空比误差率2.34%(<5%)。
7、综上,本文得出的结论为:在51单片机上采用软件模拟的方式输出PWM波,其频率越大,占空比误差越不可收拾;在PWM波形频率不是很高的情况下(比如小于1kHz),采用软模方式输出PWM是完全可行的。
8、为什么会出现这种情况呢 ?首先将每次仿真调试,程序中设定的PWM_HIGH, PWM_LOW值及实际输出值列表如下:
比较发现实际输出的PWM波形时间参数总比我们当然中预期的多约12个us,也就是本仿真单片机的12个机器周期。再次查看中断服务函数的汇编代码:
; FUNCTION Timer1_ISR (BEGIN)
; SOURCE LINE # 43
; SOURCE LINE # 45
0000 309709 JNB PWM_PIN,?C0002 ;;;2us
; SOURCE LINE # 46
; SOURCE LINE # 47
0003 C297 CLR PWM_PIN ;;;1us
; SOURCE LINE # 48
0005 758DFF MOV TH1,#0FFH;;;2us
; SOURCE LINE # 49
0008 758BB5 MOV TL1,#0B5H ;;;2us
; SOURCE LINE # 50
000B 32 RETI ;;;2us
000C ?C0002:
; SOURCE LINE # 52
; SOURCE LINE # 53
000C D297 SETB PWM_PIN;;1us
; SOURCE LINE # 54
000E 758DFF MOV TH1,#0FFH ;;2us
; SOURCE LINE # 55
0011 758BE7 MOV TL1,#0E7H;;2us
; SOURCE LINE # 56
; SOURCE LINE # 57
0014 ?C0004:
0014 32 RETI ;;2us
; FUNCTION Timer1_ISR (END)
这次把每条指令的执行时间注释了在后,考虑指令流进入了定时器中断,执行CLR PWM_PIN指令完成,则经4us的PWM_HIGH计时参数装载,2us的中断返回操作,运行main流程中的SJMP ?C0001空转指令至定时器再次溢出中断(Xus,X为程序设定PWM_HIGH取值),CPU中断响应再次转入中断服务例程(可计算中断响应时间为3~4us),执行JNB PWM_PIN,?C0002SETB PWM_PIN
9、到这里,单片机软模PWM波在高频输出下占空比误差率变得不可收拾的原因终于毕露原形。实际输出占空比计算式为:(PWM_HIGH+12)/(PWM_HIGH+PWM_LOW+24)。
51单片机软模PWM误差 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)