NRF52832 SAADC 电量检测


#include "adc.h"
#include "nrf_gpio.h"


#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"


#define SAMPLES_IN_BUFFER 10                                /**< ADC采样数据缓存大小(字节数)  */

nrf_saadc_value_t             m_buffer_pool[SAMPLES_IN_BUFFER];
int16_t                                 gADC_Result[SAMPLES_IN_BUFFER];

int32_t         ADC_SUM =0;  
uint8_t      bat_Percent_val;

uint8_t Cal_Bat_percentage(int16_t adc_val)
{
    uint8_t  per = ((adc_val*3.6/1024.0-1.5)/0.55)*100  ;  
                                                                                                                
//    if(charger_status() == ChargingComplete)
//        {
//        per=100;
//    }
    
    return per ;
}


void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
         uint8_t i;
     ADC_SUM = 0;

    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)  //buffer 满了(10)才会触发此事件
    {
        ret_code_t err_code;
                
        err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
        APP_ERROR_CHECK(err_code);
                for(i=0;idata.done.size;i++)
                {
                    gADC_Result[i] = p_event->data.done.p_buffer[i];
                }

                  for(i=0;i<10;i++)
                {
                    ADC_SUM += gADC_Result[i];
                }
                ADC_SUM = ADC_SUM/10;

                bat_Percent_val = Cal_Bat_percentage(ADC_SUM);
//            NRF_LOG_INFO("ADC=%d,bat=%d%%\r\n",ADC_SUM,bat_Percent_val);
    }
}


void saadc_init(void)
{
//------------------------------------------------------------------------------    
      ret_code_t err_code;
    nrf_saadc_channel_config_t    channel_config5 = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN5);
        
        channel_config5.acq_time = NRF_SAADC_ACQTIME_40US;
    //channel_config5.gain     = NRF_SAADC_GAIN1;
    
      err_code = nrf_drv_saadc_init(NULL, saadc_callback);  //默认 1 :10bit 
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_channel_init(0, &channel_config5);
    APP_ERROR_CHECK(err_code); 

    err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool, SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);
}

    //在timer中调用,50ms启动一次采样
void  battery_dect_start(void)
{
    nrf_drv_saadc_sample();
}

你可能感兴趣的:(nRF52832)