前言
大概记录自己使用nrf52832做adc采集。nRF52832的ADC采集
此ADC采集是使用的10位,共有8个adc引脚分别是
AINX PIN
AIN0 P0.02
AIN1 P0.03
AIN2 P0.04
AIN3 P0.05
AIN4 P0.28
AIN5 P0.29
AIN6 P0.30
AIN7 P0.31
我是使用的是P0.30 ,其初始化代码如下:
void saadc_init(void)
{
ret_code_t err_code;
//定义SAADC初始化结构体
//使用默认的宏初始化时需要指定该通道的模拟输入引脚
//具体的引脚分布参考数据手册
nrf_saadc_channel_config_t mmysaadc = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN6);//配置
//初始化SAADC,注册事件回调函数,
//注意,本例使用的是非阻塞模式,非阻塞模式下,采样完成后以事件
//的方式通知应用程序,应用程序在事件回调函数中读取采样数据
err_code = nrf_drv_saadc_init(NULL,saadc_callback);
APP_ERROR_CHECK(err_code);
//初始化SAADC通道
err_code = nrf_drv_saadc_channel_init(NULL, &mmysaadc);
APP_ERROR_CHECK(err_code);
//设置好缓存,等待应用程序启动采样
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
//设置好缓存,等待应用程序启动采样
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
}
nrf_drv_saadc_init(NULL,saadc_callback);中的saadc_callback是自己实现的回调函数。主要是处理数据,其代码如下:
void saadc_callback(nrf_drv_saadc_evt_t const *p_event)
{
double number = 0;
double val; //保存SAADC采样数据计算的实际电压值
if(p_event->type == NRF_DRV_SAADC_EVT_DONE) //Event generated when the buffer is filled with samples
{
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(int i=0; i < SAMPLES_IN_BUFFER; i++)
{
number += p_event->data.done.p_buffer[i];
}
number = number / 10.0f;
//电压数据
val = ((float)number)*3.3f/1024.0f;
}
}
事件处理完成后需要调用另一函数,不然adc采集会出错,函数如下:
void saadc_sampling_trigger(void)
{
ret_code_t err_code;
//Event handler is called immediately after conversion is finished.
err_code = nrf_drv_saadc_sample(); // Check error
APP_ERROR_CHECK(err_code);
}
总结
其sdk包里有很多例程都很好修改的,用是没什么大问题的,本来还有串口透传部分的使用。。。。。。下次再来,勉励自己