【STM32】ADC程序示例
00. 目录
文章目录
- 00. 目录
- 01. ADC简介
- 02. 硬件资源
- 03. 编程思路
- 04. 程序示例
- 05. 预留
- 06. 附录
- 07. 声明
01. ADC简介
STM32F4xx 系列一般都有 3 个 ADC,这些 ADC 可以独立使用,也可以使用双重/三重模式(提高采样率)。STM32F4 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 19 个通道,可测量 16 个外部源、2 个内部源和 Vbat 通道的信号。这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
STM32F407ZGT6 包含有 3 个 ADC。STM32F4 的 ADC 最大的转换速率为 2.4Mhz,也就是转换时间为 0.41us(在 ADCCLK=36M,采样周期为 3 个 ADC 时钟下得到),不要让 ADC 的时钟超过 36M,否则将导致结果准确度下降。
STM32F4 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
02. 硬件资源
用到的硬件资源有:
1) 指示灯 DS0
2) TFTLCD 模块
3) ADC
4) 杜邦线
03. 编程思路
①开启PA口时钟和ADC1时钟,设置PA1为模拟输入。
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_Init();
② 复位ADC1,同时设置ADC1分频因子。
ADC_DeInit(ADC1);
③ 初始化ADC_CCR寄存器。
ADC_CommonInit();
④初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。
void ADC_Init(ADC_TypeDefADCx,ADC_InitTypeDef* ADC_InitStruct);*
⑤ 使能ADC。
ADC_Cmd(ADC1, ENABLE);
⑥配置规则通道参数:
ADC_RegularChannelConfig();
⑦开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
⑧ 等待转换完成,读取ADC值。
ADC_GetConversionValue(ADC1);
04. 程序示例
adc.h
#ifndef __ADC_H__
#define __ADC_H__#include "sys.h"//ADC通道初始化
void ADC1_Init(void);//获取某个通道的值
u16 Get_Adc(u8 ch);//获取某个通道给定次数采样平均值
u16 Get_Adc_Average(u8 ch, u8 times);#endif/*__ADC_H__*/
adc.c
#include "adc.h"
#include "delay.h"//ADC通道初始化
void ADC1_Init(void)
{GPIO_InitTypeDef gpio_InitTypeDef;ADC_InitTypeDef ADC_InitStruct;ADC_CommonInitTypeDef ADC_CommonInitStruct;//开启ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启GPIO时钟 PA5RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //GPIO初始化 初始化为模拟功能gpio_InitTypeDef.GPIO_Pin = GPIO_Pin_5;gpio_InitTypeDef.GPIO_Mode = GPIO_Mode_AN;gpio_InitTypeDef.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &gpio_InitTypeDef);RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1复位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束 //初始化ADC_CCR寄存器ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div4;ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;ADC_CommonInit(&ADC_CommonInitStruct);//初始化ADC1ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStruct.ADC_NbrOfConversion = 1;ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;ADC_InitStruct.ADC_ScanConvMode = DISABLE;ADC_Init(ADC1, &ADC_InitStruct);//使能ADCADC_Cmd(ADC1, ENABLE);}//获取某个通道的值
u16 Get_Adc(u8 ch)
{//设置ADC规则组通道 一个序列 采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles);//开启软件转换ADC_SoftwareStartConv(ADC1);//等待转换结束while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//读取ADC的值return ADC_GetConversionValue(ADC1);
}//获取某个通道给定次数采样平均值
u16 Get_Adc_Average(u8 ch, u8 times)
{u32 tmp_val = 0;u8 i = 0;for (i = 0; i < times; i++){tmp_val += Get_Adc(ch);delay_ms(5);}return tmp_val / times;
}
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usmart.h"
#include "lcd.h"
#include "rtc.h"
#include "rng.h"
#include "key.h"
#include "wkup.h"
#include "adc.h"int main(void)
{ u16 value = 0;float temp = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2delay_init(168);uart_init(115200);usmart_dev.init(84);LED_Init();LCD_Init();ADC1_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"ADC TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@tom");LCD_ShowString(30,110,200,16,16,"2020/09/10"); //设置字体为蓝色POINT_COLOR = BLUE;LCD_ShowString(30,130,200,16,16,"ADC1_CH5_VAL:"); LCD_ShowString(30,150,200,16,16,"ADC1_CH5_VOL:0.000V"); while(1){value = Get_Adc_Average(ADC_Channel_5, 20);//显示采样之后的原始值LCD_ShowxNum(134, 130, value, 4, 16, 0);temp = (float)value * (3.3 / 4096);value = temp;LCD_ShowxNum(134, 150, value, 1, 16, 0);//小数部分temp = temp - value;temp *= 1000;LCD_ShowxNum(150, 150, temp, 3, 16, 0x80); LED1 = !LED1;delay_ms(250);}
}
05. 预留
06. 附录
6.1 【STM32】STM32系列教程汇总
网址:【STM32】STM32系列教程汇总
07. 声明
该教程参考了正点原子的《STM32 F4 开发指南》
【STM32】ADC程序示例相关推荐
- 【STM32】待机唤醒程序示例
00. 目录 文章目录 00. 目录 01. 待机模式简介 02. 硬件模块 03. 相关函数 04. 程序示例一 05. 程序示例二 06. 附录 07. 声明 01. 待机模式简介 很多单片机都有 ...
- 【STM32】硬件随机数程序示例
00. 目录 文章目录 00. 目录 01. 概述 02. 硬件模块 03. 相关函数 04. 程序示例 05. 结果验证 06. 附录 07. 声明 01. 概述 STM32F4 自带了硬件随机数发 ...
- STM32 ADC 采样 频率的确定
一 STM32 ADC 采样频率的确定 1. : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...
- STM32 ADC转换实验
摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...
- STM32——ADC
STM32--ADC 宗旨:技术的学习是有限的,分享的精神是无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执 ...
- STM32 ADC单通道与多通道_DMA学习笔记
转自:https://blog.csdn.net/dmfylb/article/details/72802690 第一部分 ADC单路采集 下面我们将 PC0引脚配置成 AD1的通道10为例进行讲解 ...
- STM32 ADC采样
目录 1.基础概念 2.原理:ADC采样过程分为四步:采样.保持.量化.编码. 3.采样定理 4.采样保持放大器(SHA) 5.ADC电压值转换 6.ADC轮询采样 1.基础概念 ADC 全称:Ana ...
- STM32 ADC多通道规则采样和注入采样
layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...
- STM32——ADC采集
目录 ADC简介 ADC主要特征 ADC功能框图 ADC引脚 电压输入范围 通道选择 单次转换模式 连续转换模式 转换顺序 规则序列 注入序列 触发源 转换时间 中断 转换结束中断 模拟看门狗中断 D ...
最新文章
- 重磅 | TensorFlow 2.0即将发布,所有tf.contrib将被弃用
- html html示例
- 3张硬纸板DIY《节奏光剑》全身追踪器,免费开源可替代淘宝3000元套件
- yum国内网络源的架设
- Machine Learning week 3 quiz : Logistic Regression
- 约瑟夫环 java实现
- EL表达式 JSTL(详解)
- python day5--正则表达式
- 微信分享无响应的解决
- Python将list存为csv文件
- Jsoup设置属性值
- UNIX 环境高级编程(六)—— 程序和进程
- 将一副遥感影像裁剪为多幅图像
- 拓端tecdat|R语言无监督学习:PCA主成分分析可视化
- 关于opencv标定的一些疑问,首先声明这篇文章转载于纸异兽,由于暂时联系不到他本人,只好请教各位了。有些问题想请教,各位大神可以留下联系方式帮我解决,万分感谢...
- 思维导图的用处是什么?绘制思维导图技巧分享
- php 中mb开头什么意思,mb是兆的意思吗
- Gary Gygax的倒台,密切关注Linux端口等
- css练习-小米官网首页静态页面制作
- IOS第二十九天——HTTP下载一个图片
热门文章
- Synaptics 蠕虫病毒解决方法
- Java 面试题大全(整理版)1000+ 面试题附答案详解
- 数字IC笔面试(一)——联发科提前批笔试题记录
- 《请别叫我奥特曼,我只是你望尘莫及的神话》
- How to be a qualified interviewer?
- 一场夜雨的误会?^_^
- python爬取国家男女比例_用python爬取3万多条评论,看韩国人如何评价韩国电影《寄生虫》?...
- 02 数学软件与建模---MATLAB入门
- X-Plane模拟器数据面板介绍以及飞行数据采集
- 【MySQL】修改配置后,重启MySQL报错[ERROR] The server quit without updating PID file