【联盛德W806上手笔记】十、ADC

目录

  • ADC
  • ADC 电路设计
  • 库函数
    • 函数
    • 参数
  • Demo中的例程
    • main.c
    • wm_hal_msp.c
    • wm_it.c

Windows 10 20H2
HLK-W806-V1.0-KIT
WM_SDK_W806_v0.6.0


       摘自《W806 芯片设计指导书 V1.0》、《W806 MCU 芯片规格书 V2.0》

ADC

       基于 Sigma-Delta ADC 的采集模块,集成 4 路 16 比特 ADC,完成最多 4 路模拟信号的采集,或两路差分信号采集,采样率通过外部输入时钟控制,最高采样率 1KHz,可采集输入电压,也可采集芯片温度,支持输入校准和温度补偿校准。
在这里插入图片描述

ADC 电路设计

       芯片 19 ~ 21 脚可以作为普通 ADC 使用,输入电压范围 0~2.4V。当高于 2.4V 时外部需做分压处理后才可进入 ADC 接口。为提高精度,R1 和 R2 需使用高精度电阻。根据 Sensor 输出电压值选择合适的 R1,R2电阻值分压。
在这里插入图片描述

库函数

打开wm_adc.h,有如下内容:

函数

HAL_StatusTypeDef       HAL_ADC_Init(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADC_DeInit(ADC_HandleTypeDef *hadc);
void                    HAL_ADC_MspInit(ADC_HandleTypeDef* hadc);
void                    HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc);// AD转换功能以查询方式实现所对应的开始、停止、查询是否转换完成、获取转换结果
HAL_StatusTypeDef       HAL_ADC_Start(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef 		HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc);
int                		HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);// 该接口调用了以上接口,实现了一个完整的查询转换过程,并返回结果,可以直接调用该接口获取转换结果,返回值单位mv
int 					HAL_ADC_GET_INPUT_VOLTAGE(ADC_HandleTypeDef* hadc);// AD转换功能以中断方式实现所对应的开始、停止、中断回调函数
HAL_StatusTypeDef       HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
void                    HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);// AD比较功能以中断方式实现所对应的开始、停止、中断回调函数
HAL_StatusTypeDef		HAL_ADC_Start_Compare_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef       HAL_ADC_Stop_Compare_IT(ADC_HandleTypeDef* hadc);
void                    HAL_ADC_CompareCallback(ADC_HandleTypeDef* hadc);void                    HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);int adc_get_inputvolt(uint8_t channel);uint32_t adc_get_offset(void);

参数

结构体和枚举类型

typedef struct
{uint32_t channel;	/* ADC_CHANNEL_0 	: channel 0* ADC_CHANNEL_1 	: channel 1* ADC_CHANNEL_2 	: channel 2* ADC_CHANNEL_3 	: channel 3* ADC_CHANNEL_0_1 	: channel 0 and channel 1 differential input* ADC_CHANNEL_2_3 	: channel 2 and channel 3 differential input */uint32_t freq;		/* 307hz ~ 2khz */uint32_t cmp_val;	/* compare value */uint32_t cmp_pol;	/* CMP_POL_0 :  when adc_result >= cmp_val interrupt* CMP_POL_1 :  whrn adc_result < cmp_val interrtup */}ADC_InitTypeDef;typedef struct __ADC_HandleTypeDef
{ADC_TypeDef                   *Instance;ADC_InitTypeDef               Init;HAL_LockTypeDef               Lock;int				  	  		  offset;}ADC_HandleTypeDef;

宏参数

#define ADC                ((ADC_TypeDef *)ADC_BASE)#define ADC_CHANNEL_0		ADC_ANA_CR_CH_0
#define ADC_CHANNEL_1		ADC_ANA_CR_CH_1
#define ADC_CHANNEL_2		ADC_ANA_CR_CH_2
#define ADC_CHANNEL_3		ADC_ANA_CR_CH_3
#define ADC_CHANNEL_0_1		ADC_ANA_CR_CH_8
#define ADC_CHANNEL_2_3		ADC_ANA_CR_CH_9
#define ADC_CHANNEL_TEMP	ADC_ANA_CR_CH_TEMP
#define ADC_CHANNEL_OFFSET	ADC_ANA_CR_CH_OFFSET#define ADC_FREQ_MIN		307
#define ADC_FREQ_MAX		2000#define CMP_POL_0	0x0UL
#define CMP_POL_1	ADC_ADC_CR_CMPPOL#define HAL_ADC_STATE_RESET             0x00000000U
#define HAL_ADC_STATE_READY             0x00000001U
#define HAL_ADC_STATE_BUSY_INTERNAL     0x00000002U
#define HAL_ADC_STATE_TIMEOUT           0x00000004U

