这是目录

  • 一、文档
  • 二、编程
    • 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_numfreq,分别表示通道数和频率。通道数使用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同时使用相关推荐

  1. 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 ...

  2. 多通道ADC一致性的高精度测量方法

    在散射计数字处理系统中,需要多通道ADC电路来对数据进行采样.在该系统中,需要对ADC采集后的数据进行数字下变频.脉冲压缩和波束合成等处理.然而,由于采样电路的路数很多,各个ADC通道由于布线差异.时 ...

  3. STM32的ADC采样与多通道ADC采样

    一 单通道采样  参考资料: <STM32库开发实战指南> 刘火良,杨森著 原理性质的东西还是少讲,因为上面那本书里面讲解的很详细了,直接来看硬件电路图 这里使用的是3362电位器(10K ...

  4. stm32f429之多通道ADC通过DMA数据采集

    stm32f429之多通道ADC通过DMA数据采集 原来的程序使用时stm32f103的芯片,现在给为stm32f429的芯片,查看一下几家开发板例程,发现没有使用adc+dma的,在网上也搜索了一下 ...

  5. 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效

    基于STM32F4的多通道ADC采集 单片机源程序如下: #include "sys.h" #include "delay.h" #include " ...

  6. cubemx 配置多通道ADC进行ADC采样

    cubemx 配置多通道ADC进行ADC采样 AD的基础知识 AD很复杂,其实也不复杂,因为我们用的不多. AD:模拟量转换数字量(模拟信号转换数字信号). ADC:模拟量转数字量的转换器. 为什么需 ...

  7. STM32多通道ADC采样获取GY-25A倾角传感器模拟输出数据

    STM32多通道ADC采样获取GY-25A倾角传感器模拟输出数据 GY-25A模块是新型的倾角传感器模块,具有X和Y两轴模拟角度输出和串口角度输出的功能.这里介绍STM32获取GY-25A模拟输出的角 ...

  8. ATMEL SAMC20J多通道ADC问题

    ## ATMEL SAMC20J多通道ADC问题##最近,在学习使用ATMEL单片机,用到的是SAMC20J18A,当调试多通道ADC时,遇到了一些问题,其中有关多通道ADC采样问题整了比较久.记录一 ...

  9. STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据

    STM32多通道ADC采样获取MCP9701模拟温度传感器温度输出数据 市面上常见的模拟温度传感器有TI的LM35系列,然后使用中并不简便.MCP9701是Microchip公司推出的相似的模拟温度传 ...

  10. 瑞萨e2studio(16)----基于DTC的多通道ADC采集

    瑞萨e2studio.16--基于DTC的多通道ADC采集 概述 视频教学 csdn课程 样品申请 完整代码下载 硬件准备 开发板 新建工程 工程模板 保存工程路径 芯片配置 工程模板选择 uart配 ...

最新文章

  1. Mybatis问题解释?
  2. 【Unity 3D 游戏开发】Unity3D 入门 - 工作区域介绍 与 入门示例
  3. 4-uboot编译流程
  4. dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Gold;第一次无效
  5. 单片机编程php,STC单片机内部FLASH读写程序(最新整理)
  6. 2440 8字数码管 显示0到10 c语言,51单片机对8位数码管依次显示0-7的设计
  7. Linux启动tomcat命令行关闭后服务会停止
  8. RocketMQ源码解析-Consumer启动(2)
  9. javascript:URL编解码和父子窗口交互
  10. 2020 年,最适合 AI 的 5 种编程语言
  11. KMP算法的C++实现
  12. Mybatis递归自查询查(无限极分类)
  13. 潘多拉固件设置ipv6_k2p下潘多拉/openwrt配置ipv6地址
  14. 计算机概论读后感,电子商务概论读后感.doc
  15. java发送http请求 utf8_Java 发送http请求(get、post)的示例
  16. 机器学习领域著名的期刊与会议
  17. FreeRTOS中多种信号量
  18. robots.txt介绍
  19. New 900 Sentences
  20. jRating之学习小研究

热门文章

  1. MMO与弱交互游戏的服务端技术区别
  2. python微博_Python脚本实现自动发带图的微博
  3. Ethernet guarder V1.1.exe 下载
  4. spring boot 2.0 配置logback日志
  5. 区块链安全分析:安全是重中之重,需要各方企业共同守护 | 新加坡Meetup
  6. 2020 Bioinformatics | GraphDTA: predicting drug target binding affinity with graph neural networks
  7. Sails.js简介
  8. swiper的小bug slideTo方法不触发slideChangeTransitionStart(swiper)
  9. sql2000 sp3、sql2000 sp4升级补丁下载和安装须知
  10. 使用C2Prog烧写程序