中断太快,超过51的处理能力是最主要原因
根本没有必要中断这么快
再者中断程序不老练,应该先做必须的事情,然后做对时间抖动敏感的事情<因为软件处理需要时间,而且一般讲处理时间还不固定,这种情况要考虑尽量不使用会产生跳转指令的算法,或插入必须NOP来补偿抖动>,这里其实是指LED控制部分
就你的具体情况本身应该使用方式2,自动重装载初值
有两种基本方法实现软件PWM
1: 类似你的方法,做一个基本时基 比如: 频率100HZ,分100阶可调那么应该10MS(100HZ)/100阶 = 100US/阶,亦即每100US中断一回,而不是你的每10US中断一回,你的情况10US都不够处理你的中断程序
2: 直接根据占空比,和频率计算0和1状态的初值,在中断中直接控制定时器的下一次溢出时间,这样可以更精密的调整占空比
注意: 软件PWM在占空比接近0%和100%控制比较困难 |