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,手动增加一些转换的间隔时间
	}
}
相关推荐
GAOJ_K8 小时前
滚珠花键的无预压、间隙调整与过盈配合“场景适配型”
人工智能·科技·机器人·自动化·制造
朗宇芯工控12 小时前
注塑机械手控制系统的性能要求有哪些?
科技·自动化·制造·工业·运动控制系统
cd_9492172116 小时前
九昆仑低碳科技:所罗门群岛全国森林碳汇项目开发合作白皮书
大数据·人工智能·科技
yuankoudaodaokou16 小时前
高校科研新利器:思看科技三维扫描仪助力精密研究
人工智能·python·科技
changyunkeji18 小时前
长云科技机动绞磨
经验分享·科技
changyunkeji19 小时前
电缆敷设机就找长云科技
经验分享·科技
永霖光电_UVLED20 小时前
新唐科技发布 379 nm、1W 紫外激光二极管
科技
焦耳热科技前沿20 小时前
西安科技大学Ceram. Int.:1200°C,20秒焦耳热制备高熵材料,实现创纪录电磁波衰减
人工智能·科技·自动化
广州灵眸科技有限公司20 小时前
EASY EAI灵眸科技聚势瑞芯微AI软件生态大会
人工智能·科技
ws20190720 小时前
从“面子”到“里子”的变革——AUTO TECH China 2026 广州展,引领汽车内外饰新纪元
人工智能·科技·汽车