此代码旨在利用电位计来旋转伺服电机。当我尝试将其插入程序时,伺服系统完全没有移动,而且我也不知道这是由于我的电路板,接线或代码造成的。如果有人可以对此事提供帮助或提供一些帮助,将不胜感激。我使用的板是Nucleo STM L476RG板,电机是微型SG90。
#include "mbed.h"
#include "Servo.h"
#include "iostream"
Servo myservo(D6);
AnalogOut MyPot(A1);
int main() {
float PotReading;
PotReading = MyPot.read();
while(1) {
for(int i=0; i<100; i++) {
myservo.SetPosition(PotReading);
wait(0.01);
}
}
}
而且,我使用的代码在已发布的伺服库中将此代码列为Servo.h。
#ifndef MBED_SERVO_H
#define MBED_SERVO_H
#include "mbed.h"
/** Class to control a servo on any pin, without using pwm
*
* Example:
* @code
* // Keep sweeping servo from left to right
* #include "mbed.h"
* #include "Servo.h"
*
* Servo Servo1(p20);
*
* Servo1.Enable(1500,20000);
*
* while(1) {
* for (int pos = 1000; pos < 2000; pos += 25) {
* Servo1.SetPosition(pos);
* wait_ms(20);
* }
* for (int pos = 2000; pos > 1000; pos -= 25) {
* Servo1.SetPosition(pos);
* wait_ms(20);
* }
* }
* @endcode
*/
class Servo {
public:
/** Create a new Servo object on any mbed pin
*
* @param Pin Pin on mbed to connect servo to
*/
Servo(PinName Pin);
/** Change the position of the servo. Position in us
*
* @param NewPos The new value of the servos position (us)
*/
void SetPosition(int NewPos);
/** Enable the servo. Without enabling the servo won't be running. Startposition and period both in us.
*
* @param StartPos The position of the servo to start (us)
* @param Period The time between every pulse. 20000 us = 50 Hz(standard) (us)
*/
void Enable(int StartPos, int Period);
/** Disable the servo. After disabling the servo won't get any signal anymore
*
*/
void Disable();
private:
void StartPulse();
void EndPulse();
int Position;
DigitalOut ServoPin;
Ticker Pulse;
Timeout PulseStop;
};
#endif
它在同一位置也有一个.cpp文件,因此,如果有人需要它作为参考,我会将其发布为编辑内容。我也将接线以防万一
我现在看到五个问题,从“可能是问题”到“可能是问题”。我能够辨认出您照片上的图钉标签,并且您的图钉分配似乎正确。假设没有奇怪的电线或电压问题:
您的模拟引脚应该是AnalogIn
,而不是AnalogOut
。尽管AnalogOut
具有read
的功能,但它用于反馈以确保您的输出与预期的一样。现在,作为AnalogOut
,您实际上是在此引脚上充当电压源,并且<>电压而不是测量电压。
Servo::Enable
。该文档告诉您如何调用Servo::Enable
。确保调用它。您甚至需要指定伺服器的起始位置,这将使您能够对输出和伺服器进行故障排除(请参阅稍后的故障排除)。AnalogIn::read
返回float
之间的[0.0, 1.0]
,以表示输入线上读取的电压与系统电压之间的比率(通常为5V或3.3V)。但是,Servo::SetPosition
需要一个整数,该整数表示脉冲信号正部分的长度(以微秒为单位int
-在您的情况下为0到20,000)。如果您尝试将AnalogIn::read
的结果传递给Servo::SetPosition
,则您的float
将被转换为0(一种罕见情况是1)。您需要将模拟输入转换为整数输出。for
循环。除了使您的代码混乱之外,它什么也没做。如果您希望将来在某个时候使用i
的值,请不要使用它,否则请放弃它。故障排除
+-----+ +-----+ +----------------+ +-------------+ +--------------------+ +-----+ +-------+
| Pot |-->| ADC |-->| AnalogIn::read |-->| Float-to-us |-->| Servo::SetPosition |-->| PWM |-->| Servo |
+-----+ +-----+ +----------------+ +-------------+ +--------------------+ +-----+ +-------+
这些子系统共同构成了您的整个系统。如果这些链接之一不能正常工作,则整个过程将无法正常工作。通常(或者至少我们想像我们会想像的话),我们将测试应用于系统和子系统,以确保它们根据输入产生预期的输出。如果将输入应用于这些框之一,而输出正是您所期望的,那么该框就不错了。给它一个绿色的复选标记,然后移到下一个。
对每一个进行测试都可能是这样的:
电位器:
输入:旋转旋钮,输出:完全旋转一圈时,中间引脚上的电压接近系统电压(5V或3.3V),转到相对端时接近0,并且两端之间具有近似线性的级数。您需要用万用表来测量。ADC(模数转换器):
AnalogIn::read
:
AnalogIn::read
功能作为一个子系统,以引脚电压作为输入,将浮点值作为输出,从而同时测试它们。再次为此,您将需要一些调试功能。打印语句,串行连接或开发环境等。Float to us conversion:
[Servo::SetPosition
Servo: