Microduino的cube小车。

Dependencies:   mbed-rtos mbed

Committer:
lixianyu
Date:
Fri May 27 01:44:31 2016 +0000
Revision:
3:e4ac7c1a14de
Parent:
2:70ca3e685cca
Child:
4:0670023d3f36
???????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lixianyu 1:758ccab13947 1 #include "Microduino_Motor.h"
lixianyu 1:758ccab13947 2
lixianyu 1:758ccab13947 3 static motor_t motors[10]; // static array of key structures
lixianyu 1:758ccab13947 4
lixianyu 1:758ccab13947 5 uint8_t MotorCount = 0; // the total number of attached keys
lixianyu 1:758ccab13947 6
lixianyu 2:70ca3e685cca 7 Motor::Motor(PinName _motor_pinA, PinName _motor_pinB)
lixianyu 1:758ccab13947 8 {
lixianyu 1:758ccab13947 9 if ( MotorCount < 10) {
lixianyu 1:758ccab13947 10 this->motorIndex = MotorCount++; // assign a key index to this instance
lixianyu 2:70ca3e685cca 11 //if (_motor_pinA < NUM_DIGITAL_PINS && _motor_pinB < NUM_DIGITAL_PINS) {
lixianyu 2:70ca3e685cca 12 if (true) {
lixianyu 3:e4ac7c1a14de 13 #if 0
lixianyu 3:e4ac7c1a14de 14 pinMode( _motor_pinA, OUTPUT) ;
lixianyu 3:e4ac7c1a14de 15 #else
lixianyu 3:e4ac7c1a14de 16 _period_us = 2000; // 500Hz
lixianyu 3:e4ac7c1a14de 17 pwmout_init(&_pwmA, _motor_pinA);
lixianyu 3:e4ac7c1a14de 18 pwmout_period_us(&_pwmA, _period_us); // 500Hz
lixianyu 3:e4ac7c1a14de 19 #endif
lixianyu 1:758ccab13947 20 motors[this->motorIndex].Pin.nbr_A = _motor_pinA;
lixianyu 1:758ccab13947 21
lixianyu 3:e4ac7c1a14de 22 #if 0
lixianyu 3:e4ac7c1a14de 23 pinMode( _motor_pinB, OUTPUT) ;
lixianyu 3:e4ac7c1a14de 24 #else
lixianyu 3:e4ac7c1a14de 25 pwmout_init(&_pwmB, _motor_pinB);
lixianyu 3:e4ac7c1a14de 26 pwmout_period_us(&_pwmB, _period_us); // 500Hz
lixianyu 3:e4ac7c1a14de 27 #endif
lixianyu 1:758ccab13947 28 motors[this->motorIndex].Pin.nbr_B = _motor_pinB;
lixianyu 1:758ccab13947 29
lixianyu 1:758ccab13947 30 this->fix=1;
lixianyu 1:758ccab13947 31 }
lixianyu 3:e4ac7c1a14de 32 } else {
lixianyu 1:758ccab13947 33 this->motorIndex = 255 ; // too many keys
lixianyu 3:e4ac7c1a14de 34 }
lixianyu 1:758ccab13947 35 }
lixianyu 1:758ccab13947 36
lixianyu 1:758ccab13947 37 void Motor::Fix(float _fix)
lixianyu 1:758ccab13947 38 {
lixianyu 1:758ccab13947 39 this->fix=_fix;
lixianyu 1:758ccab13947 40 }
lixianyu 1:758ccab13947 41
lixianyu 1:758ccab13947 42 int16_t Motor::GetData(int16_t _throttle, int16_t _steering, bool _dir)
lixianyu 1:758ccab13947 43 {
lixianyu 1:758ccab13947 44 this->_motor_vol = _throttle;
lixianyu 1:758ccab13947 45
lixianyu 1:758ccab13947 46 if(_dir)
lixianyu 1:758ccab13947 47 this->_motor_vol -= _steering / 2;
lixianyu 1:758ccab13947 48 else
lixianyu 1:758ccab13947 49 this->_motor_vol += _steering / 2;
lixianyu 1:758ccab13947 50
lixianyu 1:758ccab13947 51 if (this->_motor_vol > 255)
lixianyu 1:758ccab13947 52 this->_motor_vol = 255;
lixianyu 1:758ccab13947 53 else if (this->_motor_vol < -255)
lixianyu 1:758ccab13947 54 this->_motor_vol = -255;
lixianyu 1:758ccab13947 55
lixianyu 1:758ccab13947 56 this->_motor_vol *= fix;
lixianyu 1:758ccab13947 57
lixianyu 1:758ccab13947 58 return this->_motor_vol;
lixianyu 1:758ccab13947 59 }
lixianyu 1:758ccab13947 60
lixianyu 3:e4ac7c1a14de 61 #if 0
lixianyu 1:758ccab13947 62 void Motor::Driver(int16_t _motor_driver)
lixianyu 1:758ccab13947 63 {
lixianyu 1:758ccab13947 64 int8_t channel_A = motors[this->motorIndex].Pin.nbr_A;
lixianyu 1:758ccab13947 65 int8_t channel_B = motors[this->motorIndex].Pin.nbr_B;
lixianyu 1:758ccab13947 66 if (_motor_driver == 0) {
lixianyu 1:758ccab13947 67 digitalWrite(channel_A, LOW);
lixianyu 1:758ccab13947 68 digitalWrite(channel_B, LOW);
lixianyu 1:758ccab13947 69 } else if (_motor_driver > 0) {
lixianyu 1:758ccab13947 70 analogWrite(channel_A, _motor_driver);
lixianyu 1:758ccab13947 71 digitalWrite(channel_B, LOW);
lixianyu 1:758ccab13947 72 } else {
lixianyu 1:758ccab13947 73 analogWrite(channel_A, 255 + _motor_driver);
lixianyu 1:758ccab13947 74 digitalWrite(channel_B, HIGH);
lixianyu 1:758ccab13947 75 }
lixianyu 1:758ccab13947 76 }
lixianyu 3:e4ac7c1a14de 77 #else
lixianyu 3:e4ac7c1a14de 78 void Motor::Driver(int16_t _motor_driver)
lixianyu 3:e4ac7c1a14de 79 {
lixianyu 3:e4ac7c1a14de 80 int16_t pulseWidth = 0;
lixianyu 3:e4ac7c1a14de 81 PinName channel_A = motors[this->motorIndex].Pin.nbr_A;
lixianyu 3:e4ac7c1a14de 82 PinName channel_B = motors[this->motorIndex].Pin.nbr_B;
lixianyu 3:e4ac7c1a14de 83 if (_motor_driver == 0) {
lixianyu 3:e4ac7c1a14de 84 pwmout_pulsewidth_us(&_pwmA, 0);
lixianyu 3:e4ac7c1a14de 85 pwmout_pulsewidth_us(&_pwmB, 0);
lixianyu 3:e4ac7c1a14de 86 } else if (_motor_driver > 0) {
lixianyu 3:e4ac7c1a14de 87 pulseWidth = _period_us * _motor_driver / 255;
lixianyu 3:e4ac7c1a14de 88 pwmout_pulsewidth_us(&_pwmA, pulseWidth);
lixianyu 3:e4ac7c1a14de 89 pwmout_pulsewidth_us(&_pwmB, 0);
lixianyu 3:e4ac7c1a14de 90 } else {
lixianyu 3:e4ac7c1a14de 91 _motor_driver = 255 + _motor_driver;
lixianyu 3:e4ac7c1a14de 92 pulseWidth = _period_us * _motor_driver / 255;
lixianyu 3:e4ac7c1a14de 93 pwmout_pulsewidth_us(&_pwmA, pulseWidth);
lixianyu 3:e4ac7c1a14de 94 pwmout_pulsewidth_us(&_pwmB, _period_us);
lixianyu 3:e4ac7c1a14de 95 }
lixianyu 3:e4ac7c1a14de 96 }
lixianyu 3:e4ac7c1a14de 97 #endif
lixianyu 1:758ccab13947 98
lixianyu 1:758ccab13947 99 void Motor::Free()
lixianyu 1:758ccab13947 100 {
lixianyu 1:758ccab13947 101 int8_t channel_A = motors[this->motorIndex].Pin.nbr_A;
lixianyu 1:758ccab13947 102 int8_t channel_B = motors[this->motorIndex].Pin.nbr_B;
lixianyu 3:e4ac7c1a14de 103 #if 0
lixianyu 1:758ccab13947 104 digitalWrite(channel_A, LOW);
lixianyu 1:758ccab13947 105 digitalWrite(channel_B, LOW);
lixianyu 3:e4ac7c1a14de 106 #else
lixianyu 3:e4ac7c1a14de 107 pwmout_pulsewidth_us(&_pwmA, 0);
lixianyu 3:e4ac7c1a14de 108 pwmout_pulsewidth_us(&_pwmB, 0);
lixianyu 3:e4ac7c1a14de 109 #endif
lixianyu 1:758ccab13947 110 }
lixianyu 1:758ccab13947 111
lixianyu 1:758ccab13947 112 void Motor::Brake()
lixianyu 1:758ccab13947 113 {
lixianyu 1:758ccab13947 114 int8_t channel_A = motors[this->motorIndex].Pin.nbr_A;
lixianyu 1:758ccab13947 115 int8_t channel_B = motors[this->motorIndex].Pin.nbr_B;
lixianyu 3:e4ac7c1a14de 116 #if 0
lixianyu 1:758ccab13947 117 digitalWrite(channel_A, HIGH);
lixianyu 1:758ccab13947 118 digitalWrite(channel_B, HIGH);
lixianyu 3:e4ac7c1a14de 119 #else
lixianyu 3:e4ac7c1a14de 120 pwmout_pulsewidth_us(&_pwmA, _period_us);
lixianyu 3:e4ac7c1a14de 121 pwmout_pulsewidth_us(&_pwmB, _period_us);
lixianyu 3:e4ac7c1a14de 122 #endif
lixianyu 1:758ccab13947 123 }