任何事情都不应满足只会使用,而是要求懂得原理。
————小白
需要软件模拟PWM
的理由,一般是硬件PWM
的IO端口不够用,因为软件模拟PWM
不稳定,准确性也比较差,所以在硬件PWM
可用的情况下是不会使用软件模拟的,但无论怎样,软件模拟的作用也很大,可以作为测试用例、通用PWM、替补方案等等
01 - 软件模拟思路
软件模拟可调占空比思路图如下:
程序整体的过程如下:
- 选一个普通IO端口作为
PWM
输出口 - 选一个定时器产生时基
Tick
,同时有一个全局计数Counter
- 在每个
Tick
内进行计数,当计数值达到要求时,IO端口作相应输出
假设现在需要周期20ms,占空比为30%的PWM
,也就是需要输出高电平14ms,低电平6ms,并周期产生,于是详细步骤如下:
- 计算周期和高低电平所占时间,
Period
= 20ms,High
= 14ms,Low
= 6ms - 初始化普通IO如
P3.5
为输出端口 - 初始化定时器,产生1ms的时基
Tick
- 启动定时器,在中断服务函数
ISR
中进行Counter
计数 - 在
ISR
或主进程中对比High / Low
与Counter
,一旦Counter >= High / Low
就让P3.5
输出1 / 0,其余时间输出0 / 1,Counter > 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 =