W806/W801/W800多通道ADC同时使用
这是目录
- 一、文档
- 二、编程
- 2.1、定义ADC端口和ADC的结构体
- 2.2、修改初始化代码
- 2.3、主函数
- 三、测试
本文使用环境:
电脑:windows10
主控:W806(240MHZ)
兼容:W800 W801
编译环境:平头哥的CDK
注意:本文默认已经搭建好平台。
参考文章:
W806-ADC-PWM-TIM尝鲜
本文github地址
写在前面:
最近有比较多的同学问到了多路ADC如何使用的问题,官方的demo只给出了单路ADC,因此本文就详细讲解一下。
一、文档
首先翻阅芯片的手册,查看ADC对应的端口和特性,这里直接查看上一篇文章的第1.1小节。
二、编程
2.1、定义ADC端口和ADC的结构体
定义单片机所有的ADC端口,一共有4个外接端口和一个电压、一个温度(共6个)。对应的IO注释在定义后面。在main
函数定义如下:
//ADC
/* * 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 *//* 307hz ~ 2khz *///ADC编号
#define ADC_1 0 //PA1
#define ADC_2 1 //PA4
#define ADC_3 2 //PA3
#define ADC_4 3 //PA2
#define ADC_TEMP 4
#define ADC_VOL 5//一共6个端口所以定义六个结构体数组
ADC_HandleTypeDef hadc[6];
注意: 由于官方的demo存在bug,所以需要做如下修改,否者下面的步骤编译会报错。
在wm_adc.h
文件中,添加如下定义ADC_CHANNEL_VOL
。注意下图可以看出adc的频率在307-2000
之间,记住这里。
#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
//add by zxx start
#define ADC_CHANNEL_VOL ADC_ANA_CR_CH_VOL
//add by zxx end
#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
2.2、修改初始化代码
官方的demo只给出了一个init函数,若需要使用多个需要自己单独多次修改,不是很方便,因此对官方的demo稍加修改。函数入口参数改为adc_num
和freq
,分别表示通道数和频率。通道数使用2.1小节定义的宏,频率直接写数字就行。
注意: 从上小节可以看出频率要保持在307-2000之间。但手册
写的是1000,我也不是很理解。
static void ADC_Init(uint32_t adc_num, uint32_t freq)
{/* //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 PA2#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_VOL ADC_ANA_CR_CH_VOL#define ADC_CHANNEL_TEMP ADC_ANA_CR_CH_TEMP#define ADC_CHANNEL_OFFSET ADC_ANA_CR_CH_OFFSET
*/uint32_t ADC_CHANNEL;/* 307hz ~ 2khz */switch(adc_num){case 0: ADC_CHANNEL = ADC_CHANNEL_0; break; //PA1case 1: ADC_CHANNEL = ADC_CHANNEL_1; break; //PA4case 2: ADC_CHANNEL = ADC_CHANNEL_2; break; //PA3case 3: ADC_CHANNEL = ADC_CHANNEL_3; break; //PA2case 4: ADC_CHANNEL = ADC_CHANNEL_TEMP; break;case 5: ADC_CHANNEL = ADC_CHANNEL_VOL; break;default : printf("adc init ADC_CHANNEL err, The number of channels is not between 0 and 3 \r\n");return; break;}if(freq > 2000 || freq < 304)printf("adc freq too larger than 2khz or too lower than 307hz...please check...\n");hadc[adc_num].Instance = ADC;hadc[adc_num].Init.channel = ADC_CHANNEL;hadc[adc_num].Init.freq = freq;if (HAL_ADC_Init(&hadc[adc_num]) != HAL_OK){printf("adc init err...\n");}
}
2.3、主函数
int main(void)
{int value[6] = {0};SystemClock_Config(CPU_CLK_160M);printf("enter main\r\n");ADC_Init(ADC_1,1000);ADC_Init(ADC_2,1000);ADC_Init(ADC_3,1000);ADC_Init(ADC_4,1000);ADC_Init(ADC_TEMP,1000);ADC_Init(ADC_VOL,1000);while (1){value[0] = HAL_ADC_GET_INPUT_VOLTAGE(&hadc[ADC_1]);value[1] = HAL_ADC_GET_INPUT_VOLTAGE(&hadc[ADC_2]);value[2] = HAL_ADC_GET_INPUT_VOLTAGE(&hadc[ADC_3]);value[3] = HAL_ADC_GET_INPUT_VOLTAGE(&hadc[ADC_4]);value[4] = HAL_ADC_GET_INPUT_VOLTAGE(&hadc[ADC_TEMP]);value[5] = HAL_ADC_GET_INPUT_VOLTAGE(&hadc[ADC_VOL]);for(int i=0;i<6;i++)printf("value%d: = %d ",i,value[i]);printf("\n");HAL_Delay(1000);}
}
三、测试
下载程序到开发板,并串口输出:
W806/W801/W800多通道ADC同时使用相关推荐
- W801/W800/W806唯一ID/CPUID/FLASHID
这是目录 一.项目概述 二.工程设计 2.1.CPUID 2.2.flashID 2.3.uniqueID 三.测试 3.1.测试代码 3.2.W800测试结果 3.3.W801测试结果 3.4.AI ...
- 多通道ADC一致性的高精度测量方法
在散射计数字处理系统中,需要多通道ADC电路来对数据进行采样.在该系统中,需要对ADC采集后的数据进行数字下变频.脉冲压缩和波束合成等处理.然而,由于采样电路的路数很多,各个ADC通道由于布线差异.时 ...
- STM32的ADC采样与多通道ADC采样
一 单通道采样 参考资料: <STM32库开发实战指南> 刘火良,杨森著 原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来看硬件电路图 这里使用的是3362电位器(10K ...
- stm32f429之多通道ADC通过DMA数据采集
stm32f429之多通道ADC通过DMA数据采集 原来的程序使用时stm32f103的芯片,现在给为stm32f429的芯片,查看一下几家开发板例程,发现没有使用adc+dma的,在网上也搜索了一下 ...
- 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效
基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...
- cubemx 配置多通道ADC进行ADC采样
cubemx 配置多通道ADC进行ADC采样 AD的基础知识 AD很复杂,其实也不复杂,因为我们用的不多. AD:模拟量转换数字量(模拟信号转换数字信号). ADC:模拟量转数字量的转换器. 为什么需 ...
- STM32多通道ADC采样获取GY-25A倾角传感器模拟输出数据
STM32多通道ADC采样获取GY-25A倾角传感器模拟输出数据 GY-25A模块是新型的倾角传感器模块,具有X和Y两轴模拟角度输出和串口角度输出的功能.这里介绍STM32获取GY-25A模拟输出的角 ...
- ATMEL SAMC20J多通道ADC问题
## ATMEL SAMC20J多通道ADC问题##最近,在学习使用ATMEL单片机,用到的是SAMC20J18A,当调试多通道ADC时,遇到了一些问题,其中有关多通道ADC采样问题整了比较久.记录一 ...
- STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据
STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据 市面上常见的模拟温度传感器有TI的LM35系列,然后使用中并不简便.MCP9701是Microchip公司推出的相似的模拟温度传 ...
- 瑞萨e2studio(16)----基于DTC的多通道ADC采集
瑞萨e2studio.16--基于DTC的多通道ADC采集 概述 视频教学 csdn课程 样品申请 完整代码下载 硬件准备 开发板 新建工程 工程模板 保存工程路径 芯片配置 工程模板选择 uart配 ...
最新文章
- Mybatis问题解释?
- 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例
- 4-uboot编译流程
- dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Gold;第一次无效
- 单片机编程php,STC单片机内部FLASH读写程序(最新整理)
- 2440 8字数码管 显示0到10 c语言,51单片机对8位数码管依次显示0-7的设计
- Linux启动tomcat命令行关闭后服务会停止
- RocketMQ源码解析-Consumer启动(2)
- javascript:URL编解码和父子窗口交互
- 2020 年,最适合 AI 的 5 种编程语言
- KMP算法的C++实现
- Mybatis递归自查询查(无限极分类)
- 潘多拉固件设置ipv6_k2p下潘多拉/openwrt配置ipv6地址
- 计算机概论读后感,电子商务概论读后感.doc
- java发送http请求 utf8_Java 发送http请求(get、post)的示例
- 机器学习领域著名的期刊与会议
- FreeRTOS中多种信号量
- robots.txt介绍
- New 900 Sentences
- jRating之学习小研究
热门文章
- MMO与弱交互游戏的服务端技术区别
- python微博_Python脚本实现自动发带图的微博
- Ethernet guarder V1.1.exe 下载
- spring boot 2.0 配置logback日志
- 区块链安全分析:安全是重中之重,需要各方企业共同守护 | 新加坡Meetup
- 2020 Bioinformatics | GraphDTA: predicting drug target binding affinity with graph neural networks
- Sails.js简介
- swiper的小bug slideTo方法不触发slideChangeTransitionStart(swiper)
- sql2000 sp3、sql2000 sp4升级补丁下载和安装须知
- 使用C2Prog烧写程序