Posteo este codigo SOLO PARA EL ESTUDIO y como soporte a la pregunta de Raul, Pertenece a partes de otro driver por lo que debe ser adaptado y evidentemente nunca podra utilizarse directamente.
Saludos,
GTI.PWMOutput m_Pwm1;
OutputPort m_Direction1;
int m_lastSpeed1 = 0;
public Motor_Controlador()
{
// asignar aqui i crear manualmente el socket
m_Pwm1 = new GTI.PWMOutput(socket, Socket.Pin.Seven, this);
m_Direction1 = new OutputPort(socket.CpuPins[9], false);
m_Pwm1.Set(1000, 0);
this.input = new GTI.InterruptInput(socket, GT.Socket.Pin.Three, GTI.GlitchFilterMode.On, GTI.ResistorMode.PullUp, GTI.InterruptMode.RisingAndFallingEdge, this);
this.input.Interrupt += new GTI.InterruptInput.InterruptEventHandler(this._input_Interrupt);
}
private void _input_Interrupt(GTI.InterruptInput input, bool value)
{
this.OnMotorControllerEvent(this, value ? ControllerState.Low : ControllerState.High);
}
private GTI.InterruptInput input;
public bool IsHigh
{
get
{
return this.input.Read();
}
}
public enum ControllerState
{
Low = 0,
High = 1
}
/// <summary>
/// Represents the desired motor to use.
/// </summary>
public enum Motor
{
/// left
Motor1 = 1,
/// right motor
Motor2 = 0,
}
/// <summary>
/// Used to set a motor's speed.
/// </summary>
public void MoveMotor(Motor _motorSide, int _newSpeed)
{
// Make sure the speed is within an acceptable range.
if (_newSpeed > 100 || _newSpeed < -100)
new ArgumentException("New motor speed outside the acceptable range (-100-100)", "_newSpeed");
if (_motorSide == Motor.Motor1)
{
// Save our speed
m_lastSpeed1 = _newSpeed;
// Determine the direction we are going to go.
if (_newSpeed < 0)
{
// Set direction and power.
m_Direction1.Write(true);
m_Pwm1.Set(1000, (byte)(100 - System.Math.Abs(_newSpeed)));
}
else
{
// Set direction and power.
m_Direction1.Write(false);
m_Pwm1.Set(1000, (byte)_newSpeed);
}
}
}
public void MoveMotorRamp(Motor _motorSide, int _newSpeed, int _rampingDelayMilli)
{
int temp_speed = m_lastSpeed1;;
int startSpeed = m_lastSpeed1;;
int lastSpeed = m_lastSpeed1;;
int timeStep;
int deltaTime = 0;
// Determine how long we need to wait between move calls.
timeStep = _rampingDelayMilli / (_newSpeed - lastSpeed);
// Rampa
while (_newSpeed != temp_speed)
{
// If we have been updating for the passed in length of time, exit the loop.
if (deltaTime >= _rampingDelayMilli)
break;
// If we are slowing the motor down.
if (temp_speed > _newSpeed)
{
temp_speed += ((startSpeed - _newSpeed) / timeStep);
}
// If we are speeding the motor up.
if (temp_speed < _newSpeed)
{
temp_speed -= ((startSpeed - _newSpeed) / timeStep);
}
// Set our motor speed to our new values.
MoveMotor(_motorSide, temp_speed);
// Increase our timer.
deltaTime += System.Math.Abs(timeStep);
// Wait until we can move again.
Thread.Sleep(System.Math.Abs(timeStep));
}
}
private struct tMovement
{
public Motor m_motorSide;
public int m_newSpeed;
public int m_rampingDelayMilli;
}
public void MoveMotorRampNB(Motor _motorSide, int _newSpeed, int _rampingDelayMilli)
{
movement = new tMovement();
movement.m_motorSide = _motorSide;
movement.m_newSpeed = _newSpeed;
movement.m_rampingDelayMilli = _rampingDelayMilli;
Thread moveThread = new Thread(new ThreadStart(this.MoveMotorRampThreadStart));
moveThread.Start();
}
private tMovement movement;
private void MoveMotorRampThreadStart()
{
MoveMotorRamp(movement.m_motorSide, movement.m_newSpeed, movement.m_rampingDelayMilli);
}
public delegate void MotorControllerEventHandler(Motor_Controlador sender, ControllerState state);
public event MotorControllerEventHandler MotorControllerHigh;
public event MotorControllerEventHandler MotorControllerLow;
private MotorControllerEventHandler onMotorController;
protected virtual void OnMotorControllerEvent(Motor_Controlador sender,ControllerState MotorControllerState)
{
if (this.onMotorController == null)
{
this.onMotorController = new MotorControllerEventHandler(this.OnMotorControllerEvent);
}
if (Program.CheckAndInvoke((MotorControllerState == ControllerState.High ? this.MotorControllerHigh : this.MotorControllerLow), this.onMotorController, sender, MotorControllerState))
{
switch (MotorControllerState)
{
case ControllerState.High:
this.MotorControllerHigh(sender, MotorControllerState);
break;
case ControllerState.Low:
this.MotorControllerLow(sender, MotorControllerState);
break;
}
}
}