Y SI / lib_PwmOutAllPin
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lib_PwmOutAllPin.cpp Source File

lib_PwmOutAllPin.cpp

00001 /** Lib PwmOutAllPin using TimeOut
00002 *
00003 * Copyright (c) 2014, cstyles (http://mbed.org)
00004 *
00005 * Exemple:
00006 * @code
00007 * #include "mbed.h"
00008 * #include "lib_PwmOutAllPin.h"
00009 * 
00010 * PwmOutAllPin pin1(p20);
00011 * PwmOutAllPin pin2(p12);
00012 * 
00013 * int main()
00014 * {
00015 *     pin2.period(0.0002);
00016 *     pin2 = 0.25;
00017 *     pin1 = 0.5;
00018 *     pin1.period_us(20);
00019 * 
00020 *     while(1)
00021 *     {
00022 *       wait(0.25);
00023 *     }
00024 * }
00025 * @endcode
00026 * @file          lib_PwmOutAllPin.h 
00027 * @purpose       library for PwmOut on all pins
00028 * @date          2015
00029 * @author        Yannic Simon
00030 */
00031 
00032 #include "lib_PwmOutAllPin.h"
00033 
00034 /** Crée un PwmOutAllPin connecté à la pin spécifiée
00035  *  @note init period 20ms and duty cycle 0%
00036  *  @param pin Pin à connecter
00037  */
00038 PwmOutAllPin::PwmOutAllPin(PinName pin) : PwmOutPin(pin)
00039 {
00040     Pwm_period_us = 20000;
00041     Pwm_Duty_Cycle = 0.0;
00042     TickerPeriod.attach_us(this, &PwmOutAllPin::DigitalDown, Pwm_period_us);
00043 }
00044 
00045 /** Fixe le rapport cyclique au pourcentage (float) spécifié
00046  *
00047  *  @param value Une valeure floating-point représentant le rapport cyclique,
00048  *    spécifié sous la forme d'un pourcentage. La valeur doit être comprise entre
00049  *    0.0f (correspondant à 0%) et 1.0f (correspondant à 100%).
00050  *    Les valeurs exterieures à cette plage sont saturées à 0.0f ou 1.0f.
00051  */
00052 void PwmOutAllPin::write(float value)
00053 {
00054     Pwm_Duty_Cycle = value;
00055     UsePwm();
00056 }
00057 
00058 /** Retourne la valeur courante du rapport cyclique de la sortie, mesurée sous la forme d'un pourcentage (float)
00059  *
00060  *  @returns
00061  *    Une valeur floating-point représentant la valeur courante du rapport cyclique qui est sur la pin de sortie,
00062  *    mesurée sous la forme d'un pourcentage. La valeur doit être comprise entre
00063  *    0.0f (correspondant à 0%) et 1.0f (correspondant à 100%).
00064  */
00065 float PwmOutAllPin::read(void)
00066 {
00067     return Pwm_Duty_Cycle;
00068 }
00069 
00070 /** Fixe la période du PWM, spécifié en secondes (float), garde le même rapport cyclique.
00071  *
00072  *  @note
00073  *   La résolution est en microsecondes mais les périodes inférieure à 100µs sont imprécises.
00074  */
00075 void PwmOutAllPin::period(float seconds)
00076 {
00077     period_us(seconds*1000000);
00078 }
00079 
00080 /** Fixe la période du PWM, spécifié en millisecondes (int), garde le même rapport cyclique.
00081  */
00082 void PwmOutAllPin::period_ms(int ms)
00083 {
00084     period_us(ms*1000);
00085 }
00086 
00087 /** Fixe la période du PWM, spécifié en microsecondes (int), garde le même rapport cyclique.
00088  */
00089 void PwmOutAllPin::period_us(int us)
00090 {
00091     if(us != Pwm_period_us)
00092     {
00093         Pwm_period_us = us;
00094         UsePwm();
00095         TickerPeriod.attach_us(this, &PwmOutAllPin::DigitalDown, Pwm_period_us);
00096     }
00097 }
00098 
00099 /** Fixe la largeur d'impulsion du PWM, spécifié en secondes (float), garde la même période.
00100  */
00101 void PwmOutAllPin::pulsewidth(float seconds)
00102 {
00103     pulsewidth_us(seconds*1000000);
00104 }
00105 
00106 /** Fixe la largeur d'impulsion du PWM, spécifié en millisecondes (int), garde la même période.
00107  */
00108 void PwmOutAllPin::pulsewidth_ms(int ms)
00109 {
00110     pulsewidth_us(ms*1000);
00111 }
00112 
00113 /** Fixe la largeur d'impulsion du PWM, spécifié en microsecondes (int), garde la même période.
00114  */
00115 void PwmOutAllPin::pulsewidth_us(int us)
00116 {
00117     Pwm_Duty_Cycle = (float)us/Pwm_period_us;
00118     UsePwm();
00119 }
00120 
00121 /** raccourci pour write()
00122 */
00123 PwmOutAllPin& PwmOutAllPin::operator= (float value)
00124 {
00125     write(value);
00126     return *this;
00127 }
00128 
00129 /** raccourci pour effectuer des opperations mathématique avec write()
00130 */ 
00131 PwmOutAllPin& PwmOutAllPin::operator= (PwmOutAllPin& rhs)
00132 {
00133     write(rhs.read());
00134     return *this;
00135 }
00136  
00137 /** raccourci pour read()
00138  */
00139 PwmOutAllPin::operator float()
00140 {
00141     return read();
00142 }
00143 
00144 void PwmOutAllPin::DigitalUp(void)
00145 {
00146     PwmOutPin = 1;
00147 }
00148 
00149 void PwmOutAllPin::DigitalDown(void)
00150 {
00151     if((Pwm_Duty_Cycle > 0.0) && (Pwm_Duty_Cycle < 1.0))
00152     {
00153         PwmOutPin = 0;
00154         SwitchPin.attach_us(this, &PwmOutAllPin::DigitalUp, TimeDown);
00155     }
00156 }
00157 
00158 void PwmOutAllPin::UsePwm(void)
00159 {
00160     if((Pwm_Duty_Cycle > 0.0) && (Pwm_Duty_Cycle < 1.0))
00161     {
00162         TimeDown = Pwm_period_us*(1.0-Pwm_Duty_Cycle);
00163     }
00164     else if(Pwm_Duty_Cycle >= 1.0)
00165     {
00166         SwitchPin.detach();
00167         Pwm_Duty_Cycle = 1.0;
00168         PwmOutPin = 1;
00169     }
00170     else
00171     {
00172         SwitchPin.detach();
00173         Pwm_Duty_Cycle = 0.0;
00174         PwmOutPin = 0;
00175     }
00176 }