#define IS_ADC_ALL_INSTANCE(INSTANCE) ((INSTANCE) == ADC)#define IS_ADC_CHANNEL(CHANNEL) (((CHANNEL) == ADC_CHANNEL_0)           || \((CHANNEL) == ADC_CHANNEL_1)           || \((CHANNEL) == ADC_CHANNEL_2)           || \((CHANNEL) == ADC_CHANNEL_3)           || \((CHANNEL) == ADC_CHANNEL_0_1)           || \((CHANNEL) == ADC_CHANNEL_2_3)            )#define IS_ADC_CMP_POL(POL)		(((POL) == CMP_POL_0) || \((POL) == CMP_POL_1))#define IS_ADC_FREQUENCY(FREQ)  (((FREQ) >= ADC_FREQ_MIN) && ((FREQ) <= ADC_FREQ_MAX))#define __HAL_ADC_ENABLE(__HANDLE__)	(MODIFY_REG((__HANDLE__)->Instance->ANA_CR, ADC_ANA_CR_CH | ADC_ANA_CR_PD | ADC_ANA_CR_RST | ADC_ANA_CR_LDOEN, \(__HANDLE__)->Init.channel | ADC_ANA_CR_RST | ADC_ANA_CR_LDOEN))#define __HAL_ADC_DISABLE(__HANDLE__)	(MODIFY_REG((__HANDLE__)->Instance->ANA_CR, ADC_ANA_CR_PD | ADC_ANA_CR_RST | ADC_ANA_CR_LDOEN, \ADC_ANA_CR_PD))#define __HAL_ADC_CLEAR_FLAG(__HANDLE__, __FLAG__)   	\(WRITE_REG((__HANDLE__)->Instance->IF, (__FLAG__)))#define __HAL_ADC_INT_ENABLE(__HANDLE__, __FLAG__)	(SET_BIT((__HANDLE__)->Instance->ADC_CR, __FLAG__))#define __HAL_ADC_INT_DISABLE(__HANDLE__, __FLAG__)	(CLEAR_BIT((__HANDLE__)->Instance->ADC_CR, __FLAG__))#define __HAL_ADC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)                     \(((__HANDLE__)->Instance->ADC_CR & (__INTERRUPT__)) == (__INTERRUPT__))#define __HAL_ADC_GET_FLAG(__HANDLE__, __FLAG__)                               \((((__HANDLE__)->Instance->IF) & (__FLAG__)) == (__FLAG__))

Demo中的例程

main.c


#include <stdio.h>
#include "wm_hal.h"void Error_Handler(void);
static void ADC_Init(void);
ADC_HandleTypeDef hadc;int main(void)
{int value;SystemClock_Config(CPU_CLK_160M);printf("enter main\r\n");ADC_Init();while (1){value = HAL_ADC_GET_INPUT_VOLTAGE(&hadc);printf("value = %dmv\r\n", value);HAL_Delay(1000);}
}static void ADC_Init(void)
{hadc.Instance = ADC;hadc.Init.channel = ADC_CHANNEL_0;hadc.Init.freq = 1000;if (HAL_ADC_Init(&hadc) != HAL_OK){Error_Handler();}
}void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{}void Error_Handler(void)
{while (1){}
}void assert_failed(uint8_t *file, uint32_t line)
{printf("Wrong parameters value: file %s on line %d\r\n", file, line);
}

wm_hal_msp.c

