p kj
/
MKS22-CubeFine
LPC824
Fork of CubeFine by
Microduino_Motor.cpp
- Committer:
- beian10
- Date:
- 2016-07-01
- Revision:
- 1:54a2d380f8c7
- Parent:
- 0:362c1482232c
- Child:
- 2:7964622fb5a5
File content as of revision 1:54a2d380f8c7:
#include "Microduino_Motor.h" static motor_t motors[10]; // static array of key structures uint8_t MotorCount = 0; // the total number of attached keys Motor::Motor(PinName _motor_pinA, PinName _motor_pinB) { if ( MotorCount < 10) { this->motorIndex = MotorCount++; // assign a key index to this instance //if (_motor_pinA < NUM_DIGITAL_PINS && _motor_pinB < NUM_DIGITAL_PINS) { if (true) { _period_us = 255; // 500Hz pwmout_init(&_pwmA, _motor_pinA); pwmout_period_us(&_pwmA, _period_us); // 500Hz pwmout_pulsewidth_us(&_pwmA, 1); motors[this->motorIndex].Pin.nbr_A = _motor_pinA; pwmout_init(&_pwmB, _motor_pinB); pwmout_period_us(&_pwmB, _period_us); // 500Hz pwmout_pulsewidth_us(&_pwmB, 1); motors[this->motorIndex].Pin.nbr_B = _motor_pinB; this->fix=1; } } else { this->motorIndex = 255 ; // too many keys } } void Motor::Fix(float _fix) { this->fix=_fix; } int16_t Motor::GetData(int16_t _throttle, int16_t _steering, uint8_t _dir) { this->_motor_vol = _throttle; if(_dir == 1) { this->_motor_vol -= _steering / 2; } else { this->_motor_vol += _steering / 2; } if (this->_motor_vol > 255) this->_motor_vol = 255; else if (this->_motor_vol < -255) this->_motor_vol = -255; //this->_motor_vol *= fix; return this->_motor_vol; } #if 0 void Motor::Driver(int16_t _motor_driver) { int8_t channel_A = motors[this->motorIndex].Pin.nbr_A; int8_t channel_B = motors[this->motorIndex].Pin.nbr_B; if (_motor_driver == 0) { digitalWrite(channel_A, LOW); digitalWrite(channel_B, LOW); } else if (_motor_driver > 0) { analogWrite(channel_A, _motor_driver); digitalWrite(channel_B, LOW); } else { analogWrite(channel_A, 255 + _motor_driver); digitalWrite(channel_B, HIGH); } } #else void Motor::Driver(int16_t _motor_driver) { //static bool flag = true; uint32_t pulseWidth = 0; //PinName channel_A = motors[this->motorIndex].Pin.nbr_A; //PinName channel_B = motors[this->motorIndex].Pin.nbr_B; #if 0 pwmout_pulsewidth_us(&_pwmA, _period_us/2); pwmout_pulsewidth_us(&_pwmB, 0); return; #endif #if 0 pwmout_pulsewidth_us(&_pwmA, 0); pwmout_pulsewidth_us(&_pwmB, _period_us/2); return; #endif if (_motor_driver == 0) { pwmout_pulsewidth_us(&_pwmA, 0); pwmout_pulsewidth_us(&_pwmB, 0); } else if (_motor_driver > 0) { #if 1 pulseWidth = _period_us / 255 * _motor_driver; pwmout_pulsewidth_us(&_pwmA, pulseWidth); pwmout_pulsewidth_us(&_pwmB, 2); #else pwmout_pulsewidth_us(&_pwmA, _period_us/2); pwmout_pulsewidth_us(&_pwmB, 0); #endif } else { #if 0 _motor_driver = 255 + _motor_driver; pulseWidth = _period_us / 255 * _motor_driver; pwmout_pulsewidth_us(&_pwmA, 0); pwmout_pulsewidth_us(&_pwmB, pulseWidth); #elif 1 _motor_driver = abs(_motor_driver); pulseWidth = _period_us / 255 * _motor_driver; pwmout_pulsewidth_us(&_pwmA, 2); pwmout_pulsewidth_us(&_pwmB, pulseWidth); #elif 0 _motor_driver = 255 + _motor_driver; pulseWidth = _period_us / 255 * _motor_driver; pwmout_pulsewidth_us(&_pwmA, _period_us); pwmout_pulsewidth_us(&_pwmB, pulseWidth); #else pwmout_pulsewidth_us(&_pwmA, 0); pwmout_pulsewidth_us(&_pwmB, 241); #endif } } #endif void Motor::Free() { int8_t channel_A = motors[this->motorIndex].Pin.nbr_A; int8_t channel_B = motors[this->motorIndex].Pin.nbr_B; #if 0 digitalWrite(channel_A, LOW); digitalWrite(channel_B, LOW); #else pwmout_pulsewidth_us(&_pwmA, 0); pwmout_pulsewidth_us(&_pwmB, 0); #endif } void Motor::Brake() { int8_t channel_A = motors[this->motorIndex].Pin.nbr_A; int8_t channel_B = motors[this->motorIndex].Pin.nbr_B; #if 0 digitalWrite(channel_A, HIGH); digitalWrite(channel_B, HIGH); #else pwmout_pulsewidth_us(&_pwmA, _period_us); pwmout_pulsewidth_us(&_pwmB, _period_us); #endif }