Martin Gurtner / HKC_MiniCheetah
Committer:
MartinGurtner
Date:
Fri Jan 22 13:10:37 2021 +0000
Revision:
60:8399756e1ba1
.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MartinGurtner 60:8399756e1ba1 1 #include "FastPWM.h"
MartinGurtner 60:8399756e1ba1 2
MartinGurtner 60:8399756e1ba1 3 FastPWM::FastPWM(PinName pin, int prescaler) : PwmOut(pin) {
MartinGurtner 60:8399756e1ba1 4 fast_obj = NULL;
MartinGurtner 60:8399756e1ba1 5 initFastPWM();
MartinGurtner 60:8399756e1ba1 6 this->prescaler(prescaler);
MartinGurtner 60:8399756e1ba1 7
MartinGurtner 60:8399756e1ba1 8 //Set duty cycle on 0%, period on 20ms
MartinGurtner 60:8399756e1ba1 9 period(0.02);
MartinGurtner 60:8399756e1ba1 10 write(0);
MartinGurtner 60:8399756e1ba1 11
MartinGurtner 60:8399756e1ba1 12
MartinGurtner 60:8399756e1ba1 13 }
MartinGurtner 60:8399756e1ba1 14
MartinGurtner 60:8399756e1ba1 15 FastPWM::~FastPWM( void ) {
MartinGurtner 60:8399756e1ba1 16 if (fast_obj != NULL)
MartinGurtner 60:8399756e1ba1 17 delete(fast_obj);
MartinGurtner 60:8399756e1ba1 18 }
MartinGurtner 60:8399756e1ba1 19
MartinGurtner 60:8399756e1ba1 20 void FastPWM::period(double seconds) {
MartinGurtner 60:8399756e1ba1 21 if (dynamicPrescaler)
MartinGurtner 60:8399756e1ba1 22 calcPrescaler((uint64_t)(seconds * (double) SystemCoreClock));
MartinGurtner 60:8399756e1ba1 23
MartinGurtner 60:8399756e1ba1 24 period_ticks(seconds * dticks + 0.5);
MartinGurtner 60:8399756e1ba1 25 }
MartinGurtner 60:8399756e1ba1 26
MartinGurtner 60:8399756e1ba1 27 void FastPWM::period_ms(int ms) {
MartinGurtner 60:8399756e1ba1 28 if (dynamicPrescaler)
MartinGurtner 60:8399756e1ba1 29 calcPrescaler(ms * (SystemCoreClock / 1000));
MartinGurtner 60:8399756e1ba1 30
MartinGurtner 60:8399756e1ba1 31 period_ticks(ms * iticks_ms);
MartinGurtner 60:8399756e1ba1 32 }
MartinGurtner 60:8399756e1ba1 33
MartinGurtner 60:8399756e1ba1 34 void FastPWM::period_us(int us) {
MartinGurtner 60:8399756e1ba1 35 if (dynamicPrescaler)
MartinGurtner 60:8399756e1ba1 36 calcPrescaler(us * (SystemCoreClock / 1000000));
MartinGurtner 60:8399756e1ba1 37
MartinGurtner 60:8399756e1ba1 38 period_ticks(us * iticks_us);
MartinGurtner 60:8399756e1ba1 39 }
MartinGurtner 60:8399756e1ba1 40
MartinGurtner 60:8399756e1ba1 41 void FastPWM::period_us(double us) {
MartinGurtner 60:8399756e1ba1 42 if (dynamicPrescaler)
MartinGurtner 60:8399756e1ba1 43 calcPrescaler((uint64_t)(us * (double)(SystemCoreClock / 1000000)));
MartinGurtner 60:8399756e1ba1 44
MartinGurtner 60:8399756e1ba1 45 period_ticks(us * dticks_us + 0.5);
MartinGurtner 60:8399756e1ba1 46 }
MartinGurtner 60:8399756e1ba1 47
MartinGurtner 60:8399756e1ba1 48 void FastPWM::pulsewidth(double seconds) {
MartinGurtner 60:8399756e1ba1 49 pulsewidth_ticks(seconds * dticks + 0.5);
MartinGurtner 60:8399756e1ba1 50 }
MartinGurtner 60:8399756e1ba1 51
MartinGurtner 60:8399756e1ba1 52 void FastPWM::pulsewidth_ms(int ms) {
MartinGurtner 60:8399756e1ba1 53 pulsewidth_ticks(ms * iticks_ms);
MartinGurtner 60:8399756e1ba1 54 }
MartinGurtner 60:8399756e1ba1 55
MartinGurtner 60:8399756e1ba1 56 void FastPWM::pulsewidth_us(int us) {
MartinGurtner 60:8399756e1ba1 57 pulsewidth_ticks(us * iticks_us);
MartinGurtner 60:8399756e1ba1 58 }
MartinGurtner 60:8399756e1ba1 59
MartinGurtner 60:8399756e1ba1 60 void FastPWM::pulsewidth_us(double us) {
MartinGurtner 60:8399756e1ba1 61 pulsewidth_ticks(us * dticks_us + 0.5);
MartinGurtner 60:8399756e1ba1 62 }
MartinGurtner 60:8399756e1ba1 63
MartinGurtner 60:8399756e1ba1 64 void FastPWM::write(double duty) {
MartinGurtner 60:8399756e1ba1 65 _duty=duty;
MartinGurtner 60:8399756e1ba1 66 pulsewidth_ticks(duty*getPeriod());
MartinGurtner 60:8399756e1ba1 67 }
MartinGurtner 60:8399756e1ba1 68
MartinGurtner 60:8399756e1ba1 69 double FastPWM::read( void ) {
MartinGurtner 60:8399756e1ba1 70 return _duty;
MartinGurtner 60:8399756e1ba1 71 }
MartinGurtner 60:8399756e1ba1 72
MartinGurtner 60:8399756e1ba1 73 FastPWM & FastPWM::operator= (double value) {
MartinGurtner 60:8399756e1ba1 74 write(value);
MartinGurtner 60:8399756e1ba1 75 return(*this);
MartinGurtner 60:8399756e1ba1 76 }
MartinGurtner 60:8399756e1ba1 77
MartinGurtner 60:8399756e1ba1 78 FastPWM::operator double() {
MartinGurtner 60:8399756e1ba1 79 return _duty;
MartinGurtner 60:8399756e1ba1 80 }
MartinGurtner 60:8399756e1ba1 81
MartinGurtner 60:8399756e1ba1 82 int FastPWM::prescaler(int value) {
MartinGurtner 60:8399756e1ba1 83 int retval;
MartinGurtner 60:8399756e1ba1 84 if (value == -1) {
MartinGurtner 60:8399756e1ba1 85 dynamicPrescaler = true;
MartinGurtner 60:8399756e1ba1 86 value = 0;
MartinGurtner 60:8399756e1ba1 87 }
MartinGurtner 60:8399756e1ba1 88 else
MartinGurtner 60:8399756e1ba1 89 dynamicPrescaler = false;
MartinGurtner 60:8399756e1ba1 90
MartinGurtner 60:8399756e1ba1 91 retval = setPrescaler(value);
MartinGurtner 60:8399756e1ba1 92 updateTicks(retval);
MartinGurtner 60:8399756e1ba1 93 return retval;
MartinGurtner 60:8399756e1ba1 94 }
MartinGurtner 60:8399756e1ba1 95
MartinGurtner 60:8399756e1ba1 96 void FastPWM::updateTicks( uint32_t prescaler ) {
MartinGurtner 60:8399756e1ba1 97 dticks = SystemCoreClock / (double)prescaler;
MartinGurtner 60:8399756e1ba1 98 dticks_us = dticks / 1000000.0f;
MartinGurtner 60:8399756e1ba1 99 iticks_us = (int)(dticks_us + 0.5);
MartinGurtner 60:8399756e1ba1 100 iticks_ms = (int)(dticks_us * 1000.0 + 0.5);
MartinGurtner 60:8399756e1ba1 101 }
MartinGurtner 60:8399756e1ba1 102
MartinGurtner 60:8399756e1ba1 103 int FastPWM::calcPrescaler(uint64_t clocks) {
MartinGurtner 60:8399756e1ba1 104 uint32_t scale = (clocks >> bits) + 1;
MartinGurtner 60:8399756e1ba1 105 uint32_t retval = setPrescaler(scale);
MartinGurtner 60:8399756e1ba1 106 updateTicks(retval);
MartinGurtner 60:8399756e1ba1 107 return retval;
MartinGurtner 60:8399756e1ba1 108 }