Kenji Arai / Mbed 2 deprecated NucleoL152_Volt_meter

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /*
00002  * mbed Application program / Simple Digital Volt-meter
00003  *      on Nucleo-L152RE
00004  *
00005  * Copyright (c) 2016 Kenji Arai / JH1PJL
00006  *  http://www.page.sannet.ne.jp/kenjia/index.html
00007  *  http://mbed.org/users/kenjiArai/
00008  *      Created:    Nobember  15th, 2016
00009  *      Revised:    Nobember  16th, 2016
00010  *
00011  *
00012  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00013  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00014  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
00015  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
00016  * DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
00017  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
00018  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00019  */
00020 
00021 #define VOLTMETER
00022 //#define CALC_VDD
00023 //#define READ_VREF_TEMP
00024 
00025 #include "mbed.h"
00026 
00027 #if defined(VOLTMETER)
00028 
00029 /* Use R1 & R2 divider
00030                           | Nucleo-L152RE
00031     V_INPUT <-- R1 -.-----| A0(PA_0)
00032                     |     |
00033                     R2    |
00034                     |_____| GND
00035                           |
00036  */
00037 #define     R1      (3332.4f)   // target 3.3K Ohm
00038 #define     R2      (987.54f)   // target 1K Ohm
00039 
00040 AnalogIn    v_input(A0);
00041 AnalogIn    vref(ADC_VREF);
00042 Timer       tmr;
00043 
00044 int main() {
00045     double      v_in, vdd;
00046     double      v_in_actual;
00047 
00048     while(true) {
00049         tmr.reset();
00050         tmr.start();
00051         vdd  = (1.224f) / vref.read();
00052         v_in = v_input.read();
00053         v_in_actual = v_in * vdd * ( R1 + R2) / R2;
00054         printf("V IN : %5.3f [V]\r\n", v_in_actual);
00055         wait_ms(500 - tmr.read_ms());      // 0.5sec interval    
00056     }
00057 }
00058 #endif
00059 
00060 #if defined(CALC_VDD)
00061 
00062 AnalogIn    vref(ADC_VREF);
00063 DigitalOut  myled(LED1);
00064 Timer       tmr;
00065 
00066 /*
00067     Calculate Voltage data
00068 
00069     Vdd:        CPU Vdd line voltage
00070                 (If VREF+ connected Vdd and VREF- connected GND)
00071     dt_adc:     ADC data (12bit)
00072     VREFINT:    Internal bandgap voltage
00073                 1.202V(min), 1.224V(typ), 1.242V(max)
00074     VREFINT_CAL Raw data acquired at temperature of 30 °C,
00075                 Vdd = 3 V Addr: 0x1FF80078-0x1FF80079
00076 
00077     VREFINT_CAL = 3000 * VREF(Factory) / 4096      [V]
00078     Vdd         = VREFINT_CAL / VREFINT(ADC float) [V]
00079 
00080     reference:
00081     en.CD00277537.pdf page 56/133 (April 2016 DocID17659 Rev 12)
00082     en.CD00240193.pdf page 287/908 (September 2016 DocID15965 Rev 14)
00083 */
00084 int main() {
00085     double      vdd;
00086     double      vdd_calibed;
00087     double      vref_calibed;
00088     double      vref_f;
00089     uint16_t    vref_u16;
00090     uint16_t    vref_cal;
00091 
00092     vref_cal = *(__IO uint16_t *)((uint32_t)0x1ff800f8);
00093     while(true) {
00094         tmr.reset();
00095         tmr.start();
00096         myled = 1;
00097         wait(0.2f);   
00098         myled = 0;
00099         wait(0.6f);
00100         vref_f   = vref.read();
00101         vref_u16 = vref.read_u16();
00102         printf("Vref(f): %f, Vref : %u, Vref_CAL : %u,",
00103                      vref_f,  vref_u16,      vref_cal);
00104         vref_calibed = 3.0f * (double)vref_cal / 4096.0f;
00105         vdd_calibed  = vref_calibed / vref_f;
00106         vdd          = 1.224f / vref_f;
00107         printf(" Vref(Calibrated) : %f, VDD(Calibrated) : %f, VDD : %f,",
00108                          vref_calibed,           vdd_calibed,      vdd);
00109         printf(" VDD(measured my Nucleo) : 3.3163\r\n");
00110         wait_ms(1000 - tmr.read_ms());      // 1sec interval   
00111     }
00112 }
00113 #endif
00114 
00115 #if defined(READ_VREF_TEMP)
00116 
00117 AnalogIn   vrefint(ADC_VREF);
00118 AnalogIn   tempint(ADC_TEMP);
00119 
00120 int main() {
00121     while(true) {
00122         printf("Vref(f): %f, Vref : %u, Temperature : %u\r\n",
00123                  vrefint.read(), vrefint.read_u16(), tempint.read_u16());
00124         wait(1.0f);
00125     }
00126 }
00127 #endif