Avion Radio IUT / Mbed 2 deprecated MecatroPWM

Dependencies:   mbed

Committer:
qmaker
Date:
Thu Apr 15 06:44:26 2021 +0000
Revision:
1:b44f69eb07c4
Version asservissement avec codeurs et BT

Who changed what in which revision?

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