进阶——第十六届蓝桥杯嵌入式熟练度练习(ADC模数转换)

在adc.c中构建ADC值获取函数

uint16_t getadc2(void)
{
    uint16_t adc=0;
	HAL_ADC_Start(&hadc2);
    adc=HAL_ADC_GetValue(&hadc2);
    return adc;
}
uint16_t getadc1(void)
{
    uint16_t adc=0;
	HAL_ADC_Start(&hadc1);
    adc=HAL_ADC_GetValue(&hadc1);
    return adc;
}
  • 首先定义了一个无符号 16 位整数变量 adc 并初始化为 0。
  • 调用 HAL_ADC_Start(&hadc1/2) 启动 ADC2 开始转换操作,hadc1/2 应该是一个已经初始化好的 ADC 句柄,代表 ADC2 外设。
  • 接着调用 HAL_ADC_GetValue(&hadc1/2) 获取 ADC1/2 转换后的值,并将其赋值给 adc 变量。
  • 最后返回 adc 的值。
uint16_t 作为返回值类型的原因

对于 getadc1 函数,使用 uint16_t 作为返回值类型,通常是因为该函数的主要目的是获取并返回 ADC(模数转换器)转换得到的结果,而 ADC 转换的结果一般是一个无符号的 16 位整数。

 在adc.h声明

/* USER CODE BEGIN Prototypes */
uint16_t getadc2(void);
uint16_t getadc1(void);
/* USER CODE END Prototypes */

 在main.c中adc校准

HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED); 
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);

这两行代码调用了 HAL_ADCEx_Calibration_Start 函数,分别对 hadc1 和 hadc2 所代表的 ADC(模数转换器)外设进行校准操作。校准操作对于提高 ADC 转换结果的准确性非常重要,特别是在对测量精度要求较高的应用场景中。

函数参数及含义
  • HAL_ADCEx_Calibration_Start 函数:这是 STM32 HAL 库中用于启动 ADC 校准功能的函数。
  • &hadc1 和 &hadc2:这是传递给函数的参数,分别是指向 ADC_HandleTypeDef 类型结构体变量 hadc1 和 hadc2 的指针。hadc1 和 hadc2 代表了不同的 ADC 实例,通过这两个句柄可以对相应的 ADC 外设进行配置和操作。
  • ADC_SINGLE_ENDED:这也是传递给函数的参数,表示校准模式为单端输入模式。在单端输入模式下,ADC 测量的是输入信号相对于地的电压值。

 在main.c中变量声明

double volt_R37;
double volt_R38;

这两行代码声明了两个 double 类型的变量 volt_R37 和 volt_R38。在 C 语言里,double 是一种用于表示双精度浮点数的数据类型,它能够存储比 float 类型更精确、范围更大的小数数值。volt_R37 和 volt_R38 用于存储与电阻 R37 和 R38 相关的电压值。

在main.c中通过LCD显示

void lcd_proc(void)
{
	volt_R37=getadc2()*3.3/4096;
	volt_R38=getadc1()*3.3/4096;
    sprintf(buf,"      R37:%.2fv     ",volt_R37);
	LCD_DisplayStringLine(Line4,(uint8_t*)buf);
	sprintf(buf,"      R38:%.2fv     ",volt_R38);
	LCD_DisplayStringLine(Line5,(uint8_t*)buf);
}

// 从 ADC2 获取转换值,并将其转换为对应的电压值存储到 volt_R37 中

// 假设 ADC 为 12 位,满量程为 3.3V,所以将 ADC 值乘以 3.3 再除以 4096(2^12)得到电压值

// 从 ADC1 获取转换值,并将其转换为对应的电压值存储到 volt_R38 中

// 使用 sprintf 函数将 volt_R37 的值格式化为字符串,保留两位小数,并存储到 buf 数组中

// 调用 LCD_DisplayStringLine 函数,将格式化后的字符串显示在 LCD 的第 4 行

// 使用 sprintf 函数将 volt_R38 的值格式化为字符串,保留两位小数,并存储到 buf 数组中

// 调用 LCD_DisplayStringLine 函数,将格式化后的字符串显示在 LCD 的第 5 行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值