我试图用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度。你知道我哪里搞错了吗?
发布于 2019-09-01 11:53:51
如果看不到你的整个设置,就很难判断,所以这里有一个可能的列表。
检查模拟伺服设置
确保将其设置为默认值。

使用示波器工具测量PWM信号
Hobby Servo电机示例显示了如何使用示波器工具。将示波器连接到您的pic18f4550脉宽调制输出,并测量它,以确保占空比是正确的。你在低端(试图达到1ms)遇到了问题,所以我怀疑示波器会显示你的占空比太长。
如果你发现你的工作周期太长,你可以尝试:

检查电压
Hobby Server的电池是6V,但5V似乎也可以工作。低于这个值,它就开始变得奇怪了。

发布于 2019-09-02 14:32:10
您的常量类型错误:
const Ang_Neg90 = 1.0;这是一个值为1的int类型的常量。
我猜你的意思是:
const float Ang_Neg90 = 1.0;但是不管怎样:如果您使用Microchip内置的延迟函数,那么参数的类型应该是unsigned long,并且您正在使用unsigned float。
尝试定义我们的延迟时间(整数而不是float值!)并使用函数__delay_us(...)。并确保正确定义_XTAL_FREQ。
如前所述:请记住不存在类型unsigned float。float始终是无签名的。
https://stackoverflow.com/questions/57742846
复制相似问题