一.背景
在上篇,博主给大家介绍了关于舵机的相关知识以及PWM的控制原理,并且根据410c的特点写了个GPIO口模拟PWM的驱动,但是尽管输出的波形图还算稳定,但相对来讲,PWM作为稳定的硬件通讯信号,是需要时刻保持信号的输出,换言之,假如一个周期20ms,脉宽50%的波形,CPU平均在10ms内调度GPIO进行实时电平改变。上篇博客的stree.c驱动里,我们采用在工作队列里udelay的方式来实现(具体参考http://blog.youkuaiyun.com/ad3600/article/details/59484467这篇博客),这在linux这种分时调度系统里是相当消耗CPU资源的做法(CPU占用率:android系统里占25%+,纯linux系统占80%+),但如果换成usleep,或者干脆采用软件定时器来做延时控制,这种方式虽然能极大地降低CPU的占用率,但在linux的这类分时系统里无法保证及时的硬件操作的实时响应,实测波形如下:
图1 PWM波形1
图2 PWM波形2
图3 PWM波形3