ADC与DMA

ADC与DMA

1.ADC驱动函数方法(占用ARM内核时间)

CUBEMX

VSSA 和VDDA是ADC功能的电源输入

将Rank中的Sampling Time设置为55.5Cycles[采样时间55.5个时钟周期]

int main(void){后
uint16_t a1, a2; //用于ADC数据读取的暂时变量
初始化函数后

/* USER CODE BEGIN 2 */

写代码

/* USER CODE END 2 */

HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准采样
while(1)
		a1 = ADC_IN_1(); //读取ADC1的数值,电位器
		a2 = ADC_IN_2(); //读取ADC2的数值,光敏电阻
		printf("ADC1=%04d    ADC2=%04d \r\n",a1,a2);//向USART1串口发送字符串 %04d是强制用4位十进制显示数值
		HAL_Delay(500);

adc.c
#include "adc.h"

uint16_t ADC_IN_1(void) //ADC采集程序
{
	HAL_ADC_Start(&hadc1);//开始ADC采集
	HAL_ADC_PollForConversion(&hadc1,500);//等待采集结束
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
	{
		return HAL_ADC_GetValue(&hadc1);//读出ADC数值
	}
	return 0;
}

uint16_t ADC_IN_2(void) //ADC采集程序
{
	HAL_ADC_Start(&hadc2);//开始ADC采集
	HAL_ADC_PollForConversion(&hadc2,500);//等待采集结束
	if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC))//读取ADC完成标志位
	{
		return HAL_ADC_GetValue(&hadc2);//读出ADC数值
	}
	return 0;
}

adc.h
#ifndef ADC_ADC_H_
#define ADC_ADC_H_

#include "stm32f1xx_hal.h" //HAL库文件声明
extern ADC_HandleTypeDef hadc1;
extern ADC_HandleTypeDef hadc2;

uint16_t ADC_IN_1(void);
uint16_t ADC_IN_2(void);

#endif /* ADC_ADC_H_ */

2.DMA(数据自动传递)

单路ADC

Continuous Conversion Mode [Enable]开启连续转换模式

在DMA中,添加ADC1,

priority [High]高优先级,Mode [Circular]循环模式,[勾选]Memory寄存器Date Width[Half Word]数据宽度半字

ADC传递的数值将传递到16位宽度的寄存器中

NVIC中勾选DMA1

ADC1不勾选(如果要在ADC中断回调函数中处理ADC相关工作,则勾选)
MX_DMA_Init();初始化函数应在MX_ADC1_Init();之前
初始化函数后
	HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准采样
	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&a1,1);//启动DMA,采集数据存入的变量地址,长度1
while(1)
		/*a1 = ADC_IN_1(); //读取ADC1的数值,电位器*/
		a2 = ADC_IN_2(); //读取ADC2的数值,光敏电阻
		printf("ADC1=%04d    ADC2=%04d \r\n",a1,a2);//向USART1串口发送字符串 %04d是强制用4位十进制显示数值
		HAL_Delay(500);

多路ADC

Number Of Conversion [2]通道数量为2

Rank下设置第二个通道

uint16_t dmaadc[2];//用于多路ADC数据读取的暂时数组
	HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准采样
	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&dmaadc,2);//启动DMA,采集数据存入的变量地址,长度2

while(1)

		printf("ADC1=%04d    ADC2=%04d \r\n",dmaadc[0],dmaadc[1]);//向USART1串口发送字符串 %04d是强制用4位十进制显示数值
		HAL_Delay(500);

加粗样式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值