【问题标题】:Servo Motor not moving properly in Proteus伺服电机在 Proteus 中无法正常移动
【发布时间】:2019-09-10 16:59:32
【问题描述】:

我正在尝试使用 PIC18f4550 控制伺服电机,但在购买之前,我尝试在 Proteus ISIS 上对其进行模拟,但在设置角度时出现了一些不一致。

我尝试使用 20ms 周期和 1ms、1.167ms、1.333ms、1.5ms、1.667ms 或 1.833ms 占空比,它在 Proteus MOTOR-PWMSERVO 上产生 -69.8° 角,但使用 2ms 占空比循环导致完整的 90.0° 角

#define CONTROL             PORTCbits.RC0
#define BUTTON              PORTCbits.RC1


const Ang_Neg90 =               1.0;
const Ang_Neg60 =               1.167;
const Ang_Neg30 =               1.333;
const Ang_0 =                   1.5;
const Ang_30 =                  1.667;
const Ang_60 =                  1.833;
const Ang_90 =                  2.00;
// ------------------------------------------------- //

void ServoPosition (unsigned float Angle) {
    CONTROL = 1;
    Delay_ms(Angle);
    CONTROL = 0;
    Delay_ms(20 - Angle);
    }
void main(){
while(1){
    ServoPosition(Ang_0);
        if (BUTTON == 1){
            break;
        while(1){
                ServoPosition(Ang_90);
             }
        }
    }
}

我希望我的程序能够从 0 度转到 90 度,但我得到的只是 -69.8 到 90。你知道我哪里出错了吗?

【问题讨论】:

  • 您希望能够从 0 度转到 90 度。那是错字吗?您是指伺服的完整 -90 到 90 范围吗?
  • 另外,你有一个unsigned float 对应Angle,它是无效的C。这是否适合你?
  • 如果你有 Delay_ms 的实现或文档,我也想看看。
  • 正如@Mike 在他的回答中指出的那样,你的 const 是整数。避免在图片上使用浮点数,使用 0 到 255 的值来表示角度并没有错。 IE; 0 -90°,255 +90°,127 0°。 0 到 255 范围是定时器的范围,您需要做的就是将比较寄存器设置为您想要映射到该 0-255 范围的角度。在任何情况下,您都应该在程序中说明变量和常量的类型,以避免此类错误。

标签: c microcontroller pic mplab servo


【解决方案1】:

如果不查看您的整个设置很难判断,所以这里列出了可能的情况。

检查模拟伺服设置

确保将其设置为默认值。

使用示波器工具测量您的 PWM 信号

爱好伺服电机示例展示了如何使用示波器工具。将示波器连接到您的 pic18f4550 PWM 输出并测量它以确保占空比正确。您在低端遇到问题(试图达到 1 毫秒),所以我怀疑示波器会显示您的占空比太长。

如果你发现你的占空比太长,你可以试试:

  • 减去一个软糖值来处理模拟中存在的任何衰减时间。在真实硬件上运行时,您可能必须使用不同的值。
  • 在 pic18f4550 上使用专用 PWM 模块。这可能是最好的解决方案,因为您可以只设置 PWM 寄存器(假设它是这样工作的……我没有仔细查看手册),然后让它为您控制占空比。

检查电压

Hobby Server 中的电池是 6V,但 5V 似乎也可以工作。低于这个值,它开始表现得很奇怪。

【讨论】:

  • 以前从未使用过它,但绝对值得为努力和格式良好的答案使用 UV。
【解决方案2】:

你的常量类型不对:

const Ang_Neg90 =               1.0;

这是一个int 类型的常量,其值为1

我猜你的意思是:

const  float Ang_Neg90 =        1.0;

但无论如何: 如果您使用 Microchip 内置的延迟函数,则参数的类型应为 unsigned long,并且您正在使用 unsigned float
尝试在我们中定义您的延迟时间(整数而不是float 值!)并使用函数__delay_us(...)。并且一定要正确定义_XTAL_FREQ

如前所述:请记住不存在类型unsigned floatfloat 始终未签名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2020-09-07
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多