软件方式输出PWM
PWM用于输出强度的控制, 例如灯的亮度, 轮子速度等, STC89/90系列没有硬件PWM, 需要使用代码模拟
使用纯循环的方式实现PWM
非中断的实现(SDCC环境编译)
使用中断的方式
因为需要PWM输出的场景, 一般都不会仅仅有PWM输出, 所以通常会做到定时器中断中, 由中断来实现
将1和0的时间宽度设置为定时器, 直接做到定时器中断里面
这个代码中
- pwm_flag代表了输出的0和1, 每次定时器中断时进行切换, 并设置下一次中断的时间宽度
- 用TR0做开关, 但是这种停止方式, 停止后输出可能还是1
使用定时器模式2和中断实现的PWM输出
使用定时器工作模式2. 这里scale分10个等级, scale=1时占比1/10个PWM周期(250us * 10 = 2.5ms), 因为是低电平点亮LED, 所以tt<=scale的时间LED是暗的, scale增大时亮度变小
使用定时器模式2和中断实现的多路PWM输出
实现多路PWM输出的思路
- 使用一个基础定时器, 定时器时间不能太大, 例如设置为100us, 可以用定时器模式2, 这样初始值能自动重置
- 设定一个PWM周期, 这个周期就是定时器间隔的整数倍, 例如10倍定时器周期, 就是1000us = 1ms
- 对于每个PWM通道
- 设置一个计数, 计数在达到PWM周期时置零, 这是实现PWM周期的基础
- 设置一个初始输出, 高电平或低电平
- 设置一个输出宽度, 计数达到这个宽度值时翻转. 这个宽度决定了输出翻转的时间, 用于控制占空比
- 因为每个指令的执行时间需要1-2个CPU周期, 所以当通道数增加后, 误差会增大
代码例子: 这里用8个位指定4个轮子的PWM输出, 每个轮子两位是为了控制轮子的正反向
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!