基于AT32(STM32)单片机的模块化代码之——ADC代码模块化

基于AT32(STM32)单片机的模块化代码之——ADC代码模块化

1.环境介绍

平台:AT32F415单片机,雅特力公司的AT32系列单片机其实跟STM32系列单片机大同小异,包括库函数等基本都是一样的,所以这款代码无论是AT32还是STM32都是适用的。
开发环境:MDK V5 for arm
简介:在实际的项目开发中,经常会用到多路ADC检测,所以特意在32的库函数之上做了2次封装,形成一个模块化的代码,以便于下次项目便捷开发

2.代码模块化思路

2.1在adc.h文件中枚举用到的adc通道

typedef enum
{
	ADC1_CHAN2, 
	ADC1_CHAN4,
	ADC1_CHAN1,
	ADC1_CHAN5,
	ADC1_CHAN11, 
	ADC1_CHAN10, 
	NUM_ADC1CHN
}ENUM_ADC1CHN;

typedef enum
{
	//如果有用到ADC2的检测通道,在后面添加枚举类型变量即可
	ADC2_CHAN1=NUM_ADC1CHN,	
	//...
	//..
	NUM_ADCCHN
}ENUM_ADC2CHN;

#define NUM_ADC2CHN (NUM_ADCCHN-NUM_ADC1CHN)

#if(NUM_ADC2CHN)
	#define NUM_ADC    2
#else 
	#define NUM_ADC    1
#endif

因为现在用到的这个型号的单片机有两组ADC,所以特意根据用到的adc不同,对枚举类型做了区分

2.2 将每个adc通道的实际用途进行映射

//ADC通道配置,将ADC通道与实际功能应用的对应上

//added by zhl 2020/6/30 for v1.01
#define ADC_CHNTEMP1      ADC1_CHAN5
#define ADC_CHNTEMP2      ADC1_CHAN1

#define ADC_CHNCURRE1      ADC1_CHAN10
#define ADC_CHNCURRE2      ADC1_CHAN11

#define ADC_CHNERR1        ADC1_CHAN4
#define ADC_CHNERR2         ADC1_CHAN2

这样,当在app逻辑层需要对哪个adc通道进行操作时,直接用ADC_CHNTEMP1 这些宏定义去获取,这样就做到了bsp层和app层的分离,后续adc通道有变动时,只需要在bsp层进行修改,其它其它地方都不用动,方便又省事。

2.3在adc.c文件中定义几个全局变量,用来做配置和数据存储功能

/

/定义存放ADC转换结果的数组
u16 gu16_ADCResult[NUM_ADCCHN]={0,0,0,0,0,0}; 

//项目中各个ADC通道引脚对应关系
//AD1_IN2:PA
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于STM32单片机的水位传感器代码示例,使用ADC(模数转换器)来读取水位传感器的模拟值,并将其转换为实际的水位数据。请注意,这只是代码的基本框架,您需要根据您使用的具体传感器和硬件配置进行适当的调整。 ```c #include "stm32f4xx.h" // 定义ADC通道和引脚 #define ADC_CHANNEL ADC_Channel_0 #define ADC_PIN GPIO_Pin_0 #define ADC_GPIO_PORT GPIOA #define ADC_GPIO_CLK RCC_AHB1Periph_GPIOA ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; void ADC_Configuration(void) { // 使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHB1PeriphClockCmd(ADC_GPIO_CLK, ENABLE); // 配置ADC引脚为模拟输入模式 GPIO_InitStructure.GPIO_Pin = ADC_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(ADC_GPIO_PORT, &GPIO_InitStructure); // 配置ADC参数 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); // 配置ADC通道 ADC_RegularChannelConfig(ADC1, ADC_CHANNEL, 1, ADC_SampleTime_15Cycles); // 使能ADC ADC_Cmd(ADC1, ENABLE); // 校准ADC ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1) != RESET) {} // 启动ADC转换 ADC_SoftwareStartConv(ADC1); } int main(void) { // 初始化系统时钟等 // 配置ADC ADC_Configuration(); while (1) { // 等待ADC转换完成 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) {} // 读取ADC值 uint16_t adcValue = ADC_GetConversionValue(ADC1); // 根据传感器的特性和电压-水位关系计算水位数据 // 执行其他操作,例如将水位数据发送到其他设备或执行相应的控制操作 // 延时等待下一次转换 delay_ms(1000); } } ``` 在这个例子中,我们使用了STM32ADC模块来读取水位传感器的模拟值。首先,我们需要配置ADC通道和引脚,以及初始化ADC参数。然后,在主循环中,我们等待ADC转换完成,并读取转换后的ADC值。根据传感器的特性和电压-水位关系,您需要进行适当的计算来将ADC值转换为实际的水位数据。最后,您可以执行其他操作,例如将水位数据发送到其他设备或执行相应的控制操作。请注意,您可能需要根据您使用的具体传感器和硬件配置对代码进行适当的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值