加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中分配1 ms或2 ms的延迟?

发布时间:2020-12-16 10:17:51 所属栏目:百科 来源:网络整理
导读:我正在使用代码来配置一个简单的机器人.我正在使用 WinAVR,并且那里使用的代码类似于C,但是没有stdio.h库等,所以应该手动输入简单内容的代码(例如,将十进制数转换为十六进制数是一个多步骤的过程涉及 ASCII字符操纵). 使用的代码示例(只是为了向您展示我在说
我正在使用代码来配置一个简单的机器人.我正在使用 WinAVR,并且那里使用的代码类似于C,但是没有stdio.h库等,所以应该手动输入简单内容的代码(例如,将十进制数转换为十六进制数是一个多步骤的过程涉及 ASCII字符操纵).

使用的代码示例(只是为了向您展示我在说什么:))

.
.
.
    DDRA = 0x00;
    A = adc(0); // Right-hand sensor
    u = A>>4;
    l = A&0x0F;
    TransmitByte(h[u]);
    TransmitByte(h[l]);
    TransmitByte(' ');
.
.
.

在某些情况下,我必须使用WinAVR并且不能使用外部库(例如stdio.h).无论如何,我想通过伺服电机施加脉冲宽度为1 ms或2 ms的信号.我知道要设置的端口等等;我需要做的就是在清除之前应用延迟来保持该端口集.

现在我知道如何设置延迟,我们应该创建空的for循环,例如:

int value= **??**
for(i = 0; i<value; i++)
    ;

对于1 ms的循环,我应该在“值”中加入什么值?

解决方法

您可能需要计算合理的值,然后查看生成的信号(例如,使用示波器)并调整您的值,直到您达到正确的时间范围.鉴于你显然有2:1的保证金,你可能会在第一次合理地接近它,但我不会太多.

对于第一次近似,生成一个空循环并计算一个循环的指令周期,并将其乘以一个时钟周期的时间.这应该至少给出单次执行循环所花费的时间的合理近似值,因此将所需时间除以该值应该可以让您进入适当数量的迭代.

编辑:但是,我还应该注意,(至少大多数)AVR具有板载定时器,因此您可以使用它们.这可以1)让您进行其他处理和/或2)减少持续时间的功耗.

如果使用延迟循环,则可能需要使用AVR-libc的延迟循环实用程序来处理详细信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读