蓝桥杯——STM32 ADC篇

本主要是关于板子上的ADC使用,板子上有ADC1和ADC2,ADC1涉及两个外设的采集,一个是模拟输出的采集,一个是MCP4017的PB14的采集电压,ADC2是对另一个模拟输出的电压采集。

ADC的采集有两种方式:

  • 直接采集,需要CPU资源
  • DMA采集,消耗资源少

 所以本篇文章也会提供两种方案,一份是ADC1双通道DMA,ADC2单通道DMA,另一份是ADC1直接采集,ADC2DMA采集,代码会上传的。

 1.cubemx的配置

1.1时钟的配置

ADC的时钟是有要求的,需要事先分频,依据手册最高不超过52M:

 cubemx里的时钟树:

 1.2 ADC1配置

先来看ADC1的,这次我们要使用两条通道(扫描模式会开启,相当于轮询这两条通道),然后开启连续转换模式,不然就会转换一次就停止,DMA也就无法一直正确搬运数据。然后就是设置各通道的采样时间之类的,具体看下面:

 时钟分频选择异步二分频,其实只要符合ADC频率要求就可以,可以参考下面这位的,他是F103的:http://t.csdnimg.cn/DUKAt

 ①和②分别使能扫描模式和连续转换模式,③必须等设置完DMA再回来使能。

再往下看,有一个叫Number of Conversion的选项,调为2,因为是两条通道嘛,这时候下面的rank会出现两个,分别设置,这个Rank的标号就是转换通道的顺序,这个顺序会影响到后面的计算顺序,④的通道是可以改变的,通过这里改变转换通道的顺序,⑤的采样时间设置的长一些,时间长采样准,可以直接拉满。

DMA的配置

 Mode一定要选Circular,数据宽度这里并没有什么限制(保证数据能装下就行),最好两边对齐。要不可能出现一些错误。

1.3 ADC2配置

除了下图没有扫描模式了(因为ADC2只用了一个通道),其余和ADC1一样:

1.4 1.2和1.3的代码

ADC_Work()是开启ADC1,2的DMA传输模式,下面两个函数是对数据处理。

void ADC_Work()
{
	HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC1_Value,40);
	HAL_ADC_Start_DMA(&hadc2,(uint32_t *)ADC2_Value,40);
}

void ADC1_processing_data()
{
	uint32_t temp[2];
	for(int i=0;i<2;i++)
	{
		for(int j=0;j<20;j++)
		{
			temp[i]+=ADC1_Value[j][i];
		}
		
	}
	ADC1_channel1_value=3.3*(temp[0]/20.0)/(1<<12);
	ADC1_channel2_value=3.3*(temp[1]/20.0)/(1<<12);
	
}

void ADC2_processing_data()
{
	uint32_t temp;
	for(int i=0;i<40;i++)
	{
		temp+=ADC2_Value[i];
	}
	ADC2_channel1_value=3.3*(temp/40.0)/(1<<12);
	
}

 ADC1的数据处理:

首先定义一个二维数组:

uint32_t ADC1_Value[20][2];

 因为二维数组在物理的存储就是这样排布的:

 所以呢,列就是两个通道,行就是每个通道的不同次的不同采集值,这样我们就可以使用均值滤波来时数据更准确。使用FOR循环将每个通道的各组数据相加求均值再÷4096(因为默认选择了12位精度)再×3.3就得到了电压值。

使用在线调试,可以看到数组如下变化,下图是ADC2的:

 1.5 另一种配置,直接采集

 这种取消了连续采集,就需要不断开启才能采集:

下面代码可以放在LCD的显示函数里,借着while不断启动ADC采集:

float ADC1_Value()
{
	 HAL_ADC_Start(&hadc1);
	uint32_t adc1_value = HAL_ADC_GetValue(&hadc1);
	return adc1_value*3.3/(1<<12);
}

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
基于模型设计(MBD)是一种软件开发方法,用于设计和开发嵌入式系统。在 STM32 系列中,MBD 是一种常见的开发方法,可以提供更高效、更灵活的开发方式。 基于模型设计的方法可以将嵌入式系统的设计过程分为两步:模型设计和代码生成。首先,通过使用 MATLAB/Simulink 等建模工具,可以将系统的功能需求、输入输出关系等设计为图形模型。模型可以包含系统的各种组件,如传感器、执行器、算法等。然后,通过适当的配置和连接,可以生成 C 代码,并上传到 STM32 微控制器中。 模型设计的主要优势在于它可以提供可视化的设计环境,使得开发者能够更直观地理解和调试系统。与传统的方法相比,这种开发方式可以加快开发速度,并降低开发和测试的成本。此外,MBD 还支持自动生成测试用例和报告,有助于提高系统质量。 在 STM32 系列中,MBD 还可以与 STM32 CubeMX 结合使用,实现代码生成和配置的无缝集成。通过 CubeMX,可以根据系统需求配置 STM32 微控制器的引脚、时钟和外设等。然后,生成的配置文件可以直接导入到模型设计工具中,用于代码生成。 综上所述,基于模型设计的方法在 STM32 系列中提供了一种高效灵活的开发方式。它可以加快开发速度,降低开发成本,并提高系统质量。对于使用 STM32 微控制器进行嵌入式系统开发的开发者来说,掌握和应用MBD方法是非常有益的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

满城烟雨DLRY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值