前言
STM32F429IGT6 有 3 个 ADC,每个 ADC 有 12 位、10 位、8 位和 6 位可选,每个 ADC 有 16 个
外部通道。另外还有两个内部 ADC 源和 VBAT 通道挂在 ADC1 上。ADC 具有独立模式、双重模
式和三重模式,对于不同 AD 转换要求几乎都有合适的模式可选。ADC 功能非常强大,具体的
我们在功能框图中分析每个部分的功能
一、ADC 功能框图剖析
掌握了 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] 位内。
四、硬件设计
贴片滑动变阻器的动触点通过一个跳帽连接至 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模块功能强大且灵活,可以方便地实现电压采集功能。不同的应用场景可以根据需求进行相应的配置和设置。