单片机延时的种种

单片机 延时
汉云
发布时间: 2018-07-04
阅读: 1102

一、为什么要延时


1、时序


模块某协议的时序,比如串口,IIC的通讯协议,使用延时来满足时序变化的要求和通讯速度的控制。

如下IIC的时序,其中的tBUF,tLOW等等这些时间都是通过延时来完成的,如果延时的时间不正常,则通讯协议不满足,就会无法与芯片进行通讯,而无法达到某特定的功能。



无标题.png



芯片性能要求,某些芯片,比如ADC,专用计量等芯片,这些芯片都是要有一个转换时间的,或有一个读取转换结果的时间间距问题;

比如AD7606ADC转换时间为4us,那么想要得到新的数据,就要等转换完成后再读取。



无标题.png




还有一种就是芯片本身存在的bug,要进行必要的延时,以一个计量芯片为例,其两个寄存器的连续读取时间要间隔125us,否则会对第二个寄存器的值造成损坏。



无标题.png




2、效果


LED灯,无论是闪烁还是呼吸灯(PWM除外)



timg.gif


继电器控制,对于脉冲式触发的继电器,要对线圈进行通电一段时间后,让线圈所产生的磁量足以吸合,才会驱动继电器闭合(断开)。



timg (1).gif


二、延时种类



1、阻塞式


即在延时过程中,程序不执行其他的程序,不接收中断,只是在单纯的进行延时。

这种方式多用于时序非常严格的情况,但是效率是很低的,单片机会空运转。

代码一般为:



无标题.png




RTOS中,也会有一种阻塞的延时,函数为vTaskDelayUntil();



2、非阻塞式


这种方式,只是在运行到相关代码后,判断一下延时时间是不是到达,没有到则会跳到其他的程序去执行,等下次再判断延时时间,时间到后,再去执行相关代码。

这种方式用的比较多的就是定时器延时与RTOS中的延时了,vTaskDelay();


三、延时的方法


1、单片机空运行


即是单片机一直在运行NOP,或都是空的for循环。

还有一种是双for循环,通过调整两个for循环的条件来调整延时时间。或是通过do while方式,或都直接是while(i--);,或者是两者的组合的方式。



无标题.png





2、中断


1GPIO中断


这种方式用的很少,使用时,在GPIO引脚上输入一个时钟或是其他芯片输出的延时信号,GPIO可以设置成中断触发,而GPIO中断的时间就是时钟的周期时间,一些RTC的输出中断(通常为1S),或是一些标准的时钟输出,或是交流电整流后的脉冲(20ms)等等,总之是一些特殊的情况下的一种用法,但是间接可以起到精确延时的作用。


2)定时器中断


定时器无论是通用定时器,还是系统的滴答,都是通过定时器的原理进行的延时,这里统一进行说明。


而使用定时器也分两种情况,一种是把延时后的任务放在定时器的中断中进行运行,只有延时或是定时时间到后,才会执行相关的代码。时间不到是不会执行的,这种方式更准确的应该是定时了。


无标题.png



另一种方式就是真正的延时了,延时计数放在定时器中进行—操作,每--一次就是定时器定时时间的累加,这种定时方式精度比较高。

如下delays在中断中进行 --的操作,在要延时的地址设置好delays的值,只要等delays等于0后,就是延时时间到的时候。



无标题.png




综上,对于单片机的延时做了一些比较浅显的说明,其实针对不同的项目与不同的实时性要求,要选择合适的方式,才可以让项目在进度与性能上有一个很好的平衡。



原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (0)
汉云 擅长:无
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)