Motor Shield Example code for 2.74 Class @ MIT

Dependents:   experiment_example motor_shield_example Lab3_experiment_example jumping_leg_clicky

MotorShield.cpp

Committer:
elijahsj
Date:
2020-08-26
Revision:
7:e3a2ade56b79
Parent:
5:d2dffc88e94d
Child:
8:46feb6919761

File content as of revision 7:e3a2ade56b79:

/* Library to interface with 2.74 Motor Shield
** Uses low level HAL libraries to enable high speed PWM 
** Use as follows:
** - Create shield object and specify PWM period for the motors
** - Set the duty cycle and direction for each motor 
*/

#include "mbed.h"
#include "MotorShield.h"
#include "HardwareSetup.h"

MotorShield::MotorShield(int periodTicks) {
    periodTickVal = periodTicks; 
    init();
}
 
void MotorShield::init() {
    /** Initial config for the STM32H743 **/
    
    initHardware(periodTickVal);   // Setup PWM
    wait_us(100);
        
}
 
void MotorShield::motorAWrite(float duty_cycle, int direction) {
    int tick = (int)(periodTickVal * duty_cycle); 

    if (direction){
            
            TIM15->CCR2 = tick;
            TIM15->CCR1 = 0;

    }
    else {
            TIM15->CCR2 = 0;
            TIM15->CCR1 = tick;
    }
    
}

void MotorShield::motorBWrite(float duty_cycle, int direction) {
    int tick = (int)(periodTickVal * duty_cycle); 

    if (direction){
            TIM12->CCR2 = tick;
            TIM12->CCR1 = 0;
    }
    else {
            TIM12->CCR2 = 0;
            TIM12->CCR1 = tick;
    }

}

void MotorShield::motorCWrite(float duty_cycle, int direction) {
    int tick = (int)(periodTickVal * duty_cycle); 

    if (direction){
            TIM13->CCR1 = 0;
            TIM14->CCR1 = tick;
    }
    else {
            TIM13->CCR1 = tick;
            TIM14->CCR1 = 0;
    }
}
void MotorShield::motorDWrite(float duty_cycle, int direction) {
    int tick = (int)(periodTickVal * duty_cycle); 

    if (direction){
            TIM16->CCR1 = tick;
            TIM17->CCR1 = 0;
    }
    else {
            TIM16->CCR1 = 0;
            TIM17->CCR1 = tick;
    }
}

uint32_t MotorShield::readCurrentA() {
    return readADC1(0);
}
uint32_t MotorShield::readCurrentB() {
    return readADC1(1);
}
uint32_t MotorShield::readCurrentC() {
    return readADC2(1);
}
uint32_t MotorShield::readCurrentD() {
    return readADC2(0);
}

void MotorShield::changePeriod(int periodTicks){
    periodTickVal = periodTicks; 
    init();
}