Michael Ernst Peter / FastPWM

Dependents:   PM2_Libary PM2_Libary

Committer:
pmic
Date:
Mon Mar 21 14:03:24 2022 +0000
Revision:
38:b83caa1bcbc7
Parent:
37:0ca2cf9a1437
Bugfix.

Who changed what in which revision?

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