首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无库的Arduino伺服

无库的Arduino伺服
EN

Stack Overflow用户
提问于 2018-03-02 02:38:07
回答 2查看 7.7K关注 0票数 5

作为发送数字信号的教学练习,我尝试在不使用servo.h库的情况下对伺服的脉冲序列进行编码。

该伺服系统是一个9g微型伺服系统。硬件是正确的,因为许多使用servo.h的示例都工作得很好。

我有以下代码。问题是伺服系统会颠簸3秒,而不是移动和保持不动。

代码语言:javascript
运行
复制
void loop() {
    movePulse_1000();
    delay(3000);
}

void movePulse_1000(){
    Serial.print("Start movePulse_1000()\t\t");
    for (int pulseCounter=0; pulseCounter<=150; pulseCounter++){
        digitalWrite(pinServo,LOW);
        delay(20); // between pulses
        digitalWrite(pinServo,HIGH);
        delayMicroseconds(1000);
    }
    Serial.println("End movePulse_1000()");
}
EN

回答 2

Stack Overflow用户

发布于 2018-03-02 03:47:10

使用模拟伺服时,平均脉冲宽度必须相隔1.5ms,占空比根据所需位置而变化。要将伺服保持在您想要的位置,必须不断刷新伺服数据。这不是一个超级简单的任务,伺服库是非常优化的。没有什么理由不使用它。

它创建硬件定时器并使用它们来刷新伺服。这允许您的常规代码看起来像是有规律地继续,即使它被伺服库中断以服务于伺服。占空比、pwm频率和刷新率都会发挥作用。您必须查看您正在使用的伺服的数据表,以获得完整的详细信息。但它并不像你想的那么简单,而且你使用的延迟/延迟函数并不总是足够精确。这就是为什么你要使用时间和溢出中断。虽然大多数伺服不是太挑剔,你可以逃脱一吨的污水。

票数 2
EN

Stack Overflow用户

发布于 2019-07-05 05:48:21

servo.h不断地发送脉冲,这意味着伺服咆哮=电池消耗

我改变了你的功能,只旋转伺服,没有计时器,从0度到180度。

del = (7 * x) +500; -对于我的伺服脉冲500至1260us (计算,未测量)

代码语言:javascript
运行
复制
void movePulse(int x){
    int del=(7*x)+500;
    for (int pulseCounter=0; pulseCounter<=50; pulseCounter++){
        digitalWrite(pinServo,HIGH);
        delayMicroseconds(del);
        digitalWrite(pinServo,LOW);
        delay(20); // between pulses
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49056510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档