day9江协科技7-1ADC

这个就是一个模数转换器,就是将模拟转化成数字

3.什么叫做十二位次,就是说指的是它的范围为0-2的12次方-1,即范围是0-4095,这个1us的转换时间的意思就是ADC转换结果所需要花的时间需要1us

4.这里的输入电压和转换结果范围是一一对应,成线性关系

我们这个芯片只有十个左右的外部信号源

这是我们的引脚对应图,我们之前说过了还记得吗,这块芯片只有这十个作为我们的ADC引脚,同时为什么是ADC12,就是可以让这两个ADC一起工作

这是其他芯片的引脚对应图,我们这里只有0-9

规则组的四种转换模式

注入组的触发控制

一些结构体中的小参数

结构体会进行选择,这里选择右对齐即可

不需要

===============================项目一=====================================

①开启RCC时钟,包括GPIO和ADC的时钟以及ADC的时钟

②配置GPIO,把GPIO配置成模拟输入的形式

③配置多路开关,把左边的通道接入到右边的规则组里

④配置ADC转换器

⑤上面哪些模拟看门狗和中断输出控制还有NVIC本节暂时不用

⑥开关控制

=======================常用函数============================================

=========================单通道ADC========================================

cpp 复制代码
#include "stm32f10x.h"                  // Device header


void AD_init(void)
{
	//①开启RCC时钟,包括GPIO和ADC的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);
	//为什么需要去配置这个时钟,由于本身APB2的时钟是72Mhz
	//而对于ADC来说上限是14Hz,所以需要分频
	
	//②配置GPIO,把GPIO配置成模拟输入的形式
	GPIO_InitTypeDef GPIO_InitStruct100;
	GPIO_InitStruct100.GPIO_Mode=GPIO_Mode_AIN;
	GPIO_InitStruct100.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStruct100.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct100);
	
	//③配置多路开关,把左边的通道接入到右边的规则组里
	ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);
	//这个啥意思,参数分别是哪个ADC,ADC通道选择哪个(对应引脚),采样时间,通道排序(对应顺序)
	//就是笔记里的那个单次转换,扫描模式
	//当我们想要再弄一个其他的
	ADC_RegularChannelConfig(ADC1,ADC_Channel_3,2,ADC_SampleTime_239Cycles5);
	
	//④配置ADC转换器
	ADC_InitTypeDef ADC_InitStruct;
	ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;//选择是单ADC模式还是双ADC模式
	ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
	ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
	//外部触发源选择,由于我们是none,即软件触发,所以不进行选择
	ADC_InitStruct.ADC_NbrOfChannel=1;//通道数目
	ADC_InitStruct.ADC_ScanConvMode=DISABLE;//只看一个通道(DISABLE)
	ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;//连续模式还是单次模式(DISABLE)
	ADC_Init(ADC1,&ADC_InitStruct);
	
	//⑥开关控制
	ADC_Cmd(ADC1,ENABLE);
	//校准四件套,放后面就行
	ADC_ResetCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1)==SET);
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1)==SET);
}
uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);					//软件触发AD转换一次
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);	//等待EOC标志位,即等待AD转换结束
	return ADC_GetConversionValue(ADC1);					//读数据寄存器,得到AD转换的结果
}
cpp 复制代码
#ifndef __AD_H
#define __AD_H

uint16_t AD_GetValue(void);
void AD_init(void);
#endif
cpp 复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"

uint16_t ADValue;			//定义AD值变量
float Voltage;				//定义电压变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();			//OLED初始化
	AD_init();				//AD初始化
	
	/*显示静态字符串*/
	OLED_ShowString(1, 1, "ADValue:");
	OLED_ShowString(2, 1, "Voltage:0.00V");
	
	while (1)
	{
		ADValue = AD_GetValue();					//获取AD转换的值
		Voltage = (float)ADValue / 4095 * 3.3;		//将AD值线性变换到0~3.3的范围,表示电压
		
		OLED_ShowNum(1, 9, ADValue, 4);				//显示AD值
		OLED_ShowNum(2, 9, Voltage, 1);				//显示电压值的整数部分
		OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2);	//显示电压值的小数部分
		
		Delay_ms(100);			//延时100ms,手动增加一些转换的间隔时间
	}
}
相关推荐
曾浩轩32 分钟前
跟着江协科技学STM32之4-5OLED模块教程OLED显示原理
科技·stm32·单片机·嵌入式硬件·学习
TMT星球2 小时前
CES2026科技秀收官:长虹书写“科技+文化”融合创新答卷
人工智能·科技
xiaobaishuoAI2 小时前
全链路性能优化实战指南:从瓶颈定位到极致优化
大数据·人工智能·科技·百度·geo
WX1316951899817 小时前
Fluke5720A 5725A福禄克5522A 5520A多功能校准器
科技·信息与通信·射频工程
GAOJ_K20 小时前
丝杆模组精度下降的预警信号
人工智能·科技·机器人·自动化·制造
TDengine (老段)1 天前
嘉环科技携手 TDengine,助力某水务公司构建一体化融合平台
大数据·数据库·科技·物联网·时序数据库·tdengine·涛思数据
AI科技星1 天前
能量绝对性与几何本源:统一场论能量方程的第一性原理推导、验证与范式革命
服务器·人工智能·科技·线性代数·算法·机器学习·生活
WX131695189981 天前
是德科技MSO9104A MSO9254A MSO9404A示波器
科技
WX131695189981 天前
是德科技MXR604A MXR804A MXR404A MXR254A示波器
科技·信息与通信·射频工程
VR最前沿2 天前
搜维尔科技:Teslasuit新品发布XR5集成全身触觉、动作捕捉和生物识别分析
科技