AD单通道/多通道

news/2024/12/22 18:48:18/

1.AD单通道(单次转换,非扫描模式)

1.1 接线图

1.2 AD.c

#include "stm32f10x.h"                  // Device headervoid AD_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//ADC时钟分频,6分频,72/6=12,12MHz小于14MHzGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//将IO口配置为模拟输入模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//查表得知PA0口为ADC通道0口GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//ADC规则组输入通道,因为IO口选择PA0,所以此处通道为ADC通道0,序列号,采样时间//ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);//采用多通道可以多次配置//ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_55Cycles5);ADC_InitTypeDef ADC_Initstructure;ADC_Initstructure.ADC_Mode = ADC_Mode_Independent;//ADC模式,单ADC模式,区别于双ADC模式ADC_Initstructure.ADC_DataAlign = ADC_DataAlign_Right;//参数值右对齐ADC_Initstructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//外部触发选择:不使用外部触发ADC_Initstructure.ADC_ContinuousConvMode = DISABLE;//单次转换ADC_Initstructure.ADC_ScanConvMode = DISABLE;//非扫描模式ADC_Initstructure.ADC_NbrOfChannel = 1;//通道数为1ADC_Init(ADC1,&ADC_Initstructure);ADC_Cmd(ADC1, ENABLE);//开启ADCADC_ResetCalibration(ADC1);//校准while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取所选ADC复位校准寄存器状态,等待校准完成。判断CR2_RSTCAL状态,经查阅参考手册 //ADC控制寄存器 2(ADC_CR2)得知当校准完成后,该位自动置0,置0后跳出循环,等待结束ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1)== SET);//获取所选ADC校准状态,等待校准完成。原理同上}uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件启动AD转换while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)== RESET);//获取EOC标志位,检查转换是否完成,检查ADC状态寄存器(ADC_SR)寄存器的EOC标志位//经查阅参考手册得,转换结束位,该位由硬件在(规则或注入)通道组转换结束时设置,由软件清除或由读取ADC_DR时清除//0:转换未完成;1:转换完成,所以在此处while循环中判断条件为EOC是否等于RESET,转换结束即可跳出循环//ADC_ClearFlag(ADC1,ADC_FLAG_EOC);//因为读取ADC_DR时自动清除EOC标志位,所以此处无需这条代码return ADC_GetConversionValue(ADC1);//返回常规通道的最后一次ADCx转换结果数据。因为此代码是读取ADC_DR寄存器,读取后自动自动清除EOC标志位
}

 需要注意:

  • AD校准中,在等待校准完成时,while的判断条件,具体根据寄存器ADC_CR2描述来配合

  • 在等待转换完成读取EOC标志位时的判断条件, 具体根据寄存器ADC_SR描述来配合

1.3 main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t ADValue;
int main(void)
{OLED_Init();AD_Init();OLED_ShowString(1,1,"ADValue:");while (1){ADValue = AD_GetValue();//将获取AD值赋给ADValue;OLED_ShowNum(1,9,ADValue,4);}
}

1.4 实验结果

  •  通过调整旋钮来改变阻值,进而改变输出电压的大小,并通过AD转换输出

2.  AD多通道(连续转换,扫描模式)


http://www.ppmy.cn/news/1453338.html

相关文章

基于51单片机的智能台灯proteus仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

基于51单片机的红外光敏检测智能台灯控制系统仿真( proteus仿真程序原理图报告讲解视频) 1.主要功能: 基于51单片机的红外检测光照检测智能台灯仿真设计 1、检测光照强度并显示在数码管上。 2、具备红外检测人体功能。 3、灯光控制模式分为自动模式…

ASP.NET 两种开发模式

1》》WebForm 开发模式 1. 服务器端控件 2. 一般处理程序html静态页Ajax 3. 一般处理程序html模板 如下图 2》》MVC 太复杂的系统,会造成Controller 过复杂。 后来就诞生了 MVP、MVVM等模式

排序算法--冒泡排序

前提: 交换排序:根据序列中两个值的比较结果来交换这两个数在序列中的位置,交换排序的特点是:将值较大的数向序列的尾部移动,值较小的数向序列的前部移动。 算法分析: 冒泡排序,英语名是Bubble…

推荐网站(1)懒人Excel,函数公式、操作技巧等,一看就看会

相信很多小伙伴打开excel表的时候,不知道要怎么操作,也不知道该如何搜索自己想要的结果,那么我推荐个网站懒人Excel,它可以帮我们快速了解使用 EXCEL的基本操作,也可以帮我们解决使用 EXCEL的遇到的问题。 可以看到他…

如何确定Unity/VNXe存储的主控制器(Primary SP)

DELL EMC的Unity或者VNXe存储都是双控的架构(VNXe 1代设备有部分支持单控配置),有些的CLI检查命令是必须在primary SP,也就是主控制器上执行的,那么问题来了,如何确定两个控制器中那个是主控制器呢&#xf…

MySQL45讲(一)(44)

该文章提到的是问题 有一个知识点就是不一定left join的左边就一定是驱动表,就比如左边如果查询的列是有索引的,那么在使用索引的情况下,右边的表应该是驱动表 对于SNL和BNL的区别在于,对于被驱动表的匹配条件一个是每一行会先在…

轻松应对数据恢复挑战:雷神笔记本,不同情况不同策略

在数字化时代,数据无疑是我们生活中不可或缺的一部分。无论是重要的工作文件、珍贵的家庭照片,还是回忆满满的视频,一旦丢失,都可能给我们的生活带来诸多不便。雷神笔记本作为市场上备受欢迎的电脑品牌,用户在使用过程…

程序的机器级表示——Intel x86 汇编讲解

往期地址: 操作系统系列一 —— 操作系统概述操作系统系列二 —— 进程操作系统系列三 —— 编译与链接关系操作系统系列四 —— 栈与函数调用关系操作系统系列五 —— 目标文件详解操作系统系列六 —— 详细解释【静态链接】操作系统系列七 —— 装载操作系统系列…