動作確認済み

GMD.cpp

Committer:
inst
Date:
2016-07-03
Revision:
2:858781a5bbd1
Parent:
1:9d066dbe1893

File content as of revision 2:858781a5bbd1:

#include <algorithm>
#include "GMD.hpp"

const float GMD::_frequency_to_tick_coeff = 3300.0f;
const uint32_t GMD::_default_frequency_kHz = 50;
const float GMD::_duty_lower_limit = 0.0f;
const float GMD::_duty_upper_limit = 1.0f;

GMD::GMD(PinName p0, PinName p1, PinName shut_down) : _shut_down(shut_down, 1) {
    _pwm[0] = new FastPWM(p0);
    _pwm[1] = new FastPWM(p1);
    
    set_frequency_kHz(_default_frequency_kHz);
}

void GMD::set_frequency_kHz(float f_kHz) {
    _pwm[0]->period_ticks(_frequency_to_tick_coeff / f_kHz);
    _pwm[1]->period_ticks(_frequency_to_tick_coeff / f_kHz);
}

float sign(float n) {
    if (n < 0.0f) {
        return -1.0f;
    }
    return 1.0f;
}

float GMD::set(float p) {
    p = std::max(-1.0f, std::min(p, 1.0f));
    p = (abs(p) * (_duty_upper_limit - _duty_lower_limit) + _duty_lower_limit) * sign(p);
    
    if (p < 0.0f) {
        _pwm[0]->write(-p);
        _pwm[1]->write(0.0f);
    } else {
        _pwm[0]->write(0.0f);
        _pwm[1]->write(p);
    }
    _shut_down = 1;
    return p;
}

void GMD::release() {
    _shut_down = 0;
}

float GMD::operator=(float p) {
    return set(p);
}