用DRV8835和Raspberry Pi控制C#中的直流电机

时间:2017-01-20 19:54:48

标签: c# raspberry-pi3 windowsiot

经过长时间的搜索,我决定在这里问一下。 如何使用Pololu DRV8835电机驱动器控制直流电机? 我试图使用Microsoft.IoT.Lightning库,但频率似乎太低了。在Python library中,此驱动器频率为20 kHz。 当我尝试修改此库时,由于不存在的目标,构建引发了异常(但在构建库后它们甚至没有出现)。

这是我的代码:

public async Task Initialize()
    {
        try
        {
            if (!LightningProvider.IsLightningEnabled)
            {
                throw new Exception("No lightning provider detected!");
            }

            LowLevelDevicesController.DefaultProvider = LightningProvider.GetAggregateProvider();

            Gpio = await GpioController.GetDefaultAsync();

            APhase = Gpio.OpenPin(19);
            BPhase = Gpio.OpenPin(6);

            APhase.SetDriveMode(GpioPinDriveMode.Output);
            BPhase.SetDriveMode(GpioPinDriveMode.Output);

            Pwm = await PwmController.GetDefaultAsync();
            Pwm.SetDesiredFrequency(1000);

            AEnable = Pwm.OpenPin(26);
            BEnable = Pwm.OpenPin(13);
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    private bool stopMove = true;

    private double speed = 1;

    public void StopMove()
    {
        stopMove = true;
    }

    public async Task MoveForward()
    {
        await Task.Delay(1);
        stopMove = false;

        APhase.Write(GpioPinValue.Low);
        BPhase.Write(GpioPinValue.Low);

        AEnable.SetActiveDutyCyclePercentage(speed);
        BEnable.SetActiveDutyCyclePercentage(speed);

        Debug.WriteLine("Starting...");

        AEnable.Start();
        BEnable.Start();

        while (!stopMove) { }

        AEnable.Stop();
        BEnable.Stop();

        AEnable.SetActiveDutyCyclePercentage(0);
        BEnable.SetActiveDutyCyclePercentage(0);
    }

    public async Task MoveBackward()
    {
        await Task.Delay(1);
        stopMove = false;

        APhase.Write(GpioPinValue.High);
        BPhase.Write(GpioPinValue.High);

        AEnable.SetActiveDutyCyclePercentage(speed);
        BEnable.SetActiveDutyCyclePercentage(speed);

        AEnable.Start();
        BEnable.Start();

        while (!stopMove) { }

        AEnable.Stop();
        BEnable.Stop();

        AEnable.SetActiveDutyCyclePercentage(0);
        BEnable.SetActiveDutyCyclePercentage(0);
    }

有谁知道任何可行的解决方案?

1 个答案:

答案 0 :(得分:0)

有两种方法可以尝试:

首先,使用Microsoft.IoT.Lightning库。有两个PWM控制提供商:

其次,使用开箱即用的驱动程序BSP。该驱动器支持片上PWM硬件。尝试使用更高的频率来查看生成的信号是否符合您的要求。