STM32外设:信号转换器 ADC、DAC

时间:2024-02-19 16:35:01

主要外设:

  • ADC:Analog to Digital Converter 模数转换器
  • DAC:Digital to Analog Converter 数模转换器

ADC_IN`

主要功能:测外部引脚的电压

数据通路:每个ADC有多个外部引脚、少量内部引脚
引脚ADC_IN→GPIO AF→GPIO输入电路→规则通路→

ADC的转换原理

  • 主要有逐次逼近型、双积分型、电压频率转换型
  • stm32内部集成ADC:逐次逼近型ADC

`传感器→运放→模拟信号→多路模拟开关→采样保持→AD转换器→数字信号→IO引脚

ADC的通道

  • 各通道的A/D转换可以单次、连续、扫描或间断模式执行
  • 分为:规则通道组(正常程序)、注入通道(中断)

ADC数据对齐

  • AD转换后存储数据的对齐方式(大小端)

触发ADC转换方式

  • 软件触发
  • 外部事件(如定时器事件、 EXTI 中断事件)触发转换:禁止、上升沿、下降沿、双边沿触发

‍STM32部分型号芯片具有VREF+、 VREF-参考电压引脚。而且,参考电压必须低于VDDA电压。
VREF+ 与 VDDA通过0Ω电阻连接,同样,VREF- 与 VDDS也要通过0欧电阻连接。

在STM32引脚处的状态即为浮空状态,读取出来的电压就是一个不确定值(通常为1/2VDD电压)。

PCLK2→APB2
PCLK2→预分频系数CCR 的ADCPRE→ADCCLK→倍频系数SMPR→ADC采样时间

  • 数字接口时钟(APB2):用于寄存器读/写访问,每个ADC独立使能

  • 模拟电路时钟(ADCCLK)用于ADC转换部分模拟电路,所有ADC共用

  • ADC采样时间:进行一次AD转换花费的时间

  • ADC分辨率:CR1的RES位,分辨率越低转换所需周期数(下图含最小采样时间)越少
    12bit(最少15个ADCCLK周期)
    10bit(最少13个ADCCLK周期)
    8bit(最少11个ADCCLK周期)
    6bit(最少9个ADCCLK周期)

  • AD转换:将电压平均分成若干段,最终电压会转换成一个数:3.3v/分辨率=测量电压/测量数值 → 所以测量电压值=3.3v/分辨率*测量数值

  • 分辨率越高越好,转换需要花费时间会边长,如12bit的分辨率为 2^12=4096 所以测量精度为3.3v/4096=0.8mv

  • stm32绝大多数型号支持12bit、少数高端型号支持最高16bit
    ADC的3种中断

  • 规则转换与注入转换结束、模拟看门狗事件、DMA请求

硬件设计

将PA0(ADC1_IN0)与+3V3引脚或GND引脚相连接

CubeMX的配置

  1. 引脚分配:
    Pinout View:自动分配PA0为ADC1的第0输入通道

2.外设配置:
Analog→ADC1→模式→勾选IN0
Analog→ADC1→参数设置(ADC设置)→预分频=PCLK2的4分频、分辨率12bit(15ADC时钟周期)、数据对齐=右对齐
Analog→ADC1→参数设置(ADC规则通道模式)→channel=channel0、采样时间=480cycles

用户代码

//USBR CODE3:后台程序(无限循环)
HAL_ADC_Start(&hadc1);//启动ADC转换
HAL_ADC_PollForConversion(&hadc1,10);//等待转换完成 10ms超时
uint32_t AD_Value=HAL_ADC_GetValue(&hadc1);
printf("ADC1_IN0 ADC值:%d,电压值%.4fV.\n",AD_Value,(double)AD_Value/4096*3.3);
HAL_Delay(1000);

ADC:温度传感器通道

主要功能:测量MCU内部温度

数据通路:
片内温度传感器、VREFINT内部参考电压、VBAT→规则通路→

Avg_Slope=-(V25-Vsensor)/(25-Tsensor)

  • Avg_Slope为电压和温度的变化的平均斜率的绝对值、V25为内部温度25℃时的典型电压值
  • 通过查询数据手册可知:V25 = 0.76V Avg_Slope = 2.5 mV/°C

CubeMX的配置

  1. 引脚分配:
    Pinout View:无

2.外设配置:
Analog→ADC1→模式→勾选Temperature sensor channel
Analog→ADC1→参数设置(ADC设置)→预分频=PCLK2的4分频、分辨率12bit(15ADC时钟周期)、数据对齐=右对齐
Analog→ADC1→参数设置(ADC规则通道模式)→channel=channel Temperature sensor、采样时间=480cycles

用户代码

//USBR CODE3:后台程序(无限循环)
HAL_ADC_Start(&hadc1);//启动ADC转换
HAL_ADC_PollForConversion(&hadc1,10);//等待转换完成 10ms超时

uint32_t ADC_value=HAL_ADC_GetValue(&hadc1);
double ADC_voltage=(double)ADC_value/4096*3.3;
printf("ADC值:%d,电压值%.4fV.\n",ADC_value,ADC_voltage);
printf("MCU Internal Temperature=%.2f ℃\r\n",(0.76 - ADC_voltage)/0.0025 + 25);

HAL_Delay(1000);

DAC

硬件设计

STM32 F411不支持DAC

CubeMX的配置

  1. 引脚分配:
    Pinout View:无

2.外设配置:
Analog→DAC→模式→勾选OUT1 Configuration
Analog→DAC→参数设置(DAC out1设置)→输出缓冲disable、触发None

用户代码

HAL_DAC_Start(&hdac,DAC_CHANNEL_1);   //开启DAC通道1
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,200);  //设置初始值为200,对应电压为200/4096*3.3V