Y SI / lib_PwmOutAllPin
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?

UserRevisionLine numberNew 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 }