【发布时间】: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