Dual DC Motor Drive using PWM for RenBuggy; there are two inputs to feed a hall sensor for distance / speed feedback.

Dependents:   RenBuggy

DCMotorDrive.cpp

Committer:
jf1452
Date:
2014-01-14
Revision:
0:34800070e9dc
Child:
1:0c8cb3439288

File content as of revision 0:34800070e9dc:

/*******************************************************************************
* RenBED DC Motor Drive for RenBuggy                                           *
* Copyright (c) 2014 Jon Fuge                                                  *
*                                                                              *
* 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.                                                                *
*                                                                              *
* DCMotorDrive.h                                                               *
*                                                                              *
* V1.0 06/01/2014 First issue of code                      Jon Fuge            *
*******************************************************************************/

#ifndef _DCMOTORDRIVE_C
#define _DCMOTORDRIVE_C

#include "mbed.h"
#include "DCMotorDrive.h"

DCMotorDrive::DCMotorDrive(PinName MotorOut, PinName SensorIn):
    _MotorPin(MotorOut), _SensorIn(SensorIn)
{
    _MotorPin.period_ms(PWM_PERIOD);
    SetMotorPwm(0);
    _SensorIn.mode(PullUp);
    _SensorIn.fall(this, &DCMotorDrive::Counter);
    PulseClock.reset();
    ResetOdometer();
    ClearBuffer();
}

void DCMotorDrive::SetMotorPwm(int PwmValue)
{
    _MotorPin.pulsewidth_us(PwmValue);
}

int DCMotorDrive::GetAveragePulseTime(void)
{
    uint32_t    Average = 0;
    int         BufferPointer;
    int         ValueCount = 0;
    
    for (BufferPointer = 0; BufferPointer <= 15; BufferPointer++ )
    {
        if (ClockBuffer[BufferPointer] != 0)
            ValueCount ++;
        Average += ClockBuffer[BufferPointer];
    }
    return((int)(Average / ValueCount));
}

void DCMotorDrive::ResetOdometer(void)
{
    RotationCounter = 0;
}

int DCMotorDrive::ReadOdometer(void)
{
    return(RotationCounter);
}

void DCMotorDrive::ClearBuffer(void)
{
    int         BufferPointer;

    ClockBuffer[ClockPointer = 0] = 0;
    for (BufferPointer = 1; BufferPointer <= 15; BufferPointer++ )
        ClockBuffer[BufferPointer] = 0;
}
void DCMotorDrive::Counter(void)
{
    ClockBuffer[ClockPointer] = PulseClock.read_us();
    PulseClock.reset();
    timeout.attach(this, &DCMotorDrive::Stall, MOTOR_STALL_TIME);
    RotationCounter++;
    if (++ClockPointer > 15)
        ClockPointer = 0;
}

void DCMotorDrive::Stall(void)
{
    ClearBuffer();
    timeout.detach();
}

#endif