IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 ADC多通道采集 -> 正文阅读

[嵌入式]STM32 ADC多通道采集

ADC多通道采集(阻塞模式、ADC_DMA模式)

ADC多通道采集(阻塞模式)

1、时钟源配置
在这里插入图片描述

2、配置RCC时钟(选择第三个选项 Crystal/Ceramic Resonator 晶体/陶瓷谐振器 )
在这里插入图片描述
3、配置一个LED灯,在程序编写中让它闪烁代表程序没有死机。
在这里插入图片描述
4、设置调试模式,我们选择SW
在这里插入图片描述
5、设置串口,因为我们的程序采集到了adc的数值之后会发送到串口调试助手上,证明ADC采集是否成功。选择异步模式、波特率是默认的115200.其他配置也是默认的
在这里插入图片描述
6、配置ADC。这里我选择的两个通到采集,分别是PA0、PA1.主要是配制成:扫描模式、连续转换模式、间断模式、
在这里插入图片描述
设置为2个通道
采用软件触发方式启动采集
2个通道各自的参数设置
在这里插入图片描述

7、优先级设置高一点,怕的中断其他干扰在这里插入图片描述
下面是主要的代码 。

// 串口重定向和ADC采集的代码
int fputc(int ch, FILE *f)        //    串口重定向
 {	 
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
   return ch;
 }
uint16_t Get_adc()
{
    //开启ADC1
  HAL_ADC_Start(&hadc1);
    //等待ADC转换完成,超时为100ms
    HAL_ADC_PollForConversion(&hadc1,100);
    //判断ADC是否转换成功
    if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)){
         //读取值
       return HAL_ADC_GetValue(&hadc1);
    }
    return 0;
}

下面是while循环的代码

        HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
		HAL_Delay(1000);
		for(uint8_t i=0;i<2;i++)
		{	
			ADC_Value[i]=Get_adc();//分别存放通道1、2的ADC值
		}
		for(uint8_t i=0;i<2;i++)
		{	
			printf("ADC通道%d,:%.4f V\r\n",i,(ADC_Value[i]*3.3/4096));
		}

ADC多通道采集(DMA模式)

配置基本上与阻塞模式的相同,除了ADC的设置外。
在这里插入图片描述
在这里插入图片描述
DMA配置

mode:模式

Normal:正常模式,当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次

Circular: 循环模式,传输完成后又重新开始继续传输,不断循环永不停止

data width:数据宽度

byte:字节,通用8位,与u8相同

word:字长,与硬件的位数相同,STM32是32位,所以对应是u32

Half Word:半个字长,所以对应是u16

Memory打钩表示存储ADC值的内存地址(数组)会自增

1、我们在设置了DMA传输数据,就要取消ADC转换完成中断。
在这里插入图片描述
2、代码的思想。是在while中调用启动函数,待ADC采集及DMA传输完成之后。我们在DMA传输完成中断服务函数中把采集到的职打印到串口上。

int fputc(int ch, FILE *f)    //     串口重定向
 {	 
	 HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
   return ch;
 }
#define ADC_MAX_NUM 2 
 
uint16_t ADC_Values[ADC_MAX_NUM]={0};
 
//启动函数,需要在main中调用一次
void ADC_DMA_caiji()
{
    
    //启动DMA
  HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Values,ADC_MAX_NUM);
    
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)//DMA采集完成中断服务函数
{
	printf("烟雾%d\r\n",ADC_Values[0]);
	printf("光电%d\r\n",ADC_Values[1]);
	
	HAL_ADC_Stop_DMA(&hadc1);//关闭DMA的ADC采集
}

下面是在while中的代码

		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
		ADC_DMA_caiji();
		HAL_Delay(2000);//采集速度太快,加了2s的延时。

2、成果展示
在这里插入图片描述
写的不好,请多多见谅。有问题的可以联系我修改。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:35:52  更:2022-05-05 11:40:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:50:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码