小松的STM32教程(6)——ADC
预备
学习目标
- 学会调用
Get_Adc_Average
函数 - 会使能多个ADC通道
概述
ADC输入电压范围:2.4V-3.6V,一般使用
0V和3.3V
数据对齐:16bit存放12bit的转换数据,可以左对齐也可以右对齐
规则通道和注入通道
项目 规则通道 注入通道 通道个数 最多16个 最多4个 类比 类似正常的程序执行 类似中断 转换标志位:转换结束,注入转换结束,看门狗,中断使能等
通道模式
通道模式 说明 单次转换 ADC只执行一次转换 连续转换 对通道不断地进行循环 扫描模式 只在多通道的情况下有效,一般要开启DMA,只有在最后一个通道结束之后才会产生中断 采样时间和转换时间:转换时间=采样时间+12.5周期
ADC通道和GPIO映射关系
ADC结构体讲解
- Mode:分为
独立模式
和多重模式
,独立模式是所有ADC都独立工作,互不影响,多重模式是彼此配合,一般选择独立模式 - ScanConvMode:选择是多通道模式(Scan)还是单通道模式(Single)
- ADC_ContinuousConvMode:单次转换还是连续转换
- ExternalTrigConv:触发方式
- ADC_DataAlign:数据对齐
- ADC_NbrOfChannel:规则转换的通道数
- Mode:分为
typedef struct
{uint32_t ADC_Mode; //FunctionalState ADC_ScanConvMode; //FunctionalState ADC_ContinuousConvMode; //uint32_t ADC_ExternalTrigConv; //uint32_t ADC_DataAlign; //uint8_t ADC_NbrOfChannel; //
}ADC_InitTypeDef;
adc.c
#include "adc.h"#include "delay.h"//使用不同引脚的时候注意初始化不同的引脚
//主函数中调用Get_Adc_Average的时候注意切换对应的通道void Adc_Init(void)
{ ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //映射关系参照映射表RCC_ADCCLKConfig(RCC_PCLK2_Div6); //配置ADC时钟,设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M//注意引脚的初始化//***********************************************************GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA1 作为模拟通道输入引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);//结构体赋值GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;//PA1 作为模拟通道输入引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_Init(GPIOA, &GPIO_InitStructure);//结构体赋值//************************************************************ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式,ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器//使能和校准ADC_Cmd(ADC1, ENABLE); //使能ADCADC_ResetCalibration(ADC1); //使能复位校准while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{//设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}u16 Get_Adc_Average(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(4);}return temp_val/times;
}
adc.h
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times); #endif
主函数调用
adcx=(128.0/4095.0)*Get_Adc_Average(ADC_Channel_4,10);
OLED_ShowNum(16,16,(int)adcx,4,16,1);
作业
- 使用光敏电阻作为输入,使用ADC进行读取
- 使用电位器作为输入,使用ADC进行读取
- 使用PS2摇杆作为输入,使用ADC分别读取x,y坐标
小松的STM32教程(6)——ADC相关推荐
- 【STM32】STM32CUBEMX + ADC(单通道,双通道DMA)
STM32CUBEMX + ADC(单通道,双通道DMA) 案例应用 :使用ADC采集电压(单通道.单通道+DMA.双通道+DMA),并利用串口打印采集转换后的电压值 1.工具 IAR STM32CU ...
- adc 接收cube_官方的stm32cube软件教程实例ADC操作代码(官方自带的,可以无视
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 官方的stm32cube软件教程实例ADC操作代码(官方自带的,可以无视),看不懂怎么用的可以等本贴吧更新图片教程,现在就是凑帖子数量,完成转职的,请谅解 ...
- STM32 CubeMX配置ADC+DMA进行FFT(1)
STM32 CubeMX配置ADC+DMA,计算采样率和ADC电压 原创:睿智嵌入式 最近,因为项目需要处理音频信号,对AD采集的音频信号进行FFT运算,记录一下学习过程. 主要内容: 1.ADC和D ...
- 详解STM32中的ADC
ADC简介 STM32F103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道.其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次.连续.扫 ...
- STM32三个ADC同步规则采样
同步采样一般应用于交流信号中,是指多个ADC的采集时刻完全同步.在电力测量领域,经常会遇到需要同步采样的情况,比如同步采样电压电流信号,计算其相位差.阻抗分析时,也需要对输入输出信号进行同步采集,分析 ...
- STM32 RS485传输ADC值代码
STM32 RS485传输ADC值的代码需要分为两部分:ADC采集和RS485通信. 首先,对于ADC采集,你需要配置STM32的ADC模块,并读取ADC的值.具体的代码实现可以参考STM32官方文档 ...
- STM32 FFT DMA ADC THD
利用STM32 FFT算法计算THD 一.设备准备 -->粤嵌STM32F429IGT6开发板 1块 -->串口调试助手 二.FFT算法意义 使用FFT算法,是为了获取信号在频域的相关参数 ...
- STM32教程(4)-最小系统的设计
什么是最小系统呢?就是芯片可以真正工作所需的必要的硬件系统.如果只是把一个芯片放在你面前,你跟它说:来,输出个占空比百分之五十的正 弦波.当然不能输出,这是毫无疑问的.那还需要什么呢? --电源电路的 ...
- STM32 进阶教程 18 – ADC间断模式
前言 STM32 的ADC拥有连续扫描模式,也有间断模式,间断模式较扫描模式需要更多的触发事件才能完成所有的通道转换操作,在实际工程应用中,可以利用间断模式实现一些特殊应用.关于间断模式,在STM32 ...
- STM32 进阶教程 17 - ADC注入通道
前言 STM32 的ADC的一个强大功能是支持触发注入功能,在103中每个ADC模块支持4个注入通道,每个注入通道具有独立的结果突存器,注入通道具有较规划通道更高的优先级,在实际工程应用中,注入通道更 ...
最新文章
- python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?
- lisp直线连接圆象限电_用小学数学知识解释,为什么井盖是圆的?
- linux opendir readdir closedir 的使用
- 基于springboot断点续传或分片上传
- 计数显示器c语言程序,51单片机计数显示器Proteus仿真程序
- SEO前端篇(二)关键词
- ef1a启动子_组织特异性启动子的筛选方法
- linux log原理,linux系统日志管理工具logrotate之原理详述
- win7原版镜像_i3-8100装Win7没有集显驱动?驱动人生告诉你为什么
- 在纯Win10环境下部署DzzOffice+OnlyOffice协同办公系统
- CSA发布 | 《区块链的十大攻击、漏洞及弱点》
- Swagger2由入门到实战
- 论文阅读-Detecting and Recovering Sequential DeepFake Manipulation(SeqFakeFormer)
- 通俗理解 机器学习中的偏差和方差
- 自定义 UINavigationController
- 阿里云ECS安装MySql数据库
- InAction-根据LBS数据手机用户移动轨迹
- spoolsv - spoolsv.exe - 进程信息
- C/C++ restrict修饰符
- Involution-Convolution
热门文章
- 线程学习记录-锁原理与对象头
- Tivoli Storage Manager安装配置
- Vue3 Extraneous non-props attributes (id) were passed to component but could not be automatically
- 分段线性函数三种MIP模型
- 京东常用的API接口
- 学Python运维,这知识点你肯定会遇到,【必收藏之】nginx 域名跳转相关配置
- 只查看ett.txt文件(100行内,20-30行内容)
- flea-cache使用之Redis集群模式接入
- 深圳旅游區景點及簡介
- 配置Dot1q终结子接口实现跨设备VLAN间通信示例