STM32 ADC 多通道16路电压采集

2023-11-12

下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。直接在电脑USB取点,省去外接电源麻烦,实测耗电电流不到20ma.

1.主控电路图:

stm3216adc

2. USB转串口电路图

USB转TTL串口电路图

3.LM324电压跟随器电路图

电压跟随器

4.滤波电路图

滤波电路

5.16路接口电路图

16路接口电路图

6.电源电路图

电源电路图

7.16路ADC初始化程序:

void Adc_Init(void) 
{
//先初始化IO口
RCC->APB2ENR|=0X7<<2; //使能PORTA\PORAB\PORTC口时钟
GPIOA->CRL&=0X00000000;//PA0 1 2 3 4 5 6 7 anolog输入
GPIOB->CRL&=0XFFFFFF00;//PB0 1 anolog输入
GPIOC->CRL&=0XFF000000;//PC0 1 2 3 4 5 anolog输入
//通道10/11设置
RCC->APB2ENR|=1<<9; //ADC1时钟使能
RCC->APB2RSTR|=1<<9; //ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14); //分频因子清零
//SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC->CFGR|=2<<14;
ADC1->CR1&=0XF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1&=~(1<<8); //非扫描模式
ADC1->CR2&=~(1<<1); //单次转换模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //软件控制转换
ADC1->CR2|=1<<20; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
ADC1->CR2&=~(1<<11); //右对齐ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1&=0<<20; //1个转换在规则序列中 也就是只转换规则序列1
//设置通道采样时间
ADC1->SMPR2&=0X00000000;//通道0,1,2,3,4,5,6,7,8,9采样时间清空
ADC1->SMPR2|=7<<27; //通道9 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<24; //通道8 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<21; //通道7 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<18; //通道6 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<15; //通道5 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<12; //通道4 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<9; //通道3 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<6; //通道2 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<3; //通道1 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR2|=7<<0; //通道0 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1&=0XFFFC0000;//通道10,11,12,13,14,15采样时间清空
ADC1->SMPR1|=7<<15; //通道15 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<12; //通道14 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<9; //通道13 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<6; //通道12 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<3; //通道11 239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1|=7<<0; //通道10 239.5周期,提高采样时间可以提高精确度
ADC1->CR2|=1<<0; //开启AD转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除
}

8.获取ADC值的程序:

//获得ADC值 
//ch:通道值 1~16
u16 Get_Adc(u8 ch)
{
u8 ch_ch;
switch(ch)
{
case 1:ch_ch = 8; break;
case 2:ch_ch = 9; break;
case 3:ch_ch = 14; break;
case 4:ch_ch = 15; break;
case 5:ch_ch = 6; break;
case 6:ch_ch = 7; break;
case 7:ch_ch = 4; break;
case 8:ch_ch = 5; break;
case 9:ch_ch = 2; break;
case 10:ch_ch = 3; break;
case 11:ch_ch = 1; break;
case 12:ch_ch = 0; break;
case 13:ch_ch = 12; break;
case 14:ch_ch = 13; break;
case 15:ch_ch = 11; break;
case 16:ch_ch = 10; break;
default:ch_ch = 88; break;
}
if(ch_ch==88)return 0;
//设置转换序列
ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
ADC1->SQR3|=ch_ch;
ADC1->CR2|=1<<22; //启动规则转换通道
while(!(ADC1->SR&1<<1));//等待转换结束
return ADC1->DR; //返回adc值
}

9.把ADC值转换成电压值的函数:

