【蓝桥杯】嵌入式编程_ADC模块

目录

ADC基本简介

CubeMx生成ADC相关配置

keil代码移植及配置


ADC基本简介

A D C 分别代表什么?
        ADC是Analog-to-DigitalConverter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。

目的作用实际价值?
        STM32接外设,很多外设输出的是模拟量的值 而STM32本身是数字量的值 那么如何接收这些模拟量的值呢。这时候就需要一个处理器了 把采集来的模拟量转换为数字量。

模拟量是什么?

12位ADC指的是什么?
        12位是分辨率 越高越好 精度越小 电压微变就能感知

 图来源:CT117E-M4产品手册.pdf ---7.3模拟输出

可以看到上图 PB15通过跳钱 链接到 R37电阻 ,滑动电阻可以控制着PB15输出的电压值

本次模块实现的就是得出PB15与PB12的电压值

CubeMx生成ADC相关配置

1.GPIO配置

2.ADC通道配置

ADC1通道11 N11 Single-ended模式

ADC2通道15 N15 Single-ended模式

 

单通道就是连续转换模式 (会不间断地采集PB15电压) 

 可以把采样时间调大一点(据说会准确一点)  

3.添加时钟 

keil代码移植及配置

将生成的好的adc.c与头文件移植到 src目录 与 inc目录下

adc.c尾 添加代码

/* USER CODE BEGIN 1 */
​
uint16_t getADC1(void)
{
    uint16_t adc = 0;
    
    HAL_ADC_Start(&hadc1);
    adc = HAL_ADC_GetValue(&hadc1);
    
    return adc;
}
​
uint16_t getADC2(void)
{
    uint16_t adc = 0;
    
    HAL_ADC_Start(&hadc2);
    adc = HAL_ADC_GetValue(&hadc2);
    
    return adc;
}
/* USER CODE END 1 */
​记得在头文件adc.h里声明
uint16_t getADC1(void);
uint16_t getADC2(void);

这里直接获取的是电压量的是值 我们需要用转换公式将得到的adc转化成我们常见的几点几伏的形式

\frac{ADC*3.3}{4096}

由于修改时钟 记得新生成的RCC时钟配置 替换掉原有的时钟函数配置

利用lcd测试

    MX_ADC1_Init();
    MX_ADC2_Init();
void adc_proc(void)
{
//  if((uwTick-uwTick_adc)<300) return;
//  uwTick_adc = uwTick;
    
    uint16_t PB15_ADC2_R37=getADC2();
    uint16_t PB12_ADC1_R38=getADC1();
    
    sprintf(&LCD_string[0], "R37_Vol:%6.3fV",PB15_ADC2_R37*3.3/4096);//DA display
    LCD_DisplayStringLine(Line5, (uint8_t *)LCD_string);
    
    sprintf(&LCD_string[0], "R38_Vol:%6.3fV",PB12_ADC1_R38*3.3/4096);//DA display
    LCD_DisplayStringLine(Line6, (uint8_t *)LCD_string);
    
}

猜你喜欢

转载自blog.csdn.net/shelter1234567/article/details/129247851