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程序示例相关推荐

  1. 【STM32】待机唤醒程序示例

    00. 目录 文章目录 00. 目录 01. 待机模式简介 02. 硬件模块 03. 相关函数 04. 程序示例一 05. 程序示例二 06. 附录 07. 声明 01. 待机模式简介 很多单片机都有 ...

  2. 【STM32】硬件随机数程序示例

    00. 目录 文章目录 00. 目录 01. 概述 02. 硬件模块 03. 相关函数 04. 程序示例 05. 结果验证 06. 附录 07. 声明 01. 概述 STM32F4 自带了硬件随机数发 ...

  3. STM32 ADC 采样 频率的确定

    一 STM32 ADC 采样频率的确定 1.       : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...

  4. STM32 ADC转换实验

    摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...

  5. STM32——ADC

    STM32--ADC 宗旨:技术的学习是有限的,分享的精神是无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执 ...

  6. STM32 ADC单通道与多通道_DMA学习笔记

    转自:https://blog.csdn.net/dmfylb/article/details/72802690 第一部分  ADC单路采集 下面我们将 PC0引脚配置成 AD1的通道10为例进行讲解 ...

  7. STM32 ADC采样

    目录 1.基础概念 2.原理:ADC采样过程分为四步:采样.保持.量化.编码. 3.采样定理 4.采样保持放大器(SHA) 5.ADC电压值转换 6.ADC轮询采样 1.基础概念 ADC 全称:Ana ...

  8. STM32 ADC多通道规则采样和注入采样

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 什么是ADC? STM ...

  9. STM32——ADC采集

    目录 ADC简介 ADC主要特征 ADC功能框图 ADC引脚 电压输入范围 通道选择 单次转换模式 连续转换模式 转换顺序 规则序列 注入序列 触发源 转换时间 中断 转换结束中断 模拟看门狗中断 D ...

最新文章

  1. 重磅 | TensorFlow 2.0即将发布,所有tf.contrib将被弃用
  2. html html示例
  3. 3张硬纸板DIY《节奏光剑》全身追踪器,免费开源可替代淘宝3000元套件
  4. yum国内网络源的架设
  5. Machine Learning week 3 quiz : Logistic Regression
  6. 约瑟夫环 java实现
  7. EL表达式 JSTL(详解)
  8. python day5--正则表达式
  9. 微信分享无响应的解决
  10. Python将list存为csv文件
  11. Jsoup设置属性值
  12. UNIX 环境高级编程(六)—— 程序和进程
  13. 将一副遥感影像裁剪为多幅图像
  14. 拓端tecdat|R语言无监督学习:PCA主成分分析可视化
  15. 关于opencv标定的一些疑问,首先声明这篇文章转载于纸异兽,由于暂时联系不到他本人,只好请教各位了。有些问题想请教,各位大神可以留下联系方式帮我解决,万分感谢...
  16. 思维导图的用处是什么?绘制思维导图技巧分享
  17. php 中mb开头什么意思,mb是兆的意思吗
  18. Gary Gygax的倒台,密切关注Linux端口等
  19. css练习-小米官网首页静态页面制作
  20. IOS第二十九天——HTTP下载一个图片

热门文章

  1. Synaptics 蠕虫病毒解决方法
  2. Java 面试题大全(整理版)1000+ 面试题附答案详解
  3. 数字IC笔面试(一)——联发科提前批笔试题记录
  4. 《请别叫我奥特曼,我只是你望尘莫及的神话》
  5. How to be a qualified interviewer?
  6. 一场夜雨的误会?^_^
  7. python爬取国家男女比例_用python爬取3万多条评论,看韩国人如何评价韩国电影《寄生虫》?...
  8. 02 数学软件与建模---MATLAB入门
  9. X-Plane模拟器数据面板介绍以及飞行数据采集
  10. 【MySQL】修改配置后,重启MySQL报错[ERROR] The server quit without updating PID file