nrf51822 --- adc转换

1.目的

   模拟信号转换成数字信号

2.分析

   在实际产品中经常用到adc功能,比如采集电池电压等等。

3.平台:

协议栈版本:SDK10.0.0

编译软件:keil 5.14

硬件平台:nrf51822最小系统

例子:SDK 10.0.0\examples\ble_peripheral\ble_app_uart\pca10028\s110\arm4

4.步骤

1.在nrf51822 中有8个模拟通道,如下图所示。当然P0.26和P0.27也可以做ADC引脚,这2个脚是时钟信号输入脚

2.在实验中我们用到P04作为模拟脚。用查询的模式来采集adc值(并非中断)

   a.首先配置管脚,把管教配置为输入

 

#define ADC_PIN 									(4U)
#define ADC_INPUT()	nrf_gpio_cfg_input(ADC_PIN, NRF_GPIO_PIN_NOPULL)

b.采集adc值

/* Peripheral: ADC */
/* Description: Analog to digital converter. */

/* Register: ADC_INTENSET */
/* Description: Interrupt enable set register. */

/* Bit 0 : Enable interrupt on END event. */
#define ADC_INTENSET_END_Pos (0UL) /*!< Position of END field. */
#define ADC_INTENSET_END_Msk (0x1UL << ADC_INTENSET_END_Pos) /*!< Bit mask of END field. */
#define ADC_INTENSET_END_Disabled (0UL) /*!< Interrupt disabled. */
#define ADC_INTENSET_END_Enabled (1UL) /*!< Interrupt enabled. */
#define ADC_INTENSET_END_Set (1UL) /*!< Enable interrupt on write. */

/* Register: ADC_INTENCLR */
/* Description: Interrupt enable clear register. */

/* Bit 0 : Disable interrupt on END event. */
#define ADC_INTENCLR_END_Pos (0UL) /*!< Position of END field. */
#define ADC_INTENCLR_END_Msk (0x1UL << ADC_INTENCLR_END_Pos) /*!< Bit mask of END field. */
#define ADC_INTENCLR_END_Disabled (0UL) /*!< Interrupt disabled. */
#define ADC_INTENCLR_END_Enabled (1UL) /*!< Interrupt enabled. */
#define ADC_INTENCLR_END_Clear (1UL) /*!< Disable interrupt on write. */

/* Register: ADC_BUSY */
/* Description: ADC busy register. */

/* Bit 0 : ADC busy register. */
#define ADC_BUSY_BUSY_Pos (0UL) /*!< Position of BUSY field. */
#define ADC_BUSY_BUSY_Msk (0x1UL << ADC_BUSY_BUSY_Pos) /*!< Bit mask of BUSY field. */
#define ADC_BUSY_BUSY_Ready (0UL) /*!< No ongoing ADC conversion is taking place. ADC is ready. */
#define ADC_BUSY_BUSY_Busy (1UL) /*!< An ADC conversion is taking place. ADC is busy. */

/* Register: ADC_ENABLE */
/* Description: ADC enable. */

/* Bits 1..0 : ADC enable. */
#define ADC_ENABLE_ENABLE_Pos (0UL) /*!< Position of ENABLE field. */
#define ADC_ENABLE_ENABLE_Msk (0x3UL << ADC_ENABLE_ENABLE_Pos) /*!< Bit mask of ENABLE field. */
#define ADC_ENABLE_ENABLE_Disabled (0x00UL) /*!< ADC is disabled. */
#define ADC_ENABLE_ENABLE_Enabled (0x01UL) /*!< ADC is enabled. If an analog input pin is selected as source of the conversion, the selected pin is configured as an analog input. */

/* Register: ADC_CONFIG */
/* Description: ADC configuration register. */

