伺服电机和电位计的问题:将程序插入板时不移动

问题描述 投票:0回答:1

此代码旨在利用电位计来旋转伺服电机。当我尝试将其插入程序时,伺服系统完全没有移动,而且我也不知道这是由于我的电路板,接线或代码造成的。如果有人可以对此事提供帮助或提供一些帮助,将不胜感激。我使用的板是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文件,因此,如果有人需要它作为参考,我会将其发布为编辑内容。我也将接线以防万一

The wiring of the board

c++ embedded stm32 mbed
1个回答
0
投票

立即观察

我现在看到五个问题,从“可能是问题”到“可能是问题”。我能够辨认出您照片上的图钉标签,并且您的图钉分配似乎正确。假设没有奇怪的电线或电压问题:

  1. 您的模拟引脚应该是AnalogIn,而不是AnalogOut。尽管AnalogOut具有read的功能,但它用于反馈以确保您的输出与预期的一样。现在,作为AnalogOut,您实际上是在此引脚上充当电压源,并且<>电压而不是测量电压。

  2. 您没有呼叫Servo::Enable。该文档告诉您如何调用Servo::Enable。确保调用它。您甚至需要指定伺服器的起始位置,这将使您能够对输出和伺服器进行故障排除(请参阅稍后的故障排除)。
  3. AnalogIn::read返回float之间的[0.0, 1.0],以表示输入线上读取的电压与系统电压之间的比率(通常为5V或3.3V)。但是,Servo::SetPosition需要一个整数,该整数表示脉冲信号正部分的长度(以微秒为单位int-在您的情况下为0到20,000)。如果您尝试将AnalogIn::read的结果传递给Servo::SetPosition,则您的float将被转换为0(一种罕见情况是1)。您需要将模拟输入转换为整数输出。
    1. 现在,在您的代码中,您仅在程序刚开始时读取模拟输入引脚的状态。您进入无限循环,并且不再读取该模拟输入。您可以将旋钮旋转到心满意足,但绝不会影响程序。您需要多次读取模拟输入。将其移到循环中。

    2. 只是一种样式,但是您不需要内部for循环。除了使您的代码混乱之外,它什么也没做。如果您希望将来在某个时候使用i的值,请不要使用它,否则请放弃它。

故障排除

幸运的是,可以想到许多系统之间有许多带有箭头的盒子(子系统)。如果所有的盒子都在正确地工作,并将它们插入正确的下一个盒子,那么整个系统就可以正常工作。您的系统如下所示:

+-----+ +-----+ +----------------+ +-------------+ +--------------------+ +-----+ +-------+ | Pot |-->| ADC |-->| AnalogIn::read |-->| Float-to-us |-->| Servo::SetPosition |-->| PWM |-->| Servo | +-----+ +-----+ +----------------+ +-------------+ +--------------------+ +-----+ +-------+

这些子系统共同构成了您的整个系统。如果这些链接之一不能正常工作,则整个过程将无法正常工作。通常(或者至少我们想像我们会想像的话),我们将测试应用于系统和子系统,以确保它们根据输入产生预期的输出。如果将输入应用于这些框之一,而输出正是您所期望的,那么该框就不错了。给它一个绿色的复选标记,然后移到下一个。

对每一个进行测试都可能是这样的:

  1. 电位器:

    输入:旋转旋钮,输出:完全旋转一圈时,中间引脚上的电压接近系统电压(5V或3.3V),转到相对端时接近0,并且两端之间具有近似线性的级数。您需要用万用表来测量。
  2. ADC(模数转换器):

  3. 输入:输入引脚上有一些电压。确认其正常工作后,您可以通过旋转电位计来改变它。 输出:这有点难,因为输出是微控制器中的寄存器。我不知道您的硬件的调试环境是什么样的,所以我无法告诉您如何测量此输出。如果您不知道如何使用调试器,则可以假定进行下一项操作(但是您确实应该学习如何使用硬件的调试器)
  4. AnalogIn::read

  5. input: ADC的寄存器值。 输出:在0.0到1.0之间浮动。我们可以将ADC和AnalogIn::read功能作为一个子系统,以引脚电压作为输入,将浮点值作为输出,从而同时测试它们。再次为此,您将需要一些调试功能。打印语句,串行连接或开发环境等。
  6. Float to us conversion:

  7. input:介于0.0和1.0之间的浮点数。 输出: 0到20,000之间的整数,与浮点输入成比例(或成反比,取决于所需的功能)。同样,由于我们正在查看变量,因此您需要使用调试环境。
  8. [Servo::SetPosition

  9. *输入:** 0到20,000之间的整数,代表输出脉宽调制(PWM)信号的占空比(高周期)。 输出:增加此数字将增加观察到的占空比。减少则减少。我们的占空比长度大约等于代码中设置的长度。您需要一台示波器来观察占空比。或者,如果您的伺服器正在工作,那么当这种变化发生时,您应该看到它在移动。
  10. Servo:

  11. input: PWM信号。 输出:角度位置。 0%占空比应该一直到一个极端,而100%占空比应该旋转到另一个极端。
    结论

将您的系统视为一系列子系统。独立测试每个人。您不能指望下一个子系统“弥补”之前一个子系统的不足。他们都需要工作。

© www.soinside.com 2019 - 2024. All rights reserved.