NRF51822---AD采样(连载5)

前言

  IIC协议已经讲完了,屏幕也亮了,也就是说显示没问题了。手柄除了显示数据,还要采集数据。采集数据就要用到AD了。所以,AD还是很关键的。今天就来讲讲AD的相关知识、

AD简介

AD全称Analog to Digital Converter,顾名思义…(打开有道翻译一下就是a/d转换器)。A是模拟量,D是数字量。恩,原来是将模拟量转换成数字量的意思、

框图

在这里插入图片描述

在这里插入图片描述

  这个框图还是比较好理解的,结合下面的寄存器释义更加容易明白。具体流程如下:
  首先配置CONFIG.PSEL设定ADC的采样通道,之后配置CONFIG.INPSEL设定输入是用0-7通道还是直接用VDD作为输入通道。如果使用VDD则有两种,一种VDD的2/3作为输入通道,一种是VDD的1/3作为输入通道。如果是用0-7通道作为输入则有3种选择。一种是通道直接作为输入,不进行分频、第二种是0-7通道输入值×2/3,第三种是0-7通道输入值×1/3。通道选择好后就是设定采样分辨率了。通过设定CONFIG.RES可以分别设置成8.9.10bit三种分辨率,一般选择10bit。
  右侧则为参考电压设定。设定CONFIG.REFSEL可配置参考电压为外部电压、内部电压或者是VDD电压。如果选用外部电压还要通过配置CONFIG.EXTREFSEL设定选用外部哪一路外部电压,

代码

  寄存器基本上没啥讲的,直接上代码吧,很简单。结合上一节讲的OLED,这节实现的功能是采样电压显示到oled上、

//ADC_res  分辨率   ADC_input_selection 通道   ADC_interrupt_enabled  使能位
void adc_init(unsigned char ADC_res,unsigned char ADC_input_selection,unsigned char ADC_interrupt_enabled)
{
 	//设置CONFIG寄存器
   if(ADC_input_selection <= 7)
     {                    
       NRF_ADC->CONFIG = ADC_res << ADC_CONFIG_RES_Pos |  ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos |
                          ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling << ADC_CONFIG_REFSEL_Pos | (1 << ADC_input_selection) << ADC_CONFIG_PSEL_Pos;
                          
			 NRF_ADC->ENABLE = 1;  
       
    }
}

//读取数据 
unsigned int nrf_adc_read(void)  
{
  unsigned int adc_data;
  NRF_ADC->TASKS_START = 1;
  while(NRF_ADC->EVENTS_END == 0);
  NRF_ADC->EVENTS_END = 0;
  adc_data = NRF_ADC->RESULT;
  return adc_data;
}

贴一张CONFIG寄存器的说明,很简单,就这一个寄存器就ok了。
在这里插入图片描述

int main(void)
{
	char aa[10];
	char bb[10];
	unsigned int num,num1;
	nrf_gpio_cfg_output(21);	//配置P021引脚为输出SCL
	nrf_gpio_cfg_output(22);	//配置P022引脚为输出
	nrf_gpio_pin_set(21);
	nrf_delay_ms(20);
	nrf_gpio_pin_set(22);
	nrf_delay_ms(800);
	OLED_Init();
	nrf_delay_ms(200);
	OLED_Clear();
	adc_init(2,adc,0);//adc初始化
	while(1)
	{
		num=nrf_adc_read(); 
		num1 = num*330/1024;						//扩大100倍,10位adc
		nrf_delay_ms(100);
		OLED_ShowString(0,0,"sampling value:",12);	//采样值
		sprintf(aa,"%d",num);
		sprintf(bb,"%d",num1);
		OLED_ShowString(20,2,aa,12);
		OLED_ShowString(0,4,"voltage values:",12);	//转换成电压值
		OLED_ShowString(20,6,bb,12);
		OLED_ShowString(60,6,"*0.01V",12);			//扩大100倍
//		OLED_ShowString(0,8,"D_SEngineer",12);
	}
}

实际采样图片

在这里插入图片描述

  采样还是挺准的,实际测量电压为2.1V,扩大了100倍显示210。

代码获取

代码领取方式,复制下面关键字到公众号回复 ,即可领取源码。NRF51822外设先讲这么多,下一步开始画手柄了。

  nrf51822外设--adc

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值