Olá pessoal,
Para continuar a brincadeira com o Netduino, resolvi testar o PWM controlando um motor DC.
Umas das forma para controlar a velocidade e direção da rotação de um motor DC é utilizando uma Ponte H. Podemos construir uma com transistores, ou utilizar algum circuito integrado com a ponte já montada. No meu teste, utilizei o LMD18200 da National Semiconductor, que é uma ponte H com controle de direção e controle de velocidade com PWM. O CI também possui saídas para controle de temperatura e corrente. Além de muito fácil de utilizar, o LMD18200 é muito robusto. Pode controlar motores de ate 3A com tensão de ate 55V. No site da National é possível obter mais informações e até baixar o datasheet do componente.

O funcionamento é bem simples. Configuramos os pino D5 do Netduino como PWM. A frequência padrão do PWM é 10KHz. O duty-cicle inicialmente é configurado para 100%.
Configuramos também o pino D8 para definir a direção da rotação do motor e o botão da placa como entrada.
A cada vez que o botão é pressionado, um contador vai incrementando o duty-cicle, e quando chega a 100% ele inverte o sentido do motor, e começa a decrementar o duty-cicle, ate chegar em 0%, invertendo novamente o sentido e começando novamente a incrementar o duty-cicle, e assim sucessivamente.

Abaixo temos o código do netduino e um vídeo som o motor em funcionamento. Dá pra acompanhar a variação do duty-cicle e o sentido de rotação através dos Leds:

const uint maxDutyCyle = 100;
static bool statusBotao;
static int dutyCycle;
static int incremento;

static InterruptPort botaoControle;
static PWM sinalPWM;
static OutputPort direcao;

public static void Main()
{
dutyCycle = 0;
incremento = 1;
statusBotao = false;

sinalPWM = new PWM(Pins.GPIO_PIN_D5);
direcao = new OutputPort(Pins.GPIO_PIN_D8,true);

botaoControle = new InterruptPort(
Pins.ONBOARD_SW1,
false,
Port.ResistorMode.Disabled,
Port.InterruptMode.InterruptEdgeBoth);

botaoControle.OnInterrupt += new NativeEventHandler(BotaotHandler);

Timer pwmTimer = new Timer(
new TimerCallback(timerBotao),
null,
periodo,
periodo);

Thread.Sleep(Timeout.Infinite);
}

public static void timerBotao(Object obj)
{

if (true == statusBotao)
{
dutyCycle += incremento;
sinalPWM.SetDutyCycle((uint)dutyCycle);
Debug.Print(dutyCycle.ToString());
if ((maxDutyCyle == dutyCycle) || (0 == dutyCycle))
{
incremento = -incremento;
direcao.Write(!direcao.Read());
}
}
}

public static void BotaotHandler(UInt32 data1, UInt32 data2, DateTime time)
{
botaoControle.DisableInterrupt();
statusBotao = (0 == data2);
botaoControle.EnableInterrupt();
}


Exibições: 712

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço