上次我已经解释的比较明白了,占空比duty本来是个分数,为了发送方便将其扩大255倍成dutycnt,实际应用时再将其除以255,不就又还原了吗?只是最后评论字数有限,5535没说清
PWM的周期是60000个计时脉冲
因此 高电平时间(脉冲个数)+低电平时间(脉冲个数)=60000
即有 j+k=60000
k=60000-j
j=60000-k
因此:
计数器高电平时定时器初值为 65535-k=65535-(60000-j)= j + 5535;
低电平时定时器初值为 65535-j=65535-(60000-k)=k + 5535
当然正确的写法是65536-..... ,只不过这个65536已经超出无符号整型数据的表示范围,为了防止计算出错,好多人都写65535-.....,差一个脉冲关系不大
分析如下:
k+j=60000,k和j都是介于0和60000之间,timerH_1和timerH_0都是介于0和65535(定时器能设置的最大数)之间,而timerH_1+timerH_0=60000+2*5535,是固定值。
结论:
60000是控制调节精度的,SBUF每改变一个码,占空比改变60000/255,最后+5535是控制输出0和1的总时间的,但是如果前面是60000的话,后面的值只能取5535了,因为timerH_1和timerH_0最后要赋给定时器,最大只能赋值65535,如果要获得更大的输出总时间,只能通过增加循环来实现了。
例如,中间那段可以改成这样:
j = 50000 * dutycnt / 255;
k = 50000 - j;
timerH_1 = j + 15535;
timerH_0 = k + 15535;
虽然输出0和1的总时间没变但是,调整占空比的精度变了,SBUF每改变一个码,占空比改变50000/255。当然最后的15535也可以不加,这个总时间完全看设计需求。