#include "wm_hal.h"void HAL_MspInit(void)
{}void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{if (hadc->Instance == ADC){__HAL_RCC_ADC_CLK_ENABLE();__HAL_RCC_GPIO_CLK_ENABLE();//ADC_CHANNEL_0 : PA1//ADC_CHANNEL_1 : PA4//ADC_CHANNEL_2 : PA3//ADC_CHANNEL_3 : PA2//ADC_CHANNEL_0_1 : PA1 and PA4//ADC_CHANNEL_2_3 : PA3 and PA2if (hadc->Init.channel == ADC_CHANNEL_0){__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_1);}else if (hadc->Init.channel == ADC_CHANNEL_1){__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_4);}else if (hadc->Init.channel == ADC_CHANNEL_2){__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_3);}else if (hadc->Init.channel == ADC_CHANNEL_3){__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_2);}else if (hadc->Init.channel == ADC_CHANNEL_0_1){__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_1);__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_4);}else if (hadc->Init.channel == ADC_CHANNEL_2_3){__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_3);__HAL_AFIO_REMAP_ADC(GPIOA, GPIO_PIN_2);}// 如果用到中断方式需要使能中断HAL_NVIC_SetPriority(ADC_IRQn, 0);HAL_NVIC_EnableIRQ(ADC_IRQn);}
}void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{__HAL_RCC_ADC_CLK_DISABLE();HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1);HAL_NVIC_DisableIRQ(ADC_IRQn);
}

wm_it.c


