首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

怎么用输入捕获去测量一个连续脉冲周期?

怎么用输入捕获去测量一个连续脉冲周期?

按照我的想法是用个IC捕获两个上升沿,将两次计数器的差值经过相应的换算得出。


可我看芯片资料里有不用中断就可以记录两个上升沿的计数器值,不知道怎么弄的?


芯片是HC12D的。

迷途的羔羊!
现在可以计出两个上升沿的周期。但不稳定,在硬件仿真下全速运行,差值上正确的,当设置断点运行时,差值就错了。看了TC0跟TC0H里面的值一直在变化,我明明已经把ICSYS_NOVM置1了,不让他重写除非两个寄存器清空。后来我试了不读这两个寄存器的值,可内存里的值也还是在一直变化。搞不懂?请诸位大侠帮忙下!!!
迷途的羔羊!
你说的ICSYS_NOVM到底是指哪个控制位?
海纳百川  有容乃大
是控制chanel0,这个寄存器是用来设置是否重写TC0值。就是当捕获到新的上升沿时,TC0的值要不要重写。按他芯片资料里面的说的,如果ICSYS_NOVM0设置的话,TC0里面的值是不会变的,除非把TC0的值读出来或将TC0的值放到TCOH锁存里。我程序里面都没读TC0的值,也没开启TCOH的功能。内存里的TC0寄存器的值还是一直在变化,感觉ICSYS_NOVM0有设跟没设都没差别。
迷途的羔羊!
void TIM_Init(void)
{
TIOS_IOS0 = 0;
TCTL4_EDG0A = 1;
TCTL4_EDG0B = 0;
ICOVW_NOVW0 = 1;
ICSYS_BUFEN = 1;
ICSYS_LATQ = 0;
TSCR1_TEN = 1;
}
这是初始化定时器程序。
迷途的羔羊!
你说的应该是ICOVW_NOVW0,而不是ICSYS_NOVM0吧。仔细检查一下你的程序中或地址定义是否有问题。另外,你说内存里TC0的值一直在变化,你是怎么看到的呢?
海纳百川  有容乃大
是ICOVW_NOVW0,不好意思。TC0的值是在该寄存器所在的内存地址0x50上看到的,一直在变
迷途的羔羊!
你用的到底是哪个型号?为什么是0x50的地址?
海纳百川  有容乃大
MC9S12A512
迷途的羔羊!
你是让硬件全速运行然后看调试界面上0x50的地址,看到它一直在变吗?应该不会吧。另外,寄存器地址重新映射过吗?程序中是否还有对TC0的读指令呢?
海纳百川  有容乃大
让硬件全速运行后停下来看0x50的地址,每次停下来显示的值都不一样。
寄存器没有重新映射过。程序就只有上面那个初始化程序。死循环里面没写程序。
迷途的羔羊!
原来是BDM调试下,每次停下来的时候都会去读TC0里面的值,所以导致TC0里面的值一直变化。用我第一张贴子里面的方法去测脉冲周期,误差很大。版主有没有什么减少误差的方法啊 ?
迷途的羔羊!
应该不会有什么误差的,不过要注意定时器溢出的情形。
海纳百川  有容乃大
我有做过相应的模数处理,我测了十几次的数据,发现有好几个跟其他的偏差很大。循环的测量偶尔才会出现十几次的数据相差在1之内的
迷途的羔羊!
一个是看看有没有溢出,另一个是看看会不会受其他中断的影响。再者,就是输入波形是否好,有没有干扰。
海纳百川  有容乃大
返回列表