[nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC
一、本实验ADC 配置
- 分辨率:10 位。
- 输入通道:5,即使用输入通道AIN5 检测电位器的电压。
- ADC 基准电压:1.2V。
二、NRF51822 ADC 管脚分布
NRF51822 的ADC 共有8 个输入通道,对应的管脚分布入下图:
三、NRF51822 ADC 原理
NRF51822 的ADC 比较简单,如下图所示。
3.1、ADC 通道及预分压系数
NRF51822 的ADC 共有8 个输入通道,在使用ADC 时,要设定ADC 的输入通道。本实验中,因为连接电位器的管脚是P0.04,所以,选择输入通道AIN5。
3.2、基准电压
基准电压有4 种选择,分别是:
- 1) 内部1.2V。
- 2) CONFIG. EXTREFSEL 中设定的外部基准。
- 3) 1/2 VDD,仅适用于VDD 工作在1.7 V - 2.6 V 电压范围内。
- 4) 1/3 VDD,仅适用于VDD 工作在2.5 V - 3.6 V 电压范围内。
3.3、分辨率
NRF51822 的ADC 可以作8、9、10 位转换,本实验中,选择最高分辨率:10 位。需要注意的是:NRF51822 的ADC 自身仅支持单次转换,每次转换时都需要触发STARTtask。当然,我们可以借助NRF51822 强大的PPI 功能,通过定时器时间来触发ADC 的STARTtask,从而进行连续转换。
四、代码解析:
main函数:
1 int main(void) 2 { 3 nrf_gpio_cfg_output(LED_1);//配置P0.21~P0.24为输出驱动LED指示灯D1~D4 4 nrf_gpio_pin_set(LED_1); //LED初始状态为熄灭 5 6 adc_config(); 7 uart_config(); 8 nrf_adc_start();//每次调用这个函数就会触发ADC一次采样,当采样完毕后会触发ADC_IRQHander,下面ADC_IRQHander内部获取采样值并保存在adc_sample中,同时最后又调用start函数,进行下一次采样 9 10 while (true) 11 { 12 nrf_delay_ms(200); 13 printf("V%d", (int)adc_sample); 14 nrf_gpio_pin_toggle(LED_1); 15 16 __SEV(); //设置事件 17 __WFE(); //进入睡眠,等待事件唤醒 18 __WFE(); 19 } 20 }
ADC初始化:
1 void adc_config(void) 2 { 3 const nrf_adc_config_t nrf_adc_config = NRF_ADC_CONFIG_DEFAULT; 4 5 // Initialize and configure ADC 6 nrf_adc_configure( (nrf_adc_config_t *)&nrf_adc_config); 7 nrf_adc_input_select(NRF_ADC_CONFIG_INPUT_5); 8 nrf_adc_int_enable(ADC_INTENSET_END_Enabled << ADC_INTENSET_END_Pos); 9 NVIC_SetPriority(ADC_IRQn, NRF_APP_PRIORITY_HIGH); 10 NVIC_EnableIRQ(ADC_IRQn); 11 }
ADC事件中断:
1 /** 2 * @brief ADC interrupt handler. 3 */ 4 void ADC_IRQHandler(void) 5 { 6 nrf_adc_conversion_event_clean(); 7 adc_sample = nrf_adc_result_get(); 8 // trigger next ADC conversion 9 nrf_adc_start();// 10 }
@nRF51822基础实验系列:
[nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI
@beautifulzzzz - 物联网&普适计算实践者
e-mail:beautifulzzzz@qq.com
i-blog:blog.beautifulzzzz.com
分类:
硬件_nRF51822
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?