#include "wm_hal.h"extern ADC_HandleTypeDef hadc;#define readl(addr) ({unsigned int __v = (*(volatile unsigned int *) (addr)); __v;})
__attribute__((isr)) void CORET_IRQHandler(void)
{readl(0xE000E010);HAL_IncTick();
}__attribute__((isr)) void ADC_IRQHandler(void)
{HAL_ADC_IRQHandler(&hadc);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电路补习笔记】8、稳压电路 —— 线性电源及LDO

目录有名的电源芯片品牌DCDC电源分类开关电源vs线性稳压器线性电源参数线性电源工作原理集成稳压器78/79系列&#xff08;固定输出电压&#xff09;正、负对称输出两组电源的稳压电路扩展输出电压扩大输出电流LM317/LM337&#xff08;可调输出电压&#xff09;正、负对称输出两…

ajax代码整理

$.ajax({ type: "post", 【以POST或GET的方式请求。默认GET。PUT和DELETE也可以用&#xff0c;有的浏览器不支持】 url: url, 【请求的目的地址&#xff0c;须是一个字符串。】 contentType: "application/json", 【以哪种数据类型发送请求】 data: data, …

创建一个简单的WCF程序

为了使读者对基于WCF的编程模型有一个直观的映像&#xff0c;我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单&#xff0c;但它涵盖了一个完整WCF应用的基本结构。对那些对WCF不是很了解的读者来说&#xff0c;这个例子将带领你正式进入WCF的世界。 在这个例…

深圳IO —— 一个汇编编程小游戏

目录简介数据手册接口简单 I/OXBus简单 I/O 对比 XBus语言参考程序结构注释标签寄存器accdatp0、p1、x0、x1、x2、x3null 伪寄存器指令操作数确保进行足够的睡眠 (slp)&#xff01;基本指令算法指令条件指令隐藏指令游戏界面DIY版本&#xff1a; 简介 以下介绍摘自未来软件园 …

unity shader 编辑器扩展类 ShaderGUI

这应该unity5才出的新功能了&#xff0c;今天看文档时刚巧看到了&#xff0c;就来尝试了一下。 效果如图&#xff1a; shader 的编辑器扩展分为2种方法&#xff1a; 是通过UnityEditor下的ShaderGUI类来实现的&#xff0c;形式比较近似于我们一般对unity编辑器的扩展方式。是通…

【电路补习笔记】9、电容式开关电源(电荷泵)

目录分类原理电荷泵基础开关电容稳压器的细调功能电荷泵的电压增益调节输出电容&#xff08;Co&#xff09;优点电容式开关稳压器减小纹波相关应用老师的主页&#xff1a;唐老师讲电赛 视频地址&#xff1a; 电源大师3——电容式开关电源&#xff08;电荷泵&#xff09;工作原理…

CPU 硬盘性能到底相差多少

本文以一个现代的、实际的个人电脑为对象&#xff0c;分析其中CPU&#xff08;Intel Core 2 Duo 3.0GHz&#xff09;以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度&#xff0c;希望能给大家留下一个比较直观的印象。本文中的数据来自…

【电路补习笔记】10、电感式开关电源(BUCK 降压电路)

目录分类封装焊线式覆晶式开关电源三种基本的非隔离开关电源纹波&#xff08;ripple&#xff09;开关电源的元件构成有源开关肖特基二极管或快恢复二极管不使用普通硅二极管的原因电感电容分压电阻&#xff08;输出电压设置&#xff09;工作原理工作模式连续模式&#xff08;co…

php中Session的生成机制、回收机制和存储机制探究

转载:http://www.jb51.net/article/53938.htm这篇文章主要介绍了php中Session的生成机制、回收机制和存储机制探究,可以帮助大家对Session有一个全面的了解,需要的朋友可以参考下1、php中session的生成机制我们先来分析一下PHP中是怎么生成一个session的。设计出session的目的是…

wsl2 Ubuntu 18.04 安装 ROS

目录前期准备安装ROS初始化rosdep测试前期准备 WSL的安装见旧版 WSL 的手动安装步骤从步骤4开始弄。 图形界面安装见在WSL中使用GPU&#xff1a;WSL2 Ubuntu 18.04 CUDA Gnome图形界面环境配置 界面汉化见WSL-Ubuntu安装中文语言 这里使用鱼香ROS大佬的一键安装脚本&…

GPU CUDA 经典入门指南

转自&#xff1a;http://luofl1992.is-programmer.com/posts/38830.html CUDA编程中&#xff0c;习惯称CPU为Host&#xff0c;GPU为Device。编程中最开始接触的东西恐怕是并行架构&#xff0c;诸如Grid、Block的区别会让人一头雾水&#xff0c;我所看的书上所讲述的内容比较抽象…

用PyQt实现透明桌面时钟小部件

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding: utf-8 -*-Created on 2012-4-6author: wangxiaoimport sys from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt from PyQt4.QtCore import QPoint from PyQt4.QtCore…

实现织梦dedecms百度主动推送(实时)网页抓取

做百度推广的时候&#xff0c;如何让百度快速收录呢&#xff0c;下面提供了三种方式&#xff0c;今天我们主要讲的是第一种。 如何选择链接提交方式 1、主动推送&#xff1a;最为快速的提交方式&#xff0c;推荐您将站点当天新产出链接立即通过此方式推送给百度&#xff0c;以保…

【RK3399Pro学习笔记】十八、点亮LED灯(python、C语言、bash)

目录GPIOpython3python-peripherypython2RPiC语言SysFs方式编写gpiolib.cgpiolib.hmain.c编译测试wiringPibash平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 GPIO (机翻)下表显示了座子的引脚&am…

Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)

目录python3开始学习Python线程_thread常量和函数&#xff1a;锁对象试用基本功能试用线程同步threading函数常量类线程本地数据线程对象锁对象递归锁对象条件对象信号量对象Semaphore 例子事件对象定时器对象栅栏对象在 with 语句中使用锁、条件和信号量测试Cstd::threadstd::…

Swing-BoxLayout用法-入门

注&#xff1a;本文内容源于http://www.java3z.com/cwbwebhome/article/article20/200016.html?id4797&#xff1b;细节内容根据笔者理解有修改。 BoxLayout 可以把控件依次进行水平或者垂直排列布局&#xff0c;这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列&a…

Python开发利器之UliPad

一、安装Ulipad 因为ulipad编辑器使用的是wxpython编写的gui&#xff0c;所以我们需要第三方库wxpython的支持&#xff0c;先讲一下Ulipad在Windows系统环境下的安装&#xff1a; 1. 确实自己的windows版本&#xff0c;32位还是64位的。2. 查看自己安装的 Python版本&#xff0…

flask接收前台的form数据

html 记得访问从服务里打开 表单html 不能直接打开表单html https://www.cnblogs.com/wanghaonull/p/6340096.html

树莓派Raspbian Buster/Debian 10 安装ROS

目录一些补充安装ROS初始化rosdep测试平台&#xff1a;树莓派4B 系统版本&#xff1a; 2020-05-27-raspios-buster-arm64.img 一些补充 系统安装参考 【树莓派学习笔记】一、烧录系统、(无屏幕)配置Wifi和SSH服务 【树莓派学习笔记】二、(无屏幕)SSH远程登录、图形界面及系统…

树莓派安装Ubuntu MATE及ROS系统

目录解锁SSH换源安装VNC服务安装ROS初始化rosdep和环境测试平台&#xff1a;树莓派4B 系统版本&#xff1a; ubuntu-mate-20.04.1-desktop-armhfraspi.img 在Raspberry Pi Download Options下载系统镜像 在树莓派资源下载 | 树莓派实验室下载工具 使用SDForm…