xingdong2hao 发表于 2013-9-12 13:28:42

关于KEIL下测试DS18B20延时的一些经验、想法


DS18B20的延时精度要求,感觉还是蛮高的。刚开始想使用软件延时,写了delay函数,可没调出来,后改用定时器精确延时,参考网上例程,顺利得到正确结果。但定时器延时不如软件延时简单,也占用硬件资源,有些浪费,想到了重新修改延时程序,实现较高精度的延时函数。
1 定时器延时
使用LPC1765的定时器0来精确延时,定时器0的时钟来源于外设时钟(24MHZ),计算要加载的数值,然后等待,当计数值与设定值匹配时,定时时间到,延时精确。下一次延时(定时器)会重新复位、装载计数值、使能定时器,开始新一轮的延时。
file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png
2 利用定时器精确延时来调节软件延时
以程序中用到的2us延时为例,在Keil中添加两个断点,用于测量delay_us(2)在Keil左侧的状态框中显示的时间间隔,即断点1至断点2的时间,Tsum和Tcur为我们要研究的。执行完delay_us(2)到达第二个断点,两个断点处的Tsum之差就是delay_us(2)“显示的”执行时间(一般不是真正的时间,真正的延时时间需要根据系统的机器周期和仿真器的时钟来计算,个人认为比较复杂,所以采取了现在这种投机取巧的方法),也可以由Tcur直接看出。
file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg

file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.jpg
记录下定时器的Tcur值,用于确定软件延时的状态框中“显示的”延时时间调节。
程序中调节的软件延时函数:
file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png
反复调节得到的结果如下:
file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
与定时器设置时的时间显示框Tcur一致(基本相同即可)。替换定时器0的延时程序,用DS18B20的程序验证,结果正确。
延时函数的书写要尽可能的简单,最好是用一个循环语句,这样延时的时间更容易分析;循环语句中判断条件也应简洁,避免重复的数学运算(会占用很多不必要的额外时间),如程序中所写,尽量不要用下面的语句:
file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png

postek 发表于 2013-9-12 13:36:29

图片都看不到哦。

postek 发表于 2013-9-12 13:37:13

file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png

......

file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png

xingdong2hao 发表于 2013-9-12 13:39:58

不知道为什么上传的没显示,一会顺序上传

xingdong2hao 发表于 2013-9-12 13:45:38

上次没有上传成功的一些图片,如下

xingdong2hao 发表于 2013-9-12 14:13:28

1.jpg图片的clip_image001与未显示的file:///C:/Users/SUNRIS~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png对应,下面的图也是这样对应

tiger_999 发表于 2013-9-24 16:26:26

用示波器调节好要用的延时函数就ok了   {:smile:}

xingdong2hao 发表于 2013-9-25 16:03:17

楼上说的也是一种不错的方法,以前没想到
页: [1]
查看完整版本: 关于KEIL下测试DS18B20延时的一些经验、想法