c - Proteus 中伺服电机无法正常转动

标签 c microcontroller pic mplab servo

我正在尝试使用 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。你知道我做错了什么吗?

最佳答案

如果没有看到整个设置,就很难判断,所以这里列出了可能的情况。

检查模拟伺服设置

确保将其设置为默认值。

Server Default Values

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

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

如果您发现您的工作周期太长,您可以尝试:

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

Oscilloscope

检查电压

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

Hobby Servo Motor Schematic

关于c - Proteus 中伺服电机无法正常转动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57742846/

相关文章:

子进程可以更改父进程共享的静态变量吗?

c - 在#ifdefine WINDOWS语句下的visual studio 2010不编译

c - 在 MSP430 代码中使用全局变量

c - 从固件启动引导加载程序

使用 ISR 取消长时间运行的函数

c - 如何通过环绕将 4 字节数组移位所有 32 位?

c - 如何在 C 中进行轮流管理?

python - 如何连接 Python 和 C 程序?

c - 带分号的 while 循环是什么意思

c - 如何使用PIC18f87k22定时器作为中断