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,手动增加一些转换的间隔时间
	}
}
相关推荐
千里念行客2401 小时前
国产射频芯片“小巨人”昂瑞微今日招股 拟于12月5日进行申购
大数据·前端·人工智能·科技
千里念行客2401 小时前
昂瑞微将于12月2日初步询价 助推国产射频芯片自主创新
人工智能·科技·社交电子·api·电子
河北瑾航科技14 小时前
广西水资源遥测终端 广西水利遥测终端 广西用水监测遥测终端 河北瑾航科技遥测终端机HBJH-B01说明书
网络·科技·水文遥测终端机·遥测终端机·广西水资源遥测终端机·广西水利遥测终端·广西用水终端
千里念行客2402 天前
昂瑞微正式启动科创板IPO发行
人工智能·科技·信息与通信·射频工程
整列机厂家-东莞唯思特2 天前
破解喷涂治具精准上料难题:唯思特整列机在汽车零部件行业的创新应用实录
科技·自动化·制造
wanhengidc3 天前
云手机性能如何?
运维·服务器·科技·智能手机·云计算
N***73853 天前
DevOps在金融科技中的安全合规
科技·金融·devops
天庭鸡腿哥3 天前
吾爱3年前的作品,依旧流批!
科技·microsoft·visual studio·everything
他来自江湖3 天前
西南科技大学,研究生开题报告latex模板
科技·latex·开题报告·西南科技大学