【嵌入式底层知识修炼】软件模拟周期占空比可调的PWM(+源代码)


任何事情都不应满足只会使用,而是要求懂得原理。

————小白


  需要软件模拟PWM的理由,一般是硬件PWM的IO端口不够用,因为软件模拟PWM不稳定,准确性也比较差,所以在硬件PWM可用的情况下是不会使用软件模拟的,但无论怎样,软件模拟的作用也很大,可以作为测试用例、通用PWM、替补方案等等

01 - 软件模拟思路

  软件模拟可调占空比思路图如下:
Alt
  程序整体的过程如下:

  1. 选一个普通IO端口作为PWM输出口
  2. 选一个定时器产生时基Tick,同时有一个全局计数Counter
  3. 在每个Tick内进行计数,当计数值达到要求时,IO端口作相应输出

  假设现在需要周期20ms,占空比为30%的PWM,也就是需要输出高电平14ms,低电平6ms,并周期产生,于是详细步骤如下:

  1. 计算周期和高低电平所占时间,Period = 20ms,High = 14ms,Low = 6ms
  2. 初始化普通IO如P3.5为输出端口
  3. 初始化定时器,产生1ms的时基Tick
  4. 启动定时器,在中断服务函数ISR中进行Counter计数
  5. ISR或主进程中对比High / LowCounter,一旦Counter >= High / Low就让P3.5输出1 / 0,其余时间输出0 / 1Counter > Period后就让Counter清0

  如果程序需要的是us级别,那么就作相应的修改即可

02 - 核心源码

  作为例子,选用SINO的SH79M1612B(8051)进行具体配置

/*define----------------------------------------------------------*/
#define Fsys_Mhz				12.0
#define set_port_out(x,y)		P##x##PCR &= ~(1UL<<(y));\
								P##x##CR  |= (1UL<<(y));
#define timer0_set_ms(x)		TL0 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值