// ch范围1~16 
void fetch_adc(u8 ch)
{
u16 adcx;
u32 temp;
if((ch==0)||(ch>16))return; // 如果不是1到16,通道无效,退出函数
adcx=Get_Adc(ch); // 获得ADC值
temp=(u32)adcx*3300/4096; // 计算电压值 单位mv
adcx=temp; // 获得计算出的电压值
adc_buf[ch*2-2] = adcx>>8; // 给adc_buf赋值 ,先赋高8位,后赋低8位
adc_buf[ch*2-1] = adcx;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 ADC 多通道16路电压采集 的相关文章

  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • GCC - 如何停止链接 malloc?

    我正在努力将我的代码缩减到最小的骨架大小 我使用的是只有 32k 闪存的 STM32F0 需要很大一部分闪存用于数据存储 我的代码已经有大约 20k 闪存大小 其中一些是由于使用了 STM32 HAL 函数 我可以在以后需要时对其进行解释和
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加

随机推荐

  • Linux 查看进程消耗内存情况总结

    在Linux中 有很多命令或工具查看内存使用情况 今天我们来看看如何查看进程消耗 占用的内存情况 Linux的内存管理和相关概念要比Windows复杂一些 在此之前 我们需要了解一下Linux系统下面有关内存的专用名词和专业术语概念 物理内
  • LeetCode之最长公共子序列问题LCS解决方法

    Leetcode官网解答 使用动态规划原理 请参考原文地址 https leetcode cn com problems longest common subsequence solution zui chang gong gong zi
  • Python机器学习--算法实现--常用算法在Sklearn中的回归算法关键参数详解

    常用算法在Sklearn中的关键参数详解 回归算法 线性回归算法 from sklearn linear model import LinearRegression LinearRegression fit intercept True n
  • VS2008调试dump文件

    让程序在崩溃时体面的退出之Dump文件 在我的那篇 让程序在崩溃时体面的退出之CallStack 中提供了一个在程序崩溃时得到CallStack的方法 可是要想得到CallStack 必须有pdb文件的支持 但是一般情况下 发布出去的程序都
  • 网址服务器不稳定,关于网站被360搜索提示服务器不稳定可能无法正常访问的解决方法...

    相信很多做网站的站长们都有过类似的经历吧 有时候因为服务器节点问题或者其他问题导致服务器或vps暂时性无法运行导致网站暂时无法打开 这些都是属于正常的现象 但是运气不好的时候辛辛苦苦优化的网站可能就会被搜素引擎标记为 该页面因服务器不稳定可
  • 锦囊妙计--组建新团队整体规划

    详细请见幕布链接 https mubu com doc 2MicLCcsoC 幕布内的具体内容还在持续完善中 敬请期待
  • 【洛谷 P1115】最大子段和 题解(贪心算法)

    最大子段和 题目描述 给出一个长度为 n n n 的序列 a a a 选出其中连续且非空的一段使得这段和最大 输入格式 第一行是一个整数 表示序列的长度 n
  • 报错unable to access android sdk add-on list

    前言 初次安装Android Studio AS启动后 会在默认路径下检测是否有Android SDK 如果没有的话 就会报错如下 解决办法 我这里安装了sdk 然后点击cancel 下一步会自动读取我们的sdk 然后点击next就行了 如
  • OPENWRT中SSH免密钥登陆(详细步骤)

    通过使用ssh keygen生成公钥 在两台机器之间互相建立新人通道极客 假设本地机器是client 远程机器为server 1 使用ssh keygen生成rsa keygen 在这里会覆盖以前生成的 ssh id rsa文件 请提前做好
  • vue3的一些知识点plus--3

    二十 兄弟组件传值 Bus 兄弟组件直接的传值 最基础的是通过同一个父级进行数值的传递 使用prop和emit 太过繁琐 父级 div a a b b div let flag ref false let getFlag params bo
  • 停车场管理

    停车场管理 1 项目简介 设停车场是一个可以停放n辆汽车的南北方向的狭长通道 且只有一个大门可供汽车进出 汽车在停车场内按车辆到达时间的先后顺序 依次由北向南排列 大门在最南端 最先到达的第一辆车停放在车场的最北端 若车场内已停满n辆车 那
  • Java入门(1) —— 变量、运算符、分支结构和程序员思维的理解

    1 计算机语言的发展史 机器语言 机器语言是指一台计算机全部的指令集合 汇编语言 为了减轻使用机器语言编程的痛苦 人们进行了一种有益的改进 用一些简洁的英文字母 符号串来替代一个特定的指令的二进制串 高级语言 BASIC True basi
  • Map循环遍历的五种方法

    因为Map比较常用 所以今天来总结下Map取值比较常用的几种遍历方法 1 创建一个Enum public enum FactoryStatus BAD 0 ou GOOD 1 yeah private int status private
  • 排错解决:etcd节点掉线后(code=exited, status=1/FAILURE),如何加入

    一 问题出现环境 有一个etcd节点因为磁盘问题当掉 在node1节点查看健康状态 root node01 k8s etcd bin etcdctl ca file k8s etcd ssl ca pem cert file k8s etc
  • python统计字典里面value出现的次数_python 统计list中各个元素出现的次数的几种方法...

    利用字典dict来完成统计 举例 a 1 2 3 1 1 2 dict for key in a dict key dict get key 0 1 print dict 输出结果 gt gt gt 1 3 2 2 3 1 利用Python
  • 【WINDOWS / DOS 批处理】for命令详解(六)

    for命令详解 一 共十篇 for命令详解 二 共十篇 for命令详解 三 共十篇 for命令详解 四 共十篇 for命令详解 五 共十篇 for命令详解 六 共十篇 for命令详解 七 共十篇 for命令详解 八 共十篇 for命令详解
  • urlrewrite(伪静态技术运用2之outbound-rule)

    问题 页面通过 servlet detail magid 520 categoryId 205 来访问一个servlet 这个链接在IE地址栏上给人家看起来很不舒服 想把它伪装一下变成别的地址 例如想把它伪装成 servlet detail
  • 2019最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)

    近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k下的都会出笔试题 特别高的薪资都是直接技术面试或者是 现场编程 总结很多人的面试题 后期会对于单个知识点再说笔记详细讲解 部分都是百度的答案 不是特全面的 可以自己找 红色为常见面
  • vue 父子组件(个人笔记)

    目录 父组件使用子组件 父子组件之间传参 props 子获父 ref 子获父 this parent 子获父 emit 父获子 使用this emit 自定义事件名 所需要传的值 this children 父获子 父组件使用子组件 父组件
  • STM32 ADC 多通道16路电压采集

    下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序 采用USB接口与电脑连接 实则USB转串口方式 所以上位机可以用串口作为接口 电路图中利用LM324作为电压跟随器 起到保护单片机引脚的作用 直接在电脑USB取点