请教马老师:按照你教材上的捕获模式获取频率,关于量程切换方面遇到实际的问题(高频率信
1、你在教材中说当频率 < 4khz ,测量量程N=1(也就是说连续捕获2个脉冲上升沿,认为一次测量)
当频率 > 4khz 同时 频率 < 128khz , 测量量程N=64(也就是说连续捕获65个脉冲上升沿,认为一次测量)
问题如下:
(A)、 当前频率=100khz时,量程N=64.如果当频率=100KHZ时刚刚进入第2次捕获时,突然频率信号降至0.1HZ
由于还需要再进入63次捕获中断,才能认为一次测量完成,而现在由于频率信号为0.1HZ(10秒钟才会产生一次上升沿)
导致63*10秒=630秒内,测量结果无法刷新(因为在63*10秒内,不会置icp_ok=1标志了)。 如何合理的解决上述实际问题呢?
(B)、 当前频率=100khz时,量程N=64.如果当频率=100KHZ时刚刚进入第2次捕获时,突然频率信号消失,此后
测量结果永远不会再刷新了(因为永远不会置icp_ok=1标志了),如何合理的解决上述实际问题呢? 不知道我的方法是否可行?
根据当前频率计算一个合理的“时间*3”,如果在“时间*3”内,还没有产生icp_ok标志,就认为频率信号出现上述现象(突然消失或陡降到很低的频率0.1HZ)此时,清除捕获中断和溢出中断、置icp_v2=0,置icp_v1=0,置icp_2=0,强制测量值fv=0.
然后重新将N设置=1,重新启动捕获中断和溢出中断。 我顶。 回复【2楼】ba_wang_mao
-----------------------------------------------------------------------
楼主弄出来了没,,,我也正在看马老师的书想做一个频率计
但书上的程序有的地方没看懂,请指点
我觉得下面的程序有问题,怎么都是icp_2呢,应该第一个为icp_1,不知我这样理解是否正确,
还有就是那个while(1)中的测频算法有点看不懂,,,请指点。。我的qq:383953468
if (icp_ok == 1) // 完成一次测量
{
if (icp_v2 >= icp_v1) // 计算N个上升沿的时钟脉冲个数,
icp_2 = icp_v2 - icp_v1;
else
icp_2 = 65536 - icp_v1 + icp_v2;
void main(void)
{
unsigned int icp_1,icp_2;
long fv;
DDRA=0xFF; // LED段码输出
PORTC=0xFF;
DDRC=0x3F; // LED位控输出
PORTD=0x40; // PD6(icp)输入方式,上拉有效
// T/C2 初始化
TCCR2=0x0C; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
OCR2=0xf9;//7c; // OCR2 = 0xf9(249),(249+1)/62.5=4ms
// T/C1初始化
TCCR1B = 0x41; // T/C1正常计数方式,上升沿触发输入捕捉,4M/1计数时钟
TIMSK = 0xA4; // 允许T/C2比较匹配中断,允许T/C1输入捕捉、溢出中断
icp_n = 0;
max_icp =1;
#asm("sei") // 开放全局中断
while (1)
{
if (icp_ok == 1) // 完成一次测量
{
if (icp_v2 >= icp_v1) // 计算N个上升沿的时钟脉冲个数,
icp_2 = icp_v2 - icp_v1;
else
icp_2 = 65536 - icp_v1 + icp_v2;
if (!(icp_v2 >= icp_v1 && full_ok)) // 有溢出,数据无效
{
if (icp_2 == icp_1) // 两次个数相等,测量有效
{
fv = 4000000 * (long)max_icp / icp_2; // 换算成频率值
f_2_d = 1; // 允许新频率送显示
if (fv > 4000)
max_icp = 64; // 如果频率大于4Khz,N=64
else
max_icp = 1; // N=1
} 后面还有啊,你应该全面的看。
接下去的第4行 “icp_1 = icp2”是什么意思?请仔细理解。 回复【4楼】machao
-----------------------------------------------------------------------
谢谢马老师指点,,我再仔细读一遍吧
页:
[1]