Tripple Controller for the TLE5206 H Bridge motor controller
Diff: inc/SimpleTLE5206Profiler.h
- Revision:
- 3:b7d951c6f551
- Child:
- 4:d69f22061c03
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/SimpleTLE5206Profiler.h Tue Jul 05 14:27:56 2011 +0000 @@ -0,0 +1,108 @@ +/* + Copyright (c) 2011 Andy Kirkham + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + + +#ifndef AJK_SIMPLETLE5206PROFILER_H +#define AJK_SIMPLETLE5206PROFILER_H + +#include "mbed.h" +#include "SimpleTLE5206.h" + +namespace AjK { + +class SimpleTLE5206Profiler : public SimpleTLE5206 { + +protected: + Ticker _poll; + double _desired_speed; + double _actual_speed; + double _accel_rate; + double _decel_rate; + int _poll_interval; + + void poll(void) + { + if (_actual_speed < _desired_speed) { + _actual_speed += _accel_rate; + if (_actual_speed > _desired_speed) { + _actual_speed = _desired_speed; + } + SimpleTLE5206::setSpeed(_actual_speed); + } + if (_actual_speed > _desired_speed) { + _actual_speed -= _decel_rate; + if (_actual_speed < _desired_speed) { + _actual_speed = _desired_speed; + } + SimpleTLE5206::setSpeed(_actual_speed); + } + } + +public: + + friend class Ticker; + + SimpleTLE5206Profiler(SimpleTLE5206Output *in1, SimpleTLE5206Output *in2, int duty_cycle_hz) : + SimpleTLE5206(in1, in2, duty_cycle_hz) + { + _desired_speed = 0.0; + _actual_speed = 0.0; + _accel_rate = 0.01; + _decel_rate = 0.01; + _poll_interval = 10000; // 10ms + _poll.attach_us(this, &SimpleTLE5206Profiler::poll, _poll_interval); + } + + int getPollInterval(void) { return _poll_interval; } + void setPollInterval(int i) + { + _poll_interval = i; + _poll.detach(); + _poll.attach_us(this, &SimpleTLE5206Profiler::poll, _poll_interval); + } + + void setAccelRate(double rate) { _accel_rate = rate; } + double getAccelRate(void) { return _accel_rate; } + + void setDecelRate(double rate) { _decel_rate = rate; } + double getDecelRate(void) { return _decel_rate; } + + void setSpeed(double demand_speed) + { + _desired_speed = demand_speed; + } + + double getSpeed(void) { return _actual_speed; } + + void eStop(void) + { + _desired_speed = 0; + SimpleTLE5206::setSpeed(_desired_speed); + } + + +}; + +}; // namespace AjK ends. + + +#endif