CCP1模块捕捉模式的信号输入引脚是RC2,信号电平为标准TTL电平信号。若信号不是标准的TTL信号,还需要在信号接入RC2之前加入调理电路,使信号调理为TTL电平后再输入给RC2。
下面通过编写一个简单的频率计来学习CCP1模块捕捉模式的编程方法。
【例12-1】电路图如图12-2所示。编程实现频率计的功能,即在4位数码管W1上显示当前信号发生器SG1产生信号的频率,设频率小于10000。
电路图在光盘位置:“\Example\Chapter12\S121\Freqmeter.DSN”。
图12-2 基于CCP1模块捕捉模式的频率计电路图
题意分析
●4位数码管W1的字形用B口,位选用D口低4位,可以直接使用前几章编写的4位数码管扫描显示模块来实现,但本章为了方便读者初次阅读,在本例的代码列表中加入了此模块的源代码。
●RC2连接了两个设备:信号发生器SG1和频率计F1。SG1用来产生某种波形,本例中为简单起见,设为方波,且振幅为5V,如图12-3所示。F1采用频率计方式运行,用来显示当前信号频率,用做参考值与W1显示内容作比较。当程序运行时,单击F1即可显示F1的配置窗口,如图12-4所示。
图12-3 信号发生器SG1的状态设定图
图12-4 频率计F1的状态设定图
●根据刚刚学习的知识,用RC2可以使用CCP1模块的捕捉功能实现相邻两次上升沿时间间隔的测量,此时间间隔就是输入信号的周期。由于主频是4MHz,即每个指令周期为1µs,若预分频比为1∶1,测量周期结果的单位就是µs,用1000000除以测量周期结果就得到了信号的频率。
●由于其捕捉到跳变后会使CCP1IF置位,既可以采用查询方式,也可以采用中断方式处理。本例采用中断方式。
●在中断方式下,把相邻两次中断时的捕捉值求差就得到了此信号的周期(单位是1µs),进而就能得到信号频率。但测量信号频率很高时,其中断发生的频率也很高,如果不做处理,则会严重影响数码管扫描效果。为了降低中断发生的频率,在中断过程中测得一次频率后就关闭CCP1模块中断,然后当数码管扫描函数执行完毕后再打开CCP1模块中断,这样就解决了中断频率过高的问题。
设计过程(www.daowen.com)
1)用MPLAB新建项目S121,语言工具选择为“HI-TECH Universal Toolsuite”,保存在“C:\S121”文件夹下。
2)新建main.c文件并加入项目中,其内容如下所示。
3)新建seg74.h文件并加入项目中,其内容如下所示。
4)新建seg74.c文件并加入项目中,其内容如下所示。
5)新建delay.h文件并加入项目中,其内容如下所示。
6)新建delay.c文件并加入项目中,其内容如下所示。
7)程序录入完毕后,保存并成功编译出S121.cof。然后用调试工具Proteus VSM加载Freqmeter.DSN。启动VSM后运行程序。程序运行效果是W1显示的数字与F1显示的数字基本相同。
这里解释一下为什么W1显示速度比F1显示快,但是W1显示的频率值没有F1的准确。这是因为两者的算法和测量精度不同。程序中采用的是简单的倒数算法,即已知一个周期,求其倒数就得到了频率,但由于主频是4MHz,最小测量单位是1µs,使测量结果存在微小硬件误差。而频率计F1采用的是记录一段时间(如1s)内的脉冲次数来测量信号频率,其测量精度高于本例程序,这样其准确率高,但显示刷新速度较慢。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。