蓝桥杯嵌入式学习————USART、ADC

本文介绍了在蓝桥杯嵌入式学习中,关于串口(USART)和模拟数字转换器(ADC)的使用。重点讲解了如何配置GPIO为模拟输入模式,以及ADC_RegularChannelConfig函数的参数含义,强调了在多通道采集和DMA应用中的作用。

串口

直接上代码吧

void USART_Config(void)
{
   
   
    GPIO_InitTypeDef  GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    //开启串口时钟

    //设置usart2 tx引脚工作模式PA2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //设置usart2 rx引脚工作模式PA3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	
    //usart2 工作模式配置
    USART_InitStructure.USART_BaudRate = 19200;    //波特率
    USART_InitStructure
### 蓝桥杯嵌入式 ADC 实现教程与示例代码 #### 一、ADC 的基本原理 模数转换器(Analog-to-Digital Converter, ADC)用于将模拟信号转化为数字信号。在蓝桥杯嵌入式的比赛场景中,通常会涉及通过 STM32 或其他微控制器读取外部传感器的电压值并将其数字化处理[^1]。 以下是基于 STM32 平台的一个简单 ADC 数据获取函数 `getADC`: ```c #include "badc.h" double getADC(ADC_HandleTypeDef *pin) { double adc_value; HAL_ADC_Start(pin); adc_value = HAL_ADC_GetValue(pin); return (adc_value * 3.3) / 4096.0; // 将 ADC 数字量转为实际电压值 } ``` 此函数实现了单次采样的功能,并返回对应的电压值。 --- #### 二、均值滤波的应用 为了减少噪声干扰,在某些题目中需要对 ADC 获取的数据进行平滑处理。一种常见的方法是 **均值滤波**,即多次采集数据后计算其平均值作为最终结果[^2]。 下面是一个完整的均值滤波实现代码: ```c uint8_t ADC_collect_times = 10; // 定义每次采集的次数 uint32_t Adc_num_all = 0; // 存储所有采集到的数值之 uint32_t Adc_Volt = 0; // 最终得到的电压值 void ADC_filter(void) { for (int i = 0; i < ADC_collect_times; i++) { Adc_num_all += getADC(&hadc); // 调用上述定义的 getADC 函数 HAL_Delay(10); // 可选延迟时间,视具体需求而定 } Adc_num_all /= ADC_collect_times; // 计算平均值 Adc_Volt = ((float)(Adc_num_all * 3.3)) / 4096; // 转换为实际电压 Adc_num_all = 0; // 清零以便下次重新采集 } ``` 这段代码展示了如何利用循环结构完成多点采样以及后续的均值运算过程。 --- #### 三、综合应用实例——结合串口通信 在一些竞赛题目中,不仅要求选手能够正确配置 ADC 进行数据采集,还需要进一步通过 UART 接口发送这些数据给上位机显示或存储[^3]。以下给出一个简化版的例子来说明这一流程: ```c // 初始化部分省略... void main() { while (1) { ADC_filter(); // 执行均值滤波算法 char buffer[50]; sprintf(buffer, "%d\r\n", Adc_Volt); // 将整型变量格式化成字符串形式 HAL_UART_Transmit(&huart1, (uint8_t *)buffer, strlen(buffer), HAL_MAX_DELAY); HAL_Delay(500); // 设置适当的时间间隔防止过快传输造成丢包现象 } } ``` 该程序片段连续不断地执行 ADC 滤波操作并将结果经由 USART 发送至上位机终端界面展示出来。 --- ### 总结 以上分别介绍了针对单一采样点的直接转化方式及其改进版本—带有抗噪能力的均值滤波技术;最后还探讨了一个典型应用场景下的软硬件协同工作模式。希望这能帮助参赛者更好地理解并掌握相关技能以应对未来可能出现的各种挑战!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值