Test of ADC Pin to battery level on Coragem device
main.cpp@4:1afe75848f10, 2020-02-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |