Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
lib_PwmOutAllPin.cpp@1:8067d51d66bd, 2015-07-10 (annotated)
- Committer:
- YSI
- Date:
- Fri Jul 10 14:04:19 2015 +0000
- Revision:
- 1:8067d51d66bd
- Parent:
- 0:0e01d184dbab
- Child:
- 3:1d1669e8c9b1
Am?lioration de la pr?cision du PWM pour les p?riodes en dessous de 100us.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| YSI | 0:0e01d184dbab | 1 | #include "lib_PwmOutAllPin.h" |
| YSI | 0:0e01d184dbab | 2 | |
| YSI | 0:0e01d184dbab | 3 | /** Crée un PwmOutAllPin connecté à la pin spécifié |
| YSI | 0:0e01d184dbab | 4 | * |
| YSI | 0:0e01d184dbab | 5 | * @param pin Pin à connecter |
| YSI | 0:0e01d184dbab | 6 | */ |
| YSI | 0:0e01d184dbab | 7 | PwmOutAllPin::PwmOutAllPin(PinName pin) : PwmOutPin(pin) |
| YSI | 0:0e01d184dbab | 8 | { |
| YSI | 0:0e01d184dbab | 9 | Pwm_period_us = 20000; |
| YSI | 0:0e01d184dbab | 10 | Pwm_Duty_Cycle = 0.0; |
| YSI | 1:8067d51d66bd | 11 | TickerPeriod.attach_us(this, &PwmOutAllPin::DigitalDown, Pwm_period_us); |
| YSI | 0:0e01d184dbab | 12 | } |
| YSI | 0:0e01d184dbab | 13 | |
| YSI | 0:0e01d184dbab | 14 | /** Fixe le rapport cyclique au pourcentage (float) spécifié |
| YSI | 0:0e01d184dbab | 15 | * |
| YSI | 0:0e01d184dbab | 16 | * @param value Une valeure floating-point représentant le rapport cyclique, |
| YSI | 0:0e01d184dbab | 17 | * spécifié sous la forme d'un pourcentage. La valeur doit être comprise entre |
| YSI | 0:0e01d184dbab | 18 | * 0.0f (correspondant à 0%) et 1.0f (correspondant à 100%). |
| YSI | 0:0e01d184dbab | 19 | * Les valeurs exterieures à cette plage sont saturées à 0.0f ou 1.0f. |
| YSI | 0:0e01d184dbab | 20 | */ |
| YSI | 0:0e01d184dbab | 21 | void PwmOutAllPin::write(float value) |
| YSI | 0:0e01d184dbab | 22 | { |
| YSI | 1:8067d51d66bd | 23 | Pwm_Duty_Cycle = value; |
| YSI | 1:8067d51d66bd | 24 | UsePwm(); |
| YSI | 0:0e01d184dbab | 25 | } |
| YSI | 0:0e01d184dbab | 26 | |
| YSI | 0:0e01d184dbab | 27 | /** Retourne la valeur courante du rapport cyclique de la sortie, mesurée sous la forme d'un pourcentage (float) |
| YSI | 0:0e01d184dbab | 28 | * |
| YSI | 0:0e01d184dbab | 29 | * @returns |
| YSI | 0:0e01d184dbab | 30 | * Une valeur floating-point représentant la valeur courante du rapport cyclique qui est sur la pin de sortie, |
| YSI | 0:0e01d184dbab | 31 | * mesurée sous la forme d'un pourcentage. La valeur doit être comprise entre |
| YSI | 0:0e01d184dbab | 32 | * 0.0f (correspondant à 0%) et 1.0f (correspondant à 100%). |
| YSI | 0:0e01d184dbab | 33 | */ |
| YSI | 0:0e01d184dbab | 34 | float PwmOutAllPin::read(void) |
| YSI | 0:0e01d184dbab | 35 | { |
| YSI | 0:0e01d184dbab | 36 | return Pwm_Duty_Cycle; |
| YSI | 0:0e01d184dbab | 37 | } |
| YSI | 0:0e01d184dbab | 38 | |
| YSI | 0:0e01d184dbab | 39 | /** Fixe la période du PWM, spécifié en secondes (float), garde le même rapport cyclique. |
| YSI | 0:0e01d184dbab | 40 | * |
| YSI | 0:0e01d184dbab | 41 | * @note |
| YSI | 0:0e01d184dbab | 42 | * La résolution est en microsecondes mais les périodes inférieure à 100µs sont imprécises. |
| YSI | 0:0e01d184dbab | 43 | */ |
| YSI | 0:0e01d184dbab | 44 | void PwmOutAllPin::period(float seconds) |
| YSI | 0:0e01d184dbab | 45 | { |
| YSI | 1:8067d51d66bd | 46 | period_us(seconds*1000000); |
| YSI | 0:0e01d184dbab | 47 | } |
| YSI | 0:0e01d184dbab | 48 | |
| YSI | 0:0e01d184dbab | 49 | /** Fixe la période du PWM, spécifié en millisecondes (int), garde le même rapport cyclique. |
| YSI | 0:0e01d184dbab | 50 | */ |
| YSI | 0:0e01d184dbab | 51 | void PwmOutAllPin::period_ms(int ms) |
| YSI | 0:0e01d184dbab | 52 | { |
| YSI | 1:8067d51d66bd | 53 | period_us(ms*1000); |
| YSI | 0:0e01d184dbab | 54 | } |
| YSI | 0:0e01d184dbab | 55 | |
| YSI | 0:0e01d184dbab | 56 | /** Fixe la période du PWM, spécifié en microsecondes (int), garde le même rapport cyclique. |
| YSI | 0:0e01d184dbab | 57 | */ |
| YSI | 0:0e01d184dbab | 58 | void PwmOutAllPin::period_us(int us) |
| YSI | 0:0e01d184dbab | 59 | { |
| YSI | 1:8067d51d66bd | 60 | if(us != Pwm_period_us) |
| YSI | 1:8067d51d66bd | 61 | { |
| YSI | 1:8067d51d66bd | 62 | Pwm_period_us = us; |
| YSI | 1:8067d51d66bd | 63 | UsePwm(); |
| YSI | 1:8067d51d66bd | 64 | TickerPeriod.attach_us(this, &PwmOutAllPin::DigitalDown, Pwm_period_us); |
| YSI | 1:8067d51d66bd | 65 | } |
| YSI | 0:0e01d184dbab | 66 | } |
| YSI | 0:0e01d184dbab | 67 | |
| YSI | 0:0e01d184dbab | 68 | /** Fixe la largeur d'impulsion du PWM, spécifié en secondes (float), garde la même période. |
| YSI | 0:0e01d184dbab | 69 | */ |
| YSI | 0:0e01d184dbab | 70 | void PwmOutAllPin::pulsewidth(float seconds) |
| YSI | 0:0e01d184dbab | 71 | { |
| YSI | 1:8067d51d66bd | 72 | pulsewidth_us(seconds*1000000); |
| YSI | 0:0e01d184dbab | 73 | } |
| YSI | 0:0e01d184dbab | 74 | |
| YSI | 0:0e01d184dbab | 75 | /** Fixe la largeur d'impulsion du PWM, spécifié en millisecondes (int), garde la même période. |
| YSI | 0:0e01d184dbab | 76 | */ |
| YSI | 0:0e01d184dbab | 77 | void PwmOutAllPin::pulsewidth_ms(int ms) |
| YSI | 0:0e01d184dbab | 78 | { |
| YSI | 1:8067d51d66bd | 79 | pulsewidth_us(ms*1000); |
| YSI | 0:0e01d184dbab | 80 | } |
| YSI | 0:0e01d184dbab | 81 | |
| YSI | 0:0e01d184dbab | 82 | /** Fixe la largeur d'impulsion du PWM, spécifié en microsecondes (int), garde la même période. |
| YSI | 0:0e01d184dbab | 83 | */ |
| YSI | 0:0e01d184dbab | 84 | void PwmOutAllPin::pulsewidth_us(int us) |
| YSI | 0:0e01d184dbab | 85 | { |
| YSI | 1:8067d51d66bd | 86 | Pwm_Duty_Cycle = (float)us/Pwm_period_us; |
| YSI | 0:0e01d184dbab | 87 | UsePwm(); |
| YSI | 0:0e01d184dbab | 88 | } |
| YSI | 0:0e01d184dbab | 89 | |
| YSI | 0:0e01d184dbab | 90 | /** raccourci pour write() |
| YSI | 0:0e01d184dbab | 91 | */ |
| YSI | 0:0e01d184dbab | 92 | PwmOutAllPin& PwmOutAllPin::operator= (float value) |
| YSI | 0:0e01d184dbab | 93 | { |
| YSI | 0:0e01d184dbab | 94 | write(value); |
| YSI | 0:0e01d184dbab | 95 | return *this; |
| YSI | 0:0e01d184dbab | 96 | } |
| YSI | 0:0e01d184dbab | 97 | |
| YSI | 0:0e01d184dbab | 98 | /** raccourci pour effectuer des opperations mathématique avec write() |
| YSI | 0:0e01d184dbab | 99 | */ |
| YSI | 0:0e01d184dbab | 100 | PwmOutAllPin& PwmOutAllPin::operator= (PwmOutAllPin& rhs) |
| YSI | 0:0e01d184dbab | 101 | { |
| YSI | 0:0e01d184dbab | 102 | write(rhs.read()); |
| YSI | 0:0e01d184dbab | 103 | return *this; |
| YSI | 0:0e01d184dbab | 104 | } |
| YSI | 0:0e01d184dbab | 105 | |
| YSI | 0:0e01d184dbab | 106 | /** raccourci pour read() |
| YSI | 0:0e01d184dbab | 107 | */ |
| YSI | 0:0e01d184dbab | 108 | PwmOutAllPin::operator float() |
| YSI | 0:0e01d184dbab | 109 | { |
| YSI | 0:0e01d184dbab | 110 | return read(); |
| YSI | 0:0e01d184dbab | 111 | } |
| YSI | 0:0e01d184dbab | 112 | |
| YSI | 0:0e01d184dbab | 113 | void PwmOutAllPin::DigitalUp(void) |
| YSI | 0:0e01d184dbab | 114 | { |
| YSI | 0:0e01d184dbab | 115 | PwmOutPin = 1; |
| YSI | 0:0e01d184dbab | 116 | } |
| YSI | 0:0e01d184dbab | 117 | |
| YSI | 0:0e01d184dbab | 118 | void PwmOutAllPin::DigitalDown(void) |
| YSI | 0:0e01d184dbab | 119 | { |
| YSI | 1:8067d51d66bd | 120 | if((Pwm_Duty_Cycle > 0.0) && (Pwm_Duty_Cycle < 1.0)) |
| YSI | 1:8067d51d66bd | 121 | { |
| YSI | 1:8067d51d66bd | 122 | PwmOutPin = 0; |
| YSI | 1:8067d51d66bd | 123 | SwitchPin.attach_us(this, &PwmOutAllPin::DigitalUp, TimeDown); |
| YSI | 1:8067d51d66bd | 124 | } |
| YSI | 0:0e01d184dbab | 125 | } |
| YSI | 0:0e01d184dbab | 126 | |
| YSI | 0:0e01d184dbab | 127 | void PwmOutAllPin::UsePwm(void) |
| YSI | 0:0e01d184dbab | 128 | { |
| YSI | 0:0e01d184dbab | 129 | if((Pwm_Duty_Cycle > 0.0) && (Pwm_Duty_Cycle < 1.0)) |
| YSI | 0:0e01d184dbab | 130 | { |
| YSI | 1:8067d51d66bd | 131 | TimeDown = Pwm_period_us*(1.0-Pwm_Duty_Cycle); |
| YSI | 0:0e01d184dbab | 132 | } |
| YSI | 0:0e01d184dbab | 133 | else if(Pwm_Duty_Cycle >= 1.0) |
| YSI | 0:0e01d184dbab | 134 | { |
| YSI | 1:8067d51d66bd | 135 | SwitchPin.detach(); |
| YSI | 0:0e01d184dbab | 136 | Pwm_Duty_Cycle = 1.0; |
| YSI | 0:0e01d184dbab | 137 | PwmOutPin = 1; |
| YSI | 0:0e01d184dbab | 138 | } |
| YSI | 0:0e01d184dbab | 139 | else |
| YSI | 0:0e01d184dbab | 140 | { |
| YSI | 1:8067d51d66bd | 141 | SwitchPin.detach(); |
| YSI | 0:0e01d184dbab | 142 | Pwm_Duty_Cycle = 0.0; |
| YSI | 0:0e01d184dbab | 143 | PwmOutPin = 0; |
| YSI | 0:0e01d184dbab | 144 | } |
| YSI | 0:0e01d184dbab | 145 | } |