当前位置: 首页 > article >正文

STM32F407寄存器操作(ADC非连续扫描模式)

1.前言

书接上回,在看手册的时候我突然发现手册上还描述了另一种ADC扫描模式,即非连续扫描模式,想着连续扫描模式都已经探索过了,那就顺手把非非连续模式研究一下吧。

2.理论

我们先看看手册,这里我就以规则通道举例了

首先,我们先了解一下什么是非连续模式,这里的非连续模式指的是不在同一个周期内将所有管脚的电压全部读取完毕。手册上也给出了例子,也是比较好理解的。

然后我们再看看需要置为的寄存器,是CR1里的DISCEN和DISCNUM几位,我们看到CR1里

分别是11位,13~15位

3.程序

我先把程序放出来,这里我用的通道0、3、4、5四个通道,每次采样2个通道。

void init_adc1(unsigned char ch1,unsigned char adcm)
{init_adc12_chinal(0);	//初始化通道0init_adc12_chinal(3);	//初始化通道3init_adc12_chinal(4);	//初始化通道4init_adc12_chinal(5);	//初始化通道5ADC1->CR1&=~(3<<24);	//15 ADCCLK 周期ADC1->CR1|=(1<<8);		//扫描模式ADC1->CR1|=1<<11;			//ADC1非连续扫描模式ADC1->CR1|=1<<13;			//不连续采样通道数为2ADC1->CR2&=~(1<<1);		//单次转换ADC1->CR2&=~(1<<11);	//数据右对齐ADC1->CR2&=~(3<<28);	//禁止触发检测ADC1->SQR1&=~(0XF<<20);	//重置规则通道序重置列长度ADC1->SQR1|=3<<20;     	//4个转换在规则序列中//设置通道0的采样时间ADC1->SMPR2&=~(7<<(3*0));		//通道0	采样时间清空	  ADC1->SMPR2|=(7<<(3*0)); 		//通道0  480个周期,提高采样时间可以提高精确度//设置通道3的采样时间ADC1->SMPR2&=~(7<<(3*3));		//通道3	采样时间清空	  ADC1->SMPR2|=(7<<(3*3)); 		//通道3  480个周期,提高采样时间可以提高精确度//设置通道4的采样时间ADC1->SMPR2&=~(7<<(3*4));		//通道4	采样时间清空	  ADC1->SMPR2|=(7<<(3*4)); 		//通道4  480个周期,提高采样时间可以提高精确度//设置通道5的采样时间ADC1->SMPR2&=~(7<<(3*5));		//通道5	采样时间清空	  ADC1->SMPR2|=(7<<(3*5)); 		//通道5  480个周期,提高采样时间可以提高精确度ADC1->SQR3=0;	//重置规则通道转换配置ADC1->SQR3|=0<<0;	//设置第一次规则转换通道0ADC1->SQR3|=3<<5;	//设置第二次规则转换通道3ADC1->SQR3|=4<<10;	//设置第三次规则转换通道4ADC1->SQR3|=5<<15;	//设置第四次规则转换通道5ADC1->CR2|=1<<8;			//使能DMA模式ADC1->CR2|=1<<0;	   	//开启AD转换器	  
}

因此我们把CR1的11位置1开启非连续扫描模式,11~15位写2,表示单次采集2个通道。

同时我们的转换通道数要配置成4

然后是转换顺序,因为我们需要多次手动触发,因此在初始化阶段将转换顺序配置好即可

然后是软件触发的程序

void adc1_incontinue_scanf()
{ADC1->CR2|=1<<30;	//开始转换
}

因为单个循环转换完毕后没有事件生成,因此我们这里不做判断。理论上来说我们的转换时间也应该不是连续的,否则就用连续模式了。

4.测试

首先是主程序,按照DMA-ADC初始化顺序即可,这里我在两次扫描间加入10ms的延迟防止干扰。

int main(void)
{	Stm32_Clock_Init(336,25,2,7);//设置时钟,168MhzNVIC_SetGroup(1);//设置中断分组,分组1init_PinClock();//初始化所有时钟delay_init(168);//初始化延时init_DMAClock();//初始化DMA时钟init_DMA2_S0C0(4);	//DMA2 ADC1转换init_AllAdc();//初始化所有ADC时钟init_adc1(0,2);//初始化ADC1adc1_incontinue_scanf();//第一次扫描delay_ms(10);adc1_incontinue_scanf();//第二次扫描}

首先我们先测试是否是两次转换

程序停在两次延迟处,四个数据中前两位正常有数据了

两次触发完毕后四位数据正常了。

然后测试通道是否正常,有没有发生串扰

首先把PA4接地

第三个数据确实是0

然后我们再把PA3接地

OK,也没问题,第二个数据也是0了

5.结语

非连续扫描模式也不算难,可以说扫描模式顺带功能吧。那么OK,还是老样子,有问题评论区见,下篇文章我将介绍407多重ADC的使用方法。

http://www.lryc.cn/news/2396237.html

相关文章:

  • 生产系统中TongWeb故障应急处理办法
  • PHP学习笔记(十一)
  • PyTorch中 torch.utils.data.DataLoader 的详细解析和读取点云数据示例
  • 直线模组在手术机器人中有哪些技术挑战?
  • RK3568DAYU开发板-平台驱动开发--UART
  • ubuntu 安装 Redis 5.0.8 的完整步骤
  • 制造企业搭建AI智能生产线怎么部署?
  • 深度学习驱动的超高清图修复技术——综述
  • unix/linux source 命令,其内部结构机制
  • 【LLM】FastAPI入门教程
  • 进程同步机制-信号量机制-记录型信号量机制中的的wait和signal操作
  • gitlib 常见命令
  • Azure DevOps 管道部署系列之二IIS
  • Vue.js教学第十七章:Vue 与后端交互(一),Axios 基础
  • 人工智能浪潮下,制造企业如何借力DeepSeek实现数字化转型?
  • NodeJS全栈开发面试题讲解——P2Express / Nest 后端开发
  • 从线性代数到线性回归——机器学习视角
  • 计算机网络相关发展以及常见性能指标
  • 通义灵码:基于MCP的火车票小助手系统全流程设计与技术总结
  • 为什么建立 TCP 连接时,初始序列号不固定?
  • VBA数据库解决方案二十:Select表达式From区域Where条件Order by
  • NX753NX756美光科技闪存NX784NX785
  • 使用 pytesseract 构建一个简单 OCR demo
  • Cesium快速入门到精通系列教程三:添加物体与3D建筑物
  • git 如何解决分支合并冲突(VS code可视化解决+gitLab网页解决)
  • 【CF】Day72——Codeforces Round 890 (Div. 2) CDE1 (二分答案 | 交互 + 分治 | ⭐树上背包)
  • 单片机寄存器的四种主要类型!
  • 智能嗅探AJAX触发:机器学习在动态渲染中的创新应用
  • 【计算机网络】Linux下简单的UDP服务器(超详细)
  • Java并发编程实战 Day 3:volatile关键字与内存可见性