/* Bits 17..16 : ADC external reference pin selection. */
#define ADC_CONFIG_EXTREFSEL_Pos (16UL) /*!< Position of EXTREFSEL field. */
#define ADC_CONFIG_EXTREFSEL_Msk (0x3UL << ADC_CONFIG_EXTREFSEL_Pos) /*!< Bit mask of EXTREFSEL field. */
#define ADC_CONFIG_EXTREFSEL_None (0UL) /*!< Analog external reference inputs disabled. */
#define ADC_CONFIG_EXTREFSEL_AnalogReference0 (1UL) /*!< Use analog reference 0 as reference. */
#define ADC_CONFIG_EXTREFSEL_AnalogReference1 (2UL) /*!< Use analog reference 1 as reference. */

/* Bits 15..8 : ADC analog pin selection. */
#define ADC_CONFIG_PSEL_Pos (8UL) /*!< Position of PSEL field. */
#define ADC_CONFIG_PSEL_Msk (0xFFUL << ADC_CONFIG_PSEL_Pos) /*!< Bit mask of PSEL field. */
#define ADC_CONFIG_PSEL_Disabled (0UL) /*!< Analog input pins disabled. */
#define ADC_CONFIG_PSEL_AnalogInput0 (1UL) /*!< Use analog input 0 as analog input. */
#define ADC_CONFIG_PSEL_AnalogInput1 (2UL) /*!< Use analog input 1 as analog input. */
#define ADC_CONFIG_PSEL_AnalogInput2 (4UL) /*!< Use analog input 2 as analog input. */
#define ADC_CONFIG_PSEL_AnalogInput3 (8UL) /*!< Use analog input 3 as analog input. */
#define ADC_CONFIG_PSEL_AnalogInput4 (16UL) /*!< Use analog input 4 as analog input. */
#define ADC_CONFIG_PSEL_AnalogInput5 (32UL) /*!< Use analog input 5 as analog input. */
#define ADC_CONFIG_PSEL_AnalogInput6 (64UL) /*!< Use analog input 6 as analog input. */
#define ADC_CONFIG_PSEL_AnalogInput7 (128UL) /*!< Use analog input 7 as analog input. */

/* Bits 6..5 : ADC reference selection. */
#define ADC_CONFIG_REFSEL_Pos (5UL) /*!< Position of REFSEL field. */
#define ADC_CONFIG_REFSEL_Msk (0x3UL << ADC_CONFIG_REFSEL_Pos) /*!< Bit mask of REFSEL field. */
#define ADC_CONFIG_REFSEL_VBG (0x00UL) /*!< Use internal 1.2V bandgap voltage as reference for conversion. */
#define ADC_CONFIG_REFSEL_External (0x01UL) /*!< Use external source configured by EXTREFSEL as reference for conversion. */
#define ADC_CONFIG_REFSEL_SupplyOneHalfPrescaling (0x02UL) /*!< Use supply voltage with 1/2 prescaling as reference for conversion. Only usable when supply voltage is between 1.7V and 2.6V. */
#define ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling (0x03UL) /*!< Use supply voltage with 1/3 prescaling as reference for conversion. Only usable when supply voltage is between 2.5V and 3.6V. */

/* Bits 4..2 : ADC input selection. */
#define ADC_CONFIG_INPSEL_Pos (2UL) /*!< Position of INPSEL field. */
#define ADC_CONFIG_INPSEL_Msk (0x7UL << ADC_CONFIG_INPSEL_Pos) /*!< Bit mask of INPSEL field. */
#define ADC_CONFIG_INPSEL_AnalogInputNoPrescaling (0x00UL) /*!< Analog input specified by PSEL with no prescaling used as input for the conversion. */
#define ADC_CONFIG_INPSEL_AnalogInputTwoThirdsPrescaling (0x01UL) /*!< Analog input specified by PSEL with 2/3 prescaling used as input for the conversion. */
#define ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling (0x02UL) /*!< Analog input specified by PSEL with 1/3 prescaling used as input for the conversion. */
#define ADC_CONFIG_INPSEL_SupplyTwoThirdsPrescaling (0x05UL) /*!< Supply voltage with 2/3 prescaling used as input for the conversion. */
#define ADC_CONFIG_INPSEL_SupplyOneThirdPrescaling (0x06UL) /*!< Supply voltage with 1/3 prescaling used as input for the conversion. */

