OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5351|回复: 6

定时器测量时间不准...

[复制链接]

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
发表于 2015-4-25 11:47:01 | 显示全部楼层 |阅读模式
5金钱
做个双积分ADC,对被测信号进行20ms固定时间积分,然后切换到基准信号通道,测量反向积分时间。
固定时间积分用的是T0定时器,测量方向积分时间用的也是T0定时器。
现在是在切换到基准信号通道前将TL0,TH0清零,切换到基准信号通道后立刻置位TR0,然后等待INT1中断,在INT1中断里将等待信号复位。
用示波器测量波形如下图,下坡是20Ms固定积分,现在将被测信号与基准信号正好相反,理论上上坡也是20ms,测量显示是略多于20ms.



[mw_shl_code=c,true]void main() { Init(); while(1) { RUNLED = 0; TIMERFLAG = 1; TL0 = T20MS; TH0 = T20MS >> 8; P1 &= 0xf0; //??????±????????????¨?? P1 |= 0x02; TR0 = 1; //?¨?±?÷T0 20ms???± while(TIMERFLAG); RUNLED = 1; INT1FLAG = 0; TL0 = 0; TH0 = 0; P1 &= 0xf0; //???????ù×??????????¨?? P1 |= 0x07; TR0 = 1; while(!INT1FLAG); SendData(temp1); SendData(temp2); ADC_Process(temp1, temp2); } }[/mw_shl_code]
[mw_shl_code=c,true]void tm0_isr() interrupt 1 using 2 { TR0 = 0; TIMERFLAG = 0; }[/mw_shl_code]

[mw_shl_code=c,true]void exint1() interrupt 2 { TR0 = 0; temp1 = TH0; temp2 = TL0; INT1FLAG = 1; }[/mw_shl_code]


现在串口发送上来的数据大约是0x 3C02,转换为十进制数 然后 乘12 除FOSC 11059200 ,约等于16.6ms。
中断优先级按默认来,没有做修改。
用到的中断有,INT1外部中断,接受外部信号跳变,用来触发停止计时;
                        T0定时器中断,用来产生20ms的延时;
                        串口中断;

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-4-25 13:05:28 | 显示全部楼层
这个和你的外部晶振有关系吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2015-4-25 14:06:03 | 显示全部楼层
回复【2楼】八度空间:
---------------------------------
用T0做20ms延时挺准的。

之前用PCA捕获计时挺准的,现在是因为PCA要用来产生PWM波所以才用INT1+T0来计时的。
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2015-4-25 16:03:15 | 显示全部楼层
找到问题了,但还没明白是怎么影响的。
 ADC_Process(temp1, temp2); 这个函数可能比较费时间,但不知道为何会影响到计时值。

额,好象是这句太占时间。对基准信号多积分了一段时间,下次记分周期的初始值不在零位了。
可能不改用while语句延时...
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2015-4-25 16:15:38 | 显示全部楼层
现在是有2个中断函数,T0定时器中断和INT1外部中断。想在两个中断函数里写切换通道部分,这样运算就不会影响通道切换了。不知道这样行不行。
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-4-25 18:28:00 | 显示全部楼层
软件积分很费时间的,而且不是很准确
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
 楼主| 发表于 2015-4-27 09:24:39 | 显示全部楼层
回复【6楼】八度空间:
---------------------------------
没办法的,为了提高抗干扰性。
其实是抄板,人家的现成产品就是这种电路形式,精度也还可以。
----------------------
其实是硬件积分,用运放实现的,单片机负责计时和通道切换。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表