打开主菜单

谷雨文档中心 β

更改

NRF52832DK基础实验

添加2,569字节2019年7月12日 (五) 10:08
ADC 采集实验
[[文件:Lux.png|居中|缩略图|313x313像素]]
当光照度增加时,流过Q6的电流变大,从而分得的电压变小;当光照度变小时,流过Q6的电流变小,从而分得的电压变大。所以光照度与电压信号成反比。
 
NRF52832芯片中8路ADC采集通道。可以配置成单端模式和差分模式。本例程中光敏器件是连接在P0.30引脚上,即ADC通道6。采用单端方式对电压进行采集。
==== 代码分析 ====
开发者打开谷雨物联提供的peripheral_ghostyu文件夹中09_adc_example工程(IAR工程)。 在IAR的Workspace中点开Application,双击main.c文件,打开main.c。<syntaxhighlight lang="c" line="1">//******************************************************************************// fn :main//// brief : 主程序入口//// param : none//// return : none
int main(void)
{
LED_Init(); //LED 初始化
bsp_board_lcd_init();//LCD 实始化
GUI_Init();
GUI_SetBkColor(GUI_BLUE);//设置蓝色背景色 GUI_Clear(); GUI_SetColor(GUI_RED); //设置红色字体
GUI_DispString("ADC Example");
LUX_SaadcInit(); //ADC初始化
for(;;)
{
#if defined(SAADC_BLOCKING)
//发起ADC采集
if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN6,m_buffer_pool) == NRF_SUCCESS)
{
}
#else
//发起ADC采集
nrf_drv_saadc_sample();
#endif
LED_Toggle(0); //翻转LED0
nrf_delay_ms(500);
}
}
</syntaxhighlight>main函数中,对LED,ADC,LCD进行初始化与设置。ADC具体的初始化在LUX_SaadcInit函数中,对ADC通道进行配置。main函数for循环中,使用nrf_delay_ms延时函数,周期性地触发ADC采集,同时翻转LED0进行指示。
 
例子中,采用SAADC_BLOCKING宏定义进行编译区分ADC同步采集和ADC异步采集。完成ADC转换后,将结果通过显示屏显示出。<syntaxhighlight lang="c" line="1">
void LUX_SaadcInit(void)
{
 
nrf_saadc_channel_config_t channel_config =
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN6);
nrf_drv_saadc_init(NULL, saadc_callback);
 
nrf_drv_saadc_channel_init(6, &channel_config);
#ifndef SAADC_BLOCKING
nrf_drv_saadc_buffer_convert(m_buffer_pool, SAMPLES_IN_BUFFER);
#endif
}
</syntaxhighlight>LUX_SaadcInit函数中,调用nrf_drv_saadc_init函数初始化ADC,并传入saadc_callback事件回调函数(异步ADC采集使用)。nrf_drv_saadc_channel_init函数对ADC通道6,进行默认配置。其中包括参考源,增益,单端模式,引脚等配置。下面是saadc_callback回调函数的实现,在其中会监视NRF_DRV_SAADC_EVT_DONE事件(ADC采集转转换完成),并将结果显示在屏幕上。此回调函数调用,只在进行ADC异步转换时,才会被调用。<syntaxhighlight lang="c" line="1">
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
{
nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
}
GUI_DisprintfAt(0,32,"ADC:%04d\r\n",p_event->data.done.p_buffer[0]);
for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
{
GUI_Disprintf("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
}
}
</syntaxhighlight>
==== 实验现象 ====
硬件准备:
# Jlink-Lite仿真器或J-Link仿真器
# NRF52832DK评估板
# TFT-LCD-144或TFT-LCD-130显示屏
编译工程,点击IAR IDE工具栏中绿色三角仿真按钮,IAR便会将程序下载到nRF52832中,点击全速运行即可。此时NRF52832DK上的LCD显示屏会显示光敏器件电压的ADC结果,同时每转换一次,LED0会状态会翻转一次。
119
个编辑