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

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

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

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


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


芯片是HC12D的。

迷途的羔羊!
现在可以计出两个上升沿的周期。但不稳定,在硬件仿真下全速运行,差值上正确的,当设置断点运行时,差值就错了。看了TC0跟TC0H里面的值一直在变化,我明明已经把ICSYS_NOVM置1了,不让他重写除非两个寄存器清空。后来我试了不读这两个寄存器的值,可内存里的值也还是在一直变化。搞不懂?请诸位大侠帮忙下!!!
迷途的羔羊!
是控制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,不好意思。TC0的值是在该寄存器所在的内存地址0x50上看到的,一直在变
迷途的羔羊!
MC9S12A512
迷途的羔羊!
让硬件全速运行后停下来看0x50的地址,每次停下来显示的值都不一样。
寄存器没有重新映射过。程序就只有上面那个初始化程序。死循环里面没写程序。
迷途的羔羊!
原来是BDM调试下,每次停下来的时候都会去读TC0里面的值,所以导致TC0里面的值一直变化。用我第一张贴子里面的方法去测脉冲周期,误差很大。版主有没有什么减少误差的方法啊 ?
迷途的羔羊!
我有做过相应的模数处理,我测了十几次的数据,发现有好几个跟其他的偏差很大。循环的测量偶尔才会出现十几次的数据相差在1之内的
迷途的羔羊!
就只有1个定时器中断。输入波形快接近方波__∫ ̄|__,就是上升沿部分略有弧形
迷途的羔羊!
问题找到,检测两个上升沿的程序执行时间太长,导致有的数据比正确值大2倍或3倍。现在要怎么减少程序执行时间,嵌套汇编?该怎么做啊?版主帮帮忙啊!!!
void TIM_Init(void)
{
TIOS_IOS0 = 0;
TFLG1_C0F = 1;
TCTL4_EDG0A = 1;
TCTL4_EDG0B = 0;
TSCR1_TEN = 1;
}
void main(void)
{
TIM_Init();
uint temp,i,data[16],TIC,TICH;
DisableInterrupts;
while(!TFLG1_C0F);
TFLG1_C0F=1;
TICH = TC0;
for(i=0;i<16;i++)
{
while(!TFLG1_C0F);
TFLG1_C0F=1;
TIC=TC0;
if(TICH>TIC)temp=TIC+(65535-TICH+1);
else temp=TIC-TICH;
data=temp;
TICH=TIC;
}
迷途的羔羊!
没有,中断就更慢了
迷途的羔羊!
会不会跟总线周期有关啊,我用的是12M晶振,总线周期就1/6M,一个指令周期跟总线周期一样,如果要提高程序执行时间,就提高总线频率。
迷途的羔羊!
现在被我改成12M的总线频率了,总算正常了。测的频率在250K左右。用中断还得考虑参数返回的情况,还是用查询的比较简单。HC12的芯片用PLL倍频有限制到几M没。我想再把总线频率改到24M?
迷途的羔羊!
返回列表