设计初衷 在单片机软硬件开发中,常常需要测量出电机转速、某个规则信号的频率等,买一个频率计又不划算,于是打算自己做一个,够用就行。 一开始打算用单片机,考虑到焊板、编程、烧录等等工作量,还不如就地取材,使用手头上的EasyUSB模块,只要在PC上编程的工作完成,频率计就算完成了。
设计原理如下: 硬件上,EasyUSB所用芯片CH341引脚读取速度可达0.25us,即理论上我们设计出来的频率计最高可以测试2M的频率源。这对于一般的单片机开发而言,应该足够用了。 在软件设计上,只要用软件实现,某一小段时间,外部中断信号触发的次数。
具体设计: EasyUSB预留的接口如下: 其中Key3也是中断引脚,上升沿触发,CH341芯片内部内置了上拉电阻。我们就将用这个引脚,来测量外部信号的频率。 软件上,也很简单,在原来EasyUSB免费开发包的基础上,修改增加两处代码即可:一,在原来的中断函数中,增加触发信号计数代码 LRESULT CEasyUSBDlg::OnEasyUSB_ExtInt() { m_INT_Cnt++;//每来一次,则增加计数一次 return 0; } 二,在规定的一小段时间内,统计出每秒钟触发信号来临的次数,即为该信号的实际频率。 先设定Timer的时间长度,SetTimer(EVT_CHECKFREQ,1000,NULL);即1秒钟,定时器函数出现一次。 然后在定时器函数中,统计并显示出该信号的频率。 void CEasyUSBDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==EVT_CHECKFREQ) { m_nFreq=m_INT_Cnt; UpdateData(false); m_INT_Cnt=0; } CDialog::OnTimer(nIDEvent); }
这样,一个简单实用的频率计就这样十分钟内就做好了。运行界面如下: 对于电机等旋转体速度的测量,使用一个小磁铁贴在旋转体上,再用一颗霍尔芯片连到该频率计的信号测量脚上。 EasyUSB详情在http://www.schoolboy.com.cn/list.asp?ProdId=0001
|