nrf52832sdk15的SAADC

由于有使用52832的需求,所以19年8月下载了一份最新的SDK,版本为SDK15.3.0,得创建一个新的工程然后移植原来的应用代码到这个新的SDK下,IO什么的跟原来SDK12没啥区别,但是我在demo里没找到ADC的demo,反倒是找到一个叫SAADC的(手册里SA是Successive approximation),由于时间关系先看了一下demo然后网上在搜索看了别人写的,跑了一下这个demo然后开始着手移植.初始化函数大概长这样:

void saadc_init(void)
{	
	ret_code_t err_code;
	m_channel_used = 0;
	
    nrf_saadc_channel_config_t channel_config[ADC_CHANNEL_USED];
    	
	nrf_saadc_channel_config_t channel_default_config =
		NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);	
	//这里整一个默认配置的adc配置 设置的输入是0 对于p02 具体哪些io对应哪些adc通道可以看手册
    
    for(i = 0 ;i < ADC_CHANNEL_USED; i++)
    {
            /*do something*/
			channel_config[i] 			 = channel_default_config;
			channel_config[i].pin_p      = (nrf_saadc_input_t)adc_ain;
            // 设置对应的第几个输入
			channel_config[i].gain		 = NRF_SAADC_GAIN1_6;
            //增益1*6 默认设置参考电压为内部0.6v 所以这里ADC的采集范围最大为3.6V
			err_code = nrf_drv_saadc_channel_init(adc_channel, &channel_config[i]);
            //第几个输入对应的第几个adc通道
    }
    
    

    err_code = nrf_drv_saadc_init(NULL, saadc_callback);//set adc 10 bit
    APP_ERROR_CHECK(err_code);
   //必须要有一个回调函数,在这个函数nrf_drv_saadc_init里看到默认把adc设置为10位的adc

	err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool, m_channel_used);
    //m_buffer_pool是一个一维数组;m_channel_used是我使用的ADC路数
    //注意:这个adc采集按照adc通道顺序得到值 例如使用了adc通道 0 3 1 
    //那到时候回调函数里buff采集回来的值从下标0~2对于的为通道 0 1 3 的值
	APP_ERROR_CHECK(err_code);							

}

在我的代码里没有滤波啥的,只是一个全局数组,里面保存的值对应相对的adc通道值。我在一个task里设置了10ms调用一次下面代码

void hw_adc_val_get(void){
	APP_ERROR_CHECK(nrf_drv_saadc_sample());//采样
}

然后采集到了就会触发刚刚设置的那个回调函数,回调函数大概长这样:

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
	uint8_t i;
    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
    {
        ret_code_t err_code;

        err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, m_channel_used);
        APP_ERROR_CHECK(err_code);

        /*
            在这里可以做一些判断或者处理,因为采样回来的值有可能是负数
        */

		for(i = 0;i<SAMPLES_IN_BUFFER;i++)
		{
            /*do something*/
			((uint16_t*)&m_adc_data)[i] = p_event->data.done.p_buffer[i];
            //这是个全局结构体用来存放adc采用值 
		}

		//一次adc采集完成
    }
	else{
		//未完成
	}
}

注意:采样回来的adc值在上面p_event->data.done.p_buffer里的值是按照adc通道顺序排序过的

上面代码都是我删减过的,为了适应各种的代码框架需要做相应的处理例如我的就无奈做了排序>_<

nrf的saadc就大概了解那么多,还有一些其他模式关于saadc的在CSDN都能查到,由于我是给摇杆、电池这些用的,这个代码已经足够使用。

最后一点,休眠的时候记得把ADC外设关掉,具体在nrfx_saadc.h里,nrf的所有头文件都有函数接口说明

发布了11 篇原创文章 · 获赞 0 · 访问量 107

猜你喜欢

转载自blog.csdn.net/weixin_39945910/article/details/104069028