/* Bits 1..0 : ADC resolution. */
#define ADC_CONFIG_RES_Pos (0UL) /*!< Position of RES field. */
#define ADC_CONFIG_RES_Msk (0x3UL << ADC_CONFIG_RES_Pos) /*!< Bit mask of RES field. */
#define ADC_CONFIG_RES_8bit (0x00UL) /*!< 8bit ADC resolution. */
#define ADC_CONFIG_RES_9bit (0x01UL) /*!< 9bit ADC resolution. */
#define ADC_CONFIG_RES_10bit (0x02UL) /*!< 10bit ADC resolution. */
<pre class="cpp" name="code">/**@brief Function for making the ADC start a battery level conversion.
 */
 uint16_t adc_start(void)
{
    uint32_t err_code;
    uint8_t times = 0 ;
    uint16_t adc_result = 0;
	  ADC_INPUT();
    // Configure ADC
    NRF_ADC->INTENSET   = ADC_INTENSET_END_Msk;
    NRF_ADC->CONFIG     = (ADC_CONFIG_RES_10bit                        << ADC_CONFIG_RES_Pos)     |
                          (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos)  |
                          (ADC_CONFIG_REFSEL_VBG    << ADC_CONFIG_REFSEL_Pos)  |
                          (ADC_CONFIG_PSEL_AnalogInput5                  << ADC_CONFIG_PSEL_Pos)    |
                          (ADC_CONFIG_EXTREFSEL_None                  << ADC_CONFIG_EXTREFSEL_Pos);
    NRF_ADC->EVENTS_END = 0;
    NRF_ADC->ENABLE     = ADC_ENABLE_ENABLE_Enabled;

    // Enable ADC interrupt
    err_code = sd_nvic_ClearPendingIRQ(ADC_IRQn);
    APP_ERROR_CHECK(err_code);

    err_code = sd_nvic_SetPriority(ADC_IRQn, NRF_APP_PRIORITY_LOW);
    APP_ERROR_CHECK(err_code);
                     
  	err_code =sd_nvic_DisableIRQ(ADC_IRQn);
   // err_code = sd_nvic_EnableIRQ(ADC_IRQn);
    APP_ERROR_CHECK(err_code);

    NRF_ADC->EVENTS_END  = 0;    // Stop any running conversions.
    NRF_ADC->TASKS_START = 1;
		 while (NRF_ADC->EVENTS_END == 0 || times >200 )
    {
			times ++ ;
		}     
		if(times > 200)
		{
		//	ת»»Ê§°Ü
		}else
		{
		NRF_ADC->EVENTS_END     = 0;
		adc_result              = NRF_ADC->RESULT;
		NRF_ADC->TASKS_STOP     = 1;
		}
    return 			adc_result;   
}

 
 NRF_ADC->CONFIG     = (ADC_CONFIG_RES_10bit                        << ADC_CONFIG_RES_Pos)     |
                          (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos)  |
                          (ADC_CONFIG_REFSEL_VBG    << ADC_CONFIG_REFSEL_Pos)  |
                          (ADC_CONFIG_PSEL_AnalogInput5                  << ADC_CONFIG_PSEL_Pos)    |
                          (ADC_CONFIG_EXTREFSEL_None                  << ADC_CONFIG_EXTREFSEL_Pos);
选择的是
       1.10位的adc (通过程序可以选择8 ,9 ,10位)
       2.模拟脚的1/3作为输入。
       3.1.2v作为参考电压。
       4.选择模拟通道5
       5.不用外部参考源
 
具体配置如下寄存器选择。
 
      



具体请参考nrf51822数据手册

  用万用表量出的值为2.36v

采集出来的adc为

     0x2a0/1024.0*1.2*3 =2.3625与量出的结果一样。说明采集正确

完毕!!!

