Board logo

标题: 怎么用输入捕获去测量一个连续脉冲周期? [打印本页]

作者: ky3453079    时间: 2006-9-28 10:57     标题: 怎么用输入捕获去测量一个连续脉冲周期?

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


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


芯片是HC12D的。


作者: ky3453079    时间: 2006-9-29 17:32

现在可以计出两个上升沿的周期。但不稳定,在硬件仿真下全速运行,差值上正确的,当设置断点运行时,差值就错了。看了TC0跟TC0H里面的值一直在变化,我明明已经把ICSYS_NOVM置1了,不让他重写除非两个寄存器清空。后来我试了不读这两个寄存器的值,可内存里的值也还是在一直变化。搞不懂?请诸位大侠帮忙下!!!
作者: strongchen    时间: 2006-10-9 09:12

你说的ICSYS_NOVM到底是指哪个控制位?
作者: ky3453079    时间: 2006-10-9 11:41

是控制chanel0,这个寄存器是用来设置是否重写TC0值。就是当捕获到新的上升沿时,TC0的值要不要重写。按他芯片资料里面的说的,如果ICSYS_NOVM0设置的话,TC0里面的值是不会变的,除非把TC0的值读出来或将TC0的值放到TCOH锁存里。我程序里面都没读TC0的值,也没开启TCOH的功能。内存里的TC0寄存器的值还是一直在变化,感觉ICSYS_NOVM0有设跟没设都没差别。
作者: ky3453079    时间: 2006-10-9 11:44

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;
}
这是初始化定时器程序。
作者: strongchen    时间: 2006-10-9 14:11

你说的应该是ICOVW_NOVW0,而不是ICSYS_NOVM0吧。仔细检查一下你的程序中或地址定义是否有问题。另外,你说内存里TC0的值一直在变化,你是怎么看到的呢?
作者: ky3453079    时间: 2006-10-9 15:53

是ICOVW_NOVW0,不好意思。TC0的值是在该寄存器所在的内存地址0x50上看到的,一直在变
作者: strongchen    时间: 2006-10-10 09:27

你用的到底是哪个型号?为什么是0x50的地址?
作者: ky3453079    时间: 2006-10-10 10:14

MC9S12A512
作者: strongchen    时间: 2006-10-10 11:02

你是让硬件全速运行然后看调试界面上0x50的地址,看到它一直在变吗?应该不会吧。另外,寄存器地址重新映射过吗?程序中是否还有对TC0的读指令呢?
作者: ky3453079    时间: 2006-10-10 12:34

让硬件全速运行后停下来看0x50的地址,每次停下来显示的值都不一样。
寄存器没有重新映射过。程序就只有上面那个初始化程序。死循环里面没写程序。
作者: ky3453079    时间: 2006-10-11 10:25

原来是BDM调试下,每次停下来的时候都会去读TC0里面的值,所以导致TC0里面的值一直变化。用我第一张贴子里面的方法去测脉冲周期,误差很大。版主有没有什么减少误差的方法啊 ?
作者: strongchen    时间: 2006-10-11 10:37

应该不会有什么误差的,不过要注意定时器溢出的情形。
作者: ky3453079    时间: 2006-10-11 11:05

我有做过相应的模数处理,我测了十几次的数据,发现有好几个跟其他的偏差很大。循环的测量偶尔才会出现十几次的数据相差在1之内的
作者: strongchen    时间: 2006-10-11 11:10

一个是看看有没有溢出,另一个是看看会不会受其他中断的影响。再者,就是输入波形是否好,有没有干扰。
作者: ky3453079    时间: 2006-10-11 11:18

就只有1个定时器中断。输入波形快接近方波__∫ ̄|__,就是上升沿部分略有弧形
作者: ky3453079    时间: 2006-10-13 10:39

问题找到,检测两个上升沿的程序执行时间太长,导致有的数据比正确值大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;
}
作者: strongchen    时间: 2006-10-13 11:00

你没有用中断吗?
作者: ky3453079    时间: 2006-10-13 12:30

没有,中断就更慢了
作者: ky3453079    时间: 2006-10-13 13:04

会不会跟总线周期有关啊,我用的是12M晶振,总线周期就1/6M,一个指令周期跟总线周期一样,如果要提高程序执行时间,就提高总线频率。
作者: strongchen    时间: 2006-10-13 14:30

是呵,你的总线频率是多少,所测信号频率又是多少?
如果用中断是不会更慢的,因为就不需要用软件进行判断了。但中断处理程序应尽量的短,否则也会屏蔽掉多次发生的中断。
作者: ky3453079    时间: 2006-10-13 17:19

现在被我改成12M的总线频率了,总算正常了。测的频率在250K左右。用中断还得考虑参数返回的情况,还是用查询的比较简单。HC12的芯片用PLL倍频有限制到几M没。我想再把总线频率改到24M?
作者: strongchen    时间: 2006-10-13 17:24

用PLL可以将总线频率升至24M。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0