树莓派可以同时产生两路独立的pwm。
每一路可以配置到规定的几个gpio上,而实际能用的只有12、13、18、19,其他都没有引出来。这里的gpio指的是bcm的。
在BCM2835 ARM外设手册中对PWM做了详细的介绍。
树莓派的PWM有两种操作模式:PWM模式和Serialiser模式。PWM模式又有两种模式:N/M模式和M/S模式。我们平时常用的那种固定频率改变占空比的操作是PWM模式的M/S模式。
PWM由8个寄存器控制,手册上给出的总线起始地址为0x7e20c000,对应的物理地址是0x3f20c000。
如果不使用FIFO和DMA,配置很简单,主要是设置CTL,使能对应的PWM控制器并设置模式,设置RNG给定PWM的范围,就是上面图片的S,设置DAT给定要输出的值,就是图片中的M。也就是说RNG设置PWM的控制粒度,DAT控制输出高低电平的时间,二者的比值就是占空比。
在设置PWM之前,还有一个重要的地方需要设置,就是PWM的时钟,外设手册只说了一下配置时钟的寄存器是CPRMAN,没有其他信息。但是可以参考bcm2835库的设置方式。
总结一下,树莓派的pwm配置分这么几步:
1、设置对应的gpio为pwm复用功能;
2、设置pwm的时钟;
3、设置pwm的模式并使能;
4、设置pwm的range;
5、设置pwm的dat;
以后控制pwm就只需改变dat的值就可以改变pwm的占空比了。
Linux系统下,使用内存映射mmap可以很方便的操控这些寄存器。PWM需要映射gpio寄存器、时钟寄存器和pwm寄存器,bcm2835的库就是使用的这种方式。
我用树莓派18、19获取的pwm波形。
网上有树莓派只提供了一个硬件pwm输出的说法,在我的3b上证明是错误的,我猜测这种说法应该是针对之前旧版本硬件的。
有这两路PWM做两轮平衡车刚刚好。
全部0条评论
快来发表一下你的评论吧 !