STM32学习(3)ADC

本文讲述了ADC的基本原理以及如何使用,最后实践打开内部温度传感器读取芯片温度。

1.ADC的作用

  信号可以分成连续信号离散信号。连续信号变化缓慢,没有突变。离散信号可以只有有限几个值。连续和离散是指信号的幅度,也可以指信号的时间。可以说连续变化的信号就是模拟信号,离散变化的信号是数字信号。

  模拟信号:电路简单,分辨率高,与实际电路情况较为吻合。

  数字信号:以0,1方式存在,便于储存和交换

  因此ADC的构成了这两种信号的转换桥梁。

2.stm32中ADC的配置与使用

芯片:stm32F103C8T6

ADC为12位逐次逼近型,转换结果为2的12次方为0~4095

资源:ADC1,ADC2和10个外部输入通道(对应方式如下),以及2个内部信号源(内部温度传感器和内部参考电压)

 ADC的基本结构

配置过程:

1.开启RCC中ADC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//打开时钟
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//时钟配置,ADC如何分频

若有GPIO(注意是模拟输入)

2.选择AD转换器的规则组或注入组(并对通道,序列,采样周期进行配置)
void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);//注入通道
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);//规则通道

这里采用的是规则通道

ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_239Cycles5);

补充:注入组相当于中断,可以打断规则组,规则通道的转换结果储存在规则数据寄存器 (ADC_DR)中,所有规则通道的转换结果均共用此规则数据寄存器。

关于采样时间:ADC装换步骤(采样,保持,量化,编码)

转换总时间:采样周期(最低1.5个周期)+ 12.5ADC周期(最低要求,因为需要保持数据)

那么最低时间为14个ADC采样周期,在1中ADC周期为14MHz,那么时间最快就为1微秒了。

3.配置ADC转换器
    ADC_InitTypeDef ADC_InitStructure;
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC独立模式
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据对齐方式(右对齐直接取数据)
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不开启ADC外部触发
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//持续
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描
	ADC_InitStructure.ADC_NbrOfChannel = 1;//通道数目(没开扫描就是1)
	ADC_Init(ADC1, &ADC_InitStructure);

补充:转换方式(若单次转换,就只能手动EOC置1后再运行)

在扫描模式下,需要使用DMA来快速搬运数据,否则在下图只能拿到通道6的值了

4.对ADC上电和数据校准
    ADC_Cmd(ADC1, ENABLE);//上电
	//校准过程
	ADC_ResetCalibration(ADC1);//复位校准
	while (ADC_GetResetCalibrationStatus(ADC1) == SET);//等待复位校准
	ADC_StartCalibration(ADC1);//开始校准
	while (ADC_GetCalibrationStatus(ADC1) == SET);//等待校准
5.数据的读取
uint16_t AD_GetValue(void)
{
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//是否启动ADC转换
	while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//当转换结束信号EOC为1
	return ADC_GetConversionValue(ADC1);//返回通道最后ADC取值结果
}
3.实践(开启内部温度传感器)

在以上ADC初始化的基础代码上加以更改

1和2:选择ADC1_IN16输入通道和采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,1,ADC_SampleTime_239Cycles5);
//打开16通道和取采样时间(时间长,数据比较稳定)

3.唤醒温度传感器
ADC_TempSensorVrefintCmd(ENABLE);//启用或禁用温度传感器和Vrefint通道。

4.设置ADON位启动ADC

ADC_Cmd(ADC1, ENABLE);
5.读取模拟值转化为电压值再转为温度值

得知V25Avg_Slope的平均取值

  因此在main函数中

ADValue = AD_GetValue();//同前面的ADC数据的读取构建函数
Voltage = (float)ADValue / 4095 * 3.3;//转换电压
temp = (1.43 - Voltage)/0.043 + 25;//转为温度

 最后利用oled显示屏就可以读取相应温度了(最好在采取AD数据进行数据处理一波,取平均啥的)。

  

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置STM32F103的ADC3,可以按照以下步骤进行操作: 1. 首先,包含头文件"adc.h",并定义ADC的检测采样和显示变量。 2. 设置ADC的模式为独立模式,扫描模式为使能,连续模式为使能,外部触发转换方式为软件触发,数据对齐方式为右对齐,通道数为2个通道。 3. 使用ADC_Init函数来初始化ADC1,传入ADC1的配置结构体ADC1_InitStructure。 4. 配置ADC的中断,注意ADC1和ADC2共用同一个中断向量,而ADC3有自己的中断向量。规则和注入组转换结束时能产生中断,当模拟看门狗状态位被设置时也能产生中断。它们都有独立的中断使能位。 以上是配置STM32F103的ADC3的步骤。 #### 引用[.reference_title] - *1* [STM32F103三路ADC同步转换带有DMA功能](https://blog.csdn.net/qq_38664794/article/details/82917230)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32F03学习笔记之ADC配置(含DMA配置)](https://blog.csdn.net/qq_26918203/article/details/107641424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值