Test of ADC Pin to battery level on Coragem device

Committer:
brunnobbco
Date:
Thu Feb 13 19:48:14 2020 +0000
Revision:
4:1afe75848f10
Parent:
3:50c27e4261e2
Teste ADC Coragem

Who changed what in which revision?

UserRevisionLine numberNew contents of line
szqt 0:54f4263790ee 1 #include "mbed.h"
szqt 0:54f4263790ee 2
brunnobbco 4:1afe75848f10 3 #define MIN_BATTERY_ADC_VALUE (int16_t)3071 //(min_voltage_on_analog_pin *4551) 2.48*4551 = 11295
brunnobbco 4:1afe75848f10 4 #define MAX_BATTERY_ADC_VALUE (int16_t)4095 //(max_voltage_on_analog_pin *4551) 3.38*4551 = 15391
szqt 0:54f4263790ee 5
brunnobbco 4:1afe75848f10 6 //AnalogIn analog_value(P0_2);
brunnobbco 4:1afe75848f10 7 //DigitalOut led(P1_13);
szqt 0:54f4263790ee 8
brunnobbco 4:1afe75848f10 9 void config_adc(void){
brunnobbco 4:1afe75848f10 10
brunnobbco 4:1afe75848f10 11 //Configure SAADC singled-ended channel, Internal reference (0.6V) and 1/5 gain.
brunnobbco 4:1afe75848f10 12 NRF_SAADC->CH[0].CONFIG = (SAADC_CH_CONFIG_GAIN_Gain1_5 << SAADC_CH_CONFIG_GAIN_Pos) |
brunnobbco 4:1afe75848f10 13 (SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) |
brunnobbco 4:1afe75848f10 14 (SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos) |
brunnobbco 4:1afe75848f10 15 (SAADC_CH_CONFIG_RESN_Bypass << SAADC_CH_CONFIG_RESN_Pos) |
brunnobbco 4:1afe75848f10 16 (SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos) |
brunnobbco 4:1afe75848f10 17 (SAADC_CH_CONFIG_TACQ_10us << SAADC_CH_CONFIG_TACQ_Pos);
brunnobbco 4:1afe75848f10 18
brunnobbco 4:1afe75848f10 19
brunnobbco 4:1afe75848f10 20 // Configure the SAADC channel with VDD as a positive input, no negative input(single ended).
brunnobbco 4:1afe75848f10 21 NRF_SAADC->CH[0].PSELP = SAADC_CH_PSELN_PSELN_AnalogInput0 << SAADC_CH_PSELN_PSELN_Pos ;//changed pin number to AIN7
brunnobbco 4:1afe75848f10 22 NRF_SAADC->CH[0].PSELN = SAADC_CH_PSELN_PSELN_NC << SAADC_CH_PSELN_PSELN_Pos;
brunnobbco 4:1afe75848f10 23
brunnobbco 4:1afe75848f10 24 //Configure the SAADC resolution.
brunnobbco 4:1afe75848f10 25 NRF_SAADC->RESOLUTION = SAADC_RESOLUTION_VAL_12bit << SAADC_RESOLUTION_VAL_Pos;
brunnobbco 4:1afe75848f10 26
brunnobbco 4:1afe75848f10 27 // No automatic sampling, will trigger with TASKS_SAMPLE.
brunnobbco 4:1afe75848f10 28 NRF_SAADC->SAMPLERATE = SAADC_SAMPLERATE_MODE_Task << SAADC_SAMPLERATE_MODE_Pos;
brunnobbco 4:1afe75848f10 29
brunnobbco 4:1afe75848f10 30 //Enable SAADC (would capture analog pins if they were used in CH[0].PSELP)
brunnobbco 4:1afe75848f10 31 NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos;
szqt 0:54f4263790ee 32 }
szqt 0:54f4263790ee 33
brunnobbco 4:1afe75848f10 34 float battery_status(void){
brunnobbco 4:1afe75848f10 35
brunnobbco 4:1afe75848f10 36 int16_t result = 0;
brunnobbco 4:1afe75848f10 37 float precise_result = 0;
brunnobbco 4:1afe75848f10 38
brunnobbco 4:1afe75848f10 39 // Configure result to be put in RAM at the location of "result" variable.
brunnobbco 4:1afe75848f10 40 NRF_SAADC->RESULT.MAXCNT = 1;
brunnobbco 4:1afe75848f10 41 NRF_SAADC->RESULT.PTR = (uint32_t)&result;
szqt 0:54f4263790ee 42
brunnobbco 4:1afe75848f10 43 // Calibrate the SAADC (only needs to be done once in a while)
brunnobbco 4:1afe75848f10 44 NRF_SAADC->TASKS_CALIBRATEOFFSET = 1;
brunnobbco 4:1afe75848f10 45 while (NRF_SAADC->EVENTS_CALIBRATEDONE == 0);
brunnobbco 4:1afe75848f10 46 NRF_SAADC->EVENTS_CALIBRATEDONE = 0;
brunnobbco 4:1afe75848f10 47
brunnobbco 4:1afe75848f10 48 // Start the SAADC and wait for the started event.
brunnobbco 4:1afe75848f10 49 NRF_SAADC->TASKS_START = 1;
brunnobbco 4:1afe75848f10 50 while (NRF_SAADC->EVENTS_STARTED == 0);
brunnobbco 4:1afe75848f10 51 NRF_SAADC->EVENTS_STARTED = 0;
brunnobbco 4:1afe75848f10 52
brunnobbco 4:1afe75848f10 53 // Do a SAADC sample, will put the result in the configured RAM buffer.
brunnobbco 4:1afe75848f10 54 NRF_SAADC->TASKS_SAMPLE = 1;
brunnobbco 4:1afe75848f10 55 while (NRF_SAADC->EVENTS_END == 0);
brunnobbco 4:1afe75848f10 56 NRF_SAADC->EVENTS_END = 0;
brunnobbco 4:1afe75848f10 57
brunnobbco 4:1afe75848f10 58 precise_result = (float)(result/4551);
brunnobbco 4:1afe75848f10 59
brunnobbco 4:1afe75848f10 60 // Stop the SAADC, since it's not used anymore.
brunnobbco 4:1afe75848f10 61 NRF_SAADC->TASKS_STOP = 1;
brunnobbco 4:1afe75848f10 62 while (NRF_SAADC->EVENTS_STOPPED == 0);
brunnobbco 4:1afe75848f10 63 NRF_SAADC->EVENTS_STOPPED = 0;
brunnobbco 4:1afe75848f10 64 NVIC_ClearPendingIRQ(SAADC_IRQn);
brunnobbco 4:1afe75848f10 65 return precise_result;
brunnobbco 4:1afe75848f10 66 }
szqt 0:54f4263790ee 67
szqt 0:54f4263790ee 68
brunnobbco 4:1afe75848f10 69 int main()
brunnobbco 4:1afe75848f10 70 {
szqt 0:54f4263790ee 71
brunnobbco 4:1afe75848f10 72 config_adc();
brunnobbco 4:1afe75848f10 73 float result_1;
szqt 0:54f4263790ee 74
brunnobbco 4:1afe75848f10 75 printf("\nAnalogIn example\n");
szqt 0:54f4263790ee 76
brunnobbco 4:1afe75848f10 77 while(1) {
szqt 0:54f4263790ee 78
brunnobbco 4:1afe75848f10 79 // meas_r = analog_value.read(); // Read the analog input value (value from 0.0 to 1.0 = full ADC conversion range)
brunnobbco 4:1afe75848f10 80 // meas_v = meas_r * 3300; // Converts value in the 0V-3.3V range
brunnobbco 4:1afe75848f10 81
brunnobbco 4:1afe75848f10 82 // Display values
brunnobbco 4:1afe75848f10 83 // printf("measure = %f = %.0f mV\n", meas_r, meas_v);
szqt 0:54f4263790ee 84
brunnobbco 4:1afe75848f10 85 // LED is ON is the value is below 1V
brunnobbco 4:1afe75848f10 86 // if (meas_v < 1000) {
brunnobbco 4:1afe75848f10 87 // led = 1; // LED ON
brunnobbco 4:1afe75848f10 88 // } else {
brunnobbco 4:1afe75848f10 89 // led = 0; // LED OFF
brunnobbco 4:1afe75848f10 90 // }
brunnobbco 4:1afe75848f10 91 // printf("debug before bat_status routine");
brunnobbco 4:1afe75848f10 92 result_1=battery_status();
brunnobbco 4:1afe75848f10 93 printf("bat_lev: \n%f\n", result_1);
brunnobbco 4:1afe75848f10 94 wait(1.0); // 1 second
szqt 0:54f4263790ee 95 }
szqt 0:54f4263790ee 96 }