This program is for an autonomous robot for the competition at the Hochschule Luzern. We are one of the 32 teams. <a href="http://cruisingcrepe.wordpress.com/">http://cruisingcrepe.wordpress.com/</a> The postition control is based on this Documentation: Control of Wheeled Mobile Robots: An Experimental Overview from Alessandro De Luca, Giuseppe Oriolo, Marilena Vendittelli. For more information see here: <a href="http://www.dis.uniroma1.it/~labrob/pub/papers/Ramsete01.pdf">http://www.dis.uniroma1.it/~labrob/pub/papers/Ramsete01.pdf</a>
Fork of autonomousRobotAndroid by
Diff: Actuators/MaxonESCON/MaxonESCON.cpp
- Revision:
- 0:31f7be68e52d
- Child:
- 1:6cd533a712c6
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Actuators/MaxonESCON/MaxonESCON.cpp Thu Feb 07 17:43:19 2013 +0000 @@ -0,0 +1,134 @@ +#include "MaxonESCON.h" + +using namespace std; + +MaxonESCON::MaxonESCON( + PinName enb, + PinName isenb, + PinName pwm, + PinName actualSpeed, + Hallsensor *hall +) + : + _enb(enb), + _isenb(isenb), + _pwm(pwm), + _actualSpeed(actualSpeed), + _hall(hall) +{ + + _pwm = 0; + + // Initial condition of output enables + _enb = 0; + + // Set initial condition of PWM 2kHz + period(0.0005); + + // Set the pulses to zero + _pulses = 0; + + // Set the Pull Up Resistor + _isenb.mode(PullUp); +} + +void MaxonESCON::setVelocity(float speed) +{ + speed = speed / ESCON_SET_FACTOR * 60.0f; + if(speed > 1 ) { + _pwm = 0.9f; + } else if(speed < -1) { + _pwm = 0.1f; + } else { + _pwm = 0.4f*speed + 0.5f; + } +} + +float MaxonESCON::getActualSpeed(void) +{ + return (_actualSpeed.read()* 2.0f - 1.0f) * ESCON_GET_FACTOR / 60.0f; +} + +void MaxonESCON::period(float period) +{ + _pwm.period(period); +} + +void MaxonESCON::enable(bool enb) +{ + if(enb == false) { + _enb = 0; + } else { + _enb = 1; + } +} + +bool MaxonESCON::isEnabled() +{ + if(_isenb.read() == 1) { + return true; + } else { + return false; + } + /* + if(_enb == 0) { + return false; + } else { + return true; + }*/ +} + +int MaxonESCON::getPulses(void) +{ + _pulses = _hall->getPulses(); + return _pulses; +} + +int MaxonESCON::setPulses(int setPos) +{ + _hall->reset(); + _pulses = _hall->getPulses(); + return _pulses; +} + + +///// Für Polling muss mit unter Code gearbeitet werden. + +/* +int MaxonESCON::getHallPosition(void) +{ + return HALL_POSITION[(_hall1.read() ? 1 : 0)+(_hall2.read() ? 2 : 0)+(_hall3.read() ? 4 : 0)]; +} + +int MaxonESCON::getPosition(void) +{ + position calculation + +int actualHallPosition = getHallPosition(); + +if (actualHallPosition > 0) { + if ((actualHallPosition == 1) && (hallPosition >= 5)) { + turns++; + } else if ((actualHallPosition == 2) && (hallPosition == 6)) { + turns++; + } else if ((actualHallPosition == 5) && (hallPosition == 1)) { + turns--; + } else if ((actualHallPosition == 6) && (hallPosition <= 2)) { + turns--; + } + hallPosition = actualHallPosition; +} +return turns; +} + +float MaxonESCON::getTransPosition(void) +{ +return (turns * 2 * _wheelRadius * pi) / (_gear * _polePairs); // PULSES_PER_STEP muss weg da nach 6 hallimpus ein turn gibt +} + +int MaxonESCON::setPosition(int setPos) +{ +turns = setPos; +return turns; +} +*/