### 回答1: nrf52832-qfaa是一款由Nordic Semiconductor公司开发的低功耗蓝牙系统级芯片。原理图即为该芯片的电路连接图,它展示了芯片内部的各个功能模块之间的连接方式和电气特性。对于电路设计和电路分析人员来说,原理图是理解芯片内部结构和工作原理的重要工具。 nrf52832-qfaa原理图主要包括以下几个方面的内容: 1. 电源管理电路:负责芯片的供电和电池管理,包括电源接口、电源描述和电源过滤电路等。 2. MCU核心:这部分含有nrf52832芯片的主控制单元,包括处理器核心、存储器和系统总线等。 3. 外设接口:负责芯片与外部设备的通信,如UART、SPI、I2C和GPIO等。 4. 射频前端:负责无线通信,包括蓝牙低功耗无线模块和射频天线。 5. 时钟和定时器:包括系统时钟和RTC(实时时钟)等,用于芯片的时序控制和定时功能。 6. I/O和连接器:包括与外部电路的连接接口和引脚布局等。 7. 其他模块:如中断控制器、电源管理单元、温度传感器等。 通过阅读nrf52832-qfaa的原理图,电路设计人员可以了解芯片的各个模块的连接方式和通信协议,有助于进行电路设计和系统验证。同时,它也为故障排除和错误修复提供了重要的参考依据。原理图是一个工程师在开发和设计过程中不可或缺的工具,它大大简化了电路设计的复杂性,提高了设计的效率和可靠性。 ### 回答2: nrf52832-qfaa是一款蓝牙低功耗系统芯片,可以用于物联网设备和可穿戴设备等领域。原理图是描述该芯片内部电路连接关系的图纸。 nrf52832-qfaa原理图主要包括器件、排列方式、连接线路等信息。例如,原理图会显示芯片上的各个引脚,以及它们之间的连接方式。它会标明不同器件的型号、值以及相互之间的连接关系,以帮助设计师正确布局和设计电路。 在nrf52832-qfaa原理图中,可以看到该芯片的主要模块,包括处理器、存储器、射频收发器、时钟电路等。这些模块通过连接线路相互连接,以实现各个功能模块之间的通信和控制。 此外,原理图还能显示一些外部器件的连接方式,比如电源管理模块、传感器、接口等。这些外部器件可以通过连接线路与nrf52832-qfaa芯片相互连接,以实现更丰富的功能。 通过阅读nrf52832-qfaa原理图,设计人员可以了解芯片的内部架构和连接方式,从而有助于他们进行电路布局和调试工作。同时,对于学习者来说,也可以通过阅读原理图深入了解这款芯片的工作原理和内部结构。 ### 回答3: nrf52832-qfaa是一款由Nordic Semiconductor公司生产的芯片,主要用于物联网设备和无线通信应用。原理图是对该芯片电路连接的图示,展示各个元件之间的连接方式。 nrf52832-qfaa原理图主要包含以下几个部分: 1. 电源部分:包括电源芯片、电源电容、电源指示灯等,用于提供电源给整个芯片及其外围电路。 2. 调试部分:包括调试接口芯片和相应的连接器,用于对该芯片进行调试和软件烧录。 3. 外部接口部分:包括与其他外部元件连接的接口,如UART、SPI、I2C等,用于实现与其他设备的数据通信。 4. 时钟部分:包括晶振和时钟电路,提供准确稳定的时钟信号给芯片的各个模块。 5. 外设接口部分:包括与外部设备连接的接口,如GPIO(通用输入输出)、ADC(模数转换器)、PWM(脉宽调制)等,用于实现与外部设备的数据交换和控制。 6. 射频部分:包括射频收发器、射频天线等,用于无线通信功能。 原理图中通过不同的连线和符号表示了各个元件之间的连接关系和信号传输方式。通过分析原理图,我们可以了解到该芯片的电路结构和各个功能模块的配置情况,以及与其他外部元件的连接方式。这对于硬件工程师在进行电路设计和调试时非常有帮助,同时也为软件开发人员提供了基础的硬件信息,方便他们进行软硬件的协同开发工作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值