X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
嵌入式系统
实在是没办法了 只有靠大家的力量了 高手一定要帮忙呀!! 单片机上的C程序
zhfxuyg
2009-4-8 15:45
楼主
功能是用单片机测频率,脉冲从P1.1口进去,P1.1和P1.0是连通的。
我连接的计算机的音频输出口,在没有输出的情况下有比较稳定的噪声频率输出,很小的频率。
我定义了一个30个元素的数组arrFreq,存放测的频率,发现里面有异常的数据,突然会冒出100多的值,一般都是三四十;TIME2用做测脉冲间隔时间,用捕获的方式,TIME0定时100ms计算频率一次。
另外:我100ms测频率的话,值有异常;但是200ms测一次的话,置就很正常,没异常数据。我觉得是100ms时间有点短,脉冲本来就少,大概100ms有2,3个的样子,所以误差比较大。
但是总觉得还是有问题,请大家帮帮忙吧!
频率=脉冲个数*1000000/TIME2测的时间
#include
#include
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define VALID 1
#define INVALID 0
unint preCounter , curCounter , deltaCounter , curCount ;
unlong preTime , curTime , bufTime , deltaTime ;
unint curFreq ;
unchar t0 , TT2 ;
bit FMFlag ;
unchar ii , tt ;
unchar arrFreq[30];
void T0_Set () ;
void T2_Set () ;
void Init_MCU () ;
void Frequency_Measure () ;
void Time_Compute () ;
void main ( void )
{
Init_MCU () ;
T0_Set () ;
T2_Set () ;
while ( 1 )
{
if ( FMFlag == 1 )
{
Frequency_Measure () ;
}
}
}
//计算频率
void Frequency_Measure ()
{
deltaCounter = curCounter - preCounter ;
deltaTime = curTime - preTime ;
curFreq = deltaCounter * 1000000 / deltaTime ;
ii = tt % 60 ;
arrFreq[ii]=curFreq;
tt++;
preTime = curTime ;
preCounter = curCounter ;
FMFlag = 0 ;
}
void Init_MCU ()
{
EA = VALID ;
t0 = 0 ;
curCounter = preCounter = 0 ;
RCAP2H = 0x00 ;
RCAP2L = 0x00 ;
TF2 = 0 ;
TT2 = 0 ;
ii=tt=0;
curFreq = 0 ;
FMFlag = 0 ;
}
//计时100ms
void time0 () interrupt 1
{
t0++ ;
if ( t0 == 2 )
{
t0 = 0 ;
FMFlag = 1 ;
}
TH0 = 0x3C ;
TL0 = 0xB0 ;
}
//TF2溢出,TT2加1;EXF2置位,表示有脉冲,计数加1
void time2 () interrupt 5
{
if ( TF2 == 1 )
{
TT2++ ;
TF2 = 0 ;
}
if ( EXF2 == 1 )
{
EXF2 = 0 ;
curCounter++ ;
}
Time_Compute () ;
}
//计算当前的时间
void Time_Compute ()
{
curTime = TT2 ;
curTime = curTime << 0x10 ;
bufTime = RCAP2H ;
bufTime = bufTime << 0x08 ;
curTime = curTime + bufTime + RCAP2L ;
}
//设置定时器T0
void T0_Set ()
{
//T0中断 方式1工作
ET0 = VALID ;
TMOD = 0x01 ;
TCON = 0x00 ;
//初值装载 定时50ms
TH0=0x3C ;
TL0=0xB0 ;
//启动定时 T0
TR0 = VALID ;
}
//设置定时器T2
void T2_Set ()
{
//T2中断 方式1工作
ET2 = VALID ;
TH2 = 0x00 ;
TL2 = 0x00 ;
T2CON = 0x09;
//T2MOD = 0x00;
//启动定时 T0
TR2 = VALID;
}
点赞
回复评论 (13)
沙发
wxdpio
高手哪里
帮帮忙看看
点赞
2009-4-8 17:55
板凳
中网环球
如果100ms只有几个脉冲,误差肯定大,改为测2个脉冲间有多少时间。
点赞
2009-4-8 20:39
4楼
vernusian
可惜是低手……
点赞
2009-4-8 21:57
5楼
jackping025
这么说不是我程序的问题了
现在200ms测一次算了 ,但是间隔就有点大了!
多谢帮忙!
看看还有朋友有什么意见么?
点赞
2009-4-9 14:07
6楼
5299263
测频率和速度等程序,一般有T法和M法,即一种是测一定时间内(如200ms)有多少脉冲,一种是测2个脉冲内有多少个基准时间(如10us)。
点赞
2009-4-11 09:37
7楼
jxz128
引用: 引用 5 楼 schlafenhamster 的回复:
测频率和速度等程序,一般有T法和M法,即一种是测一定时间内(如200ms)有多少脉冲,一种是测2个脉冲内有多少个基准时间(如10us)。
我是一定时间内统计脉冲数量,然后计算的。像你所说的应该是T法。
但是我的疑问还存在,朋友对我的程序有什么看法么??哪里有不妥的地方,或者整个程序结构上有问题?
谢谢!
点赞
2009-4-11 23:39
8楼
dquansheng
ding
ding
点赞
2009-4-14 22:35
9楼
DIDADI
既然是要请别人看你的程序,还是把注释写详细一点吧。最好把你的电路图也附上。
点赞
2009-4-15 00:17
10楼
xiany_wj
你這個頻率測週期求倒數較準確, 你可以試一下.
点赞
2009-4-16 14:33
11楼
liede
T 算法和M算法,都是相对于时钟和所测频率来考量其算法的准度。
如果所算的频率与clk接近我建议调节clk的frequence.
点赞
2009-4-30 22:49
12楼
swallowyl
为什么不用中断/计数器呢?
点赞
2009-5-1 10:08
13楼
asdfgh123
距离好远 只能帮顶
点赞
2009-5-11 19:35
14楼
amu08
楼主的理想状况是认为每个中断发生后,中断程序都会被调用,但实际上不是这样。所以你那些计数器不应该用==,而是>=。
点赞
2009-5-12 08:21
最新活动
有奖直播报名中!抢占工业4.1先机 文晔科技日等你来!
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
罗姆有奖直播 | 重点解析双极型晶体管的实用选型方法和使用方法
STM32N6终于要发布了,ST首款带有NPU的MCU到底怎么样,欢迎小伙们来STM32全球线上峰会寻找答案!
免费下载 | 安森美电动汽车充电白皮书,看碳化硅如何缓解“里程焦虑”!
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
随便看看
无线传感器网络报告——RSSI的测量及其与距离的关系
微机指令问题
多网络智能远程遥控系统的设计与实现
关于MISRA:规则 18.4 不允许使用联合体
两个单片机项目,会的来接
【M4 开发板入门】EKK-LM4F232探索三 M4的FPU功能
转让全新书籍和开发板 价格最低
自减的问题
分享一个24L01+的驱动程序,自己调试通过
开关电源设计之MOS管反峰及RCD吸收回路
有没有做过mutilplexer的兄弟
80C51 读引脚与读端口
电源的去耦电容
直流变交流的简易方案
各种电子元件检验要求与方法大全
FPGA权威指南--英文版
WinCE下串口接收问题!!!
晒WEBENCH设计的过程+Li电手电筒电路设计
富士通FM3 MB9B506家庭物联网终端DIY项目总结 本次有幸参与富士通家庭物联网...
MTD2003F(马达驱动IC)
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复