STM32-ADC-电压采集


前言


STM32F429IGT6 有 3 个 ADC,每个 ADC 有 12 位、10 位、8 位和 6 位可选,每个 ADC 有 16 个
外部通道。另外还有两个内部 ADC 源和 VBAT 通道挂在 ADC1 上。ADC 具有独立模式、双重模
式和三重模式,对于不同 AD 转换要求几乎都有合适的模式可选。ADC 功能非常强大,具体的
我们在功能框图中分析每个部分的功能

一、ADC 功能框图剖析

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
掌握了 ADC 的功能框图,就可以对 ADC 有一个整体的把握,在编程的时候可以做到了然如胸,不会一知半解。框图讲解采用从左到右的方式,跟 ADC 采集数据,转换数据,传输数据的方向大概一致

二、输入通道

我们确定好 ADC 输入电压之后,那么电压怎么输入到 ADC?这里我们引入通道的概念,STM32 的
ADC 多达 19 个通道,其中外部的 16 个通道就是框图中的 ADCx_IN0、ADCx_IN1…ADCx_IN5。 这 16 个通道对应着不同的 IO 口,具体是哪一个 IO 口可以从手册查询到。其中 ADC1/2/3 还有
内部通道:ADC1 的通道 ADC1_IN16 连接到内部的 VSS,通道 ADC1_IN17 连接到了内部参考
电压 VREFINT 连接,通道 ADC1_IN18 连接到了芯片内部的温度传感器或者备用电源 VBAT。ADC2
和 ADC3 的通道 16、17、18 全部连接到了内部的 VSS。
在这里插入图片描述

三、数据寄存器

一切准备就绪后,ADC 转换后的数据根据转换组的不同,规则组的数据放在 ADC_DR 寄存器,
注入组的数据放在 JDRx。如果是使用双重或者三重模式那规矩组的数据是存放在通用规矩寄存
器 ADC_CDR 内的。
规则数据寄存器 ADC_DR
ADC 规则组数据寄存器 ADC_DR 只有一个,是一个 32 位的寄存器,只有低 16 位有效并且只是
用于独立模式存放转换完成数据。因为 ADC 的最大精度是 12 位,ADC_DR 是 16 位有效,这样
允许 ADC 存放数据时候选择左对齐或者右对齐,具体是以哪一种方式存放,由 ADC_CR2 的 11
位 ALIGN 设置。假如设置 ADC 精度为 12 位,如果设置数据为左对齐,那 AD 转换完成数据存
放在 ADC_DR 寄存器的 [4:15] 位内;如果为右对齐,则存放在 ADC_DR 寄存器的 [0:11] 位内。

四、硬件设计

提示:这里对文章进行总结例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
贴片滑动变阻器的动触点通过一个跳帽连接至 STM32 芯片的 ADC 通道引脚。当我们使用旋转
滑动变阻器调节旋钮时,其动触点电压也会随之改变,电压变化范围为 0~3.3V,亦是开发板默
认的 ADC 电压采集范围。

五、软件设计

#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "uart.h"
#include "adc.h"

int couter = 0;
uint8_t key1;
uint8_t key2;

int8_t color = 0;
uint32_t time = 500;
uint32_t system_time = 0;
float voltage;
extern uint16_t adc_value ;//保存ADC转换得到的数据


//编写中断服务函数
void EXTI0_IRQHandler()
{
		if(EXTI_GetITStatus(EXTI_Line0) !=RESET)//证明触发了中断
		{
			//控制灯进行颜色切换
			time+= 100;
			//清除中断标记
			EXTI_ClearITPendingBit(EXTI_Line0);
		}
    
}
void EXTI15_10_IRQHandler()
{
		if(EXTI_GetITStatus(EXTI_Line13) !=RESET)//证明触发了中断
		{
			time-=10000;
			//清除中断标记
			EXTI_ClearITPendingBit(EXTI_Line13);
		}
    
}


int main(void)
{
		//初始化串口 USART1
		//因为要用到PA9和PA10 所以先初始化IO口
	
		GPIO_InitTypeDef gpio_info;
		
    LED_init();
    key1_init();
    key2_init();
		Delay_init();
		UART_init(115200);
		ADC_init();
		
		//初始化蜂鸣器时钟 PI11
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
	
    gpio_info.GPIO_Mode = GPIO_Mode_OUT;
    gpio_info.GPIO_OType = GPIO_OType_PP;
    gpio_info.GPIO_Pin = GPIO_Pin_11;
    gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
    gpio_info.GPIO_Speed = GPIO_Low_Speed;
    GPIO_Init(GPIOI,&gpio_info);
		
		
    while(1)
    {
				voltage = (adc_value * 3.3f) / 4096.0f; // 4096是12位ADC的最大数值
				printf("dy: %.2f \n", voltage);
				//ADC的值
				//printf("%d\r\n",adc_value);
				Delay_ms(100);
    }
}

用 USB 线连接开发板“USB 转串口”接口跟电脑,在电脑端打开串口调试助手,把编译好的程
序下载到开发板。在串口调试助手可看到不断有数据从开发板传输过来,此时我们旋转电位器改
变其电阻值,那么对应的数据也会有变化。

六、总结

电压采集是ADC常见的应用之一。下面是对STM32-ADC-电压采集的总结:
ADC通道选择:STM32的ADC模块可以支持多个通道的采集,可以通过设置寄存器来选择需要采集的通道。不同的芯片型号可能支持的通道数不同。
参考电压选择:ADC采集模拟信号时需要一个参考电压,通常通过设置寄存器来选择内部或外部参考电压。一般来说,内部参考电压稳定性较好,但电压范围较窄;外部参考电压电压范围较大,但稳定性较差。
ADC精度设置:ADC可以设置不同的分辨率,即采样位数。常见的精度设置有8位、10位、12位等。精度越高,转换结果的精确度越高,但转换速度可能较慢。
ADC采样速度设置:ADC转换需要一定的时间,可以通过设置寄存器来调整转换速度。一般来说,转换速度越快,ADC的功耗越高。
ADC触发方式:可以通过软件或硬件触发来启动ADC转换。硬件触发可以是外部信号触发,比如定时器或外部中断信号。
数据对齐方式:ADC转换后的结果可以选择左对齐或右对齐。左对齐结果位数不变,但数值可能需要放大;右对齐结果位数可能减少,但数值可能需要缩小。
中断和DMA:ADC转换完成后,可以通过中断或DMA方式将转换结果传输到内存。中断方式适用于低速采集,而DMA方式适用于高速连续采集。
电压测量计算:采集到的电压值与ADC转换结果之间存在一定的线性关系,可以通过一些计算公式将ADC转换结果转换为真实电压值。
总的来说,STM32的ADC模块功能强大且灵活,可以方便地实现电压采集功能。不同的应用场景可以根据需求进行相应的配置和设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值