STM32双路ADC注入通道和规则通道采样

这篇具有很好参考价值的文章主要介绍了STM32双路ADC注入通道和规则通道采样。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

电机控制使用四路注入通道采集,参考ST官方库,使用定时器10us触发一次,使用ADC1和ADC2各2路注入通道。

需要一路ADC进行规则采样油门信号,使用中断的话会和注入通道中断放在同一个函数里面 ,我不喜欢,所以使用了DMA中断。

PreKnowledge:

规则通道:最多16个规则通道,采样数据存储ADCx-->DR

注入通道:最多4个注入通道,采样数据存储ADCx-->JDR。注入通带顾名思义是在规则通道转换中插队的通道。在规则通道转换的时候有注入通道的信息进来,则先将注入通道转换结束再回到规则通道,所以注入通道只有在规则通道存在时才会出现。

DMA通道:DMA转换注入通道还是规则通道,外设地址进行不同设置就行。还有一个,就是DMA只有在规则通道转换结束的时候才会被触发,记不清在哪篇博客里面看到的了,但是官方文档中没找到这句话。

使用芯片:STM32F103C8T6    软件:keil5

1.ADC设置

    ADC_InitTypeDef ADC_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 |RCC_APB2Periph_ADC2, ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);  		//ADC时钟=(晶振频率/分频)72Mhz/6 = 12Mhz
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_RegInjecSimult; 	//混合的同步规则和注入
	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;   //规则组的外部触发  关闭
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfChannel = 1;                    //规则组通道数量
	ADC_Init(ADC1, &ADC_InitStructure);

	ADC_InitStructure.ADC_NbrOfChannel = 2;
	ADC_Init(ADC2, &ADC_InitStructure);            //ADC2的规则通道,因为使用ADC2的注入通道
	
	ADC_RegularChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_71Cycles5);					//ADC1规则通道设置,ADC1的规则通道使用所以配置,ADC2的规则通道实际上没有使用
	ADC_Cmd(ADC1, ENABLE);
	ADC_Cmd(ADC2, ENABLE);
	
	ADC_ResetCalibration(ADC1);
	ADC_ResetCalibration(ADC2);
	while(ADC_GetResetCalibrationStatus(ADC1) & ADC_GetResetCalibrationStatus(ADC2)) ;
	
	ADC_StartCalibration(ADC1);
	ADC_StartCalibration(ADC2);
	while(ADC_GetCalibrationStatus(ADC1) & ADC_GetCalibrationStatus(ADC2)) ;
	
/******************************注入通道配置*************************/	
	ADC_InjectedSequencerLengthConfig(ADC1, 2);
    ADC_InjectedSequencerLengthConfig(ADC2, 2);
	
	ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_7Cycles5);			
	ADC_InjectedChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_7Cycles5);
    ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_7Cycles5);
	ADC_InjectedChannelConfig(ADC2, ADC_Channel_3, 2, ADC_SampleTime_7Cycles5);

/******************************外部触发源设置**************************************/
	ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_T1_CC4); 						
	ADC_ExternalTrigInjectedConvConfig(ADC2, ADC_ExternalTrigInjecConv_T1_CC4);
	
	ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);		//注入使能
    ADC_ExternalTrigInjectedConvCmd(ADC2, ENABLE);
	ADC_ClearITPendingBit(ADC1, ADC_IT_JEOC);        
	
	ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE);        //注入中断使能
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //规则通道使能
	
/*********************ADC注入通道中断,规则通道不使用ADC中断**********************/
	NVIC_InitTypeDef NVIC_InitStruct ;
	NVIC_InitStruct.NVIC_IRQChannel =  ADC1_2_IRQn ;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0 ;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1 ;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
	NVIC_Init(&NVIC_InitStruct);

2. DMA配置

    DMA_InitTypeDef DMA_InitStructure;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	
	DMA_DeInit(DMA1_Channel1);
	
	DMA_InitStructure.DMA_BufferSize =1;																										//DMA缓冲区大小
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;																			//DMA数据来源外设
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;																						//内存到内存失能
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&Value_Regular);											//内存基地址
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;											//内存数据大小
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;																	//存储器地址递增
	DMA_InitStructure.DMA_Mode =DMA_Mode_Circular;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&( ADC1->DR ));
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_PeripheralInc = DISABLE;
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	DMA_Init(DMA1_Channel1,&DMA_InitStructure);
	
	DMA_ITConfig(DMA1_Channel1,DMA1_IT_TC1,ENABLE);
	DMA_Cmd(DMA1_Channel1,ENABLE);
	ADC_DMACmd(ADC1,ENABLE);
	
	/***********************************规则通道的DMA中断******************************************/
	NVIC_InitTypeDef NVIC_InitStruct ;
	NVIC_InitStruct.NVIC_IRQChannel =  DMA1_Channel1_IRQn ;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0 ;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2 ;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;
	NVIC_Init(&NVIC_InitStruct);

3.DMA中断

  在DMA中断中收集数据,10个数据进行求取平均值滤波。此处不贴代码了,简单的求和取平均值。

调试过程中遇到的问题:

1. 有数据,数据变化很快,但是没有办法执行原来的主程序;

        原因:在使用DMA传输数据时会下意识的使用ADC连续转换模式,这样会导致注入通道也连续转换,自然就在ADC的中断里出不来了。

解决:将连续转换更改为单次转换,DMA中使用全局变量进行滤波。

2.数据中有0,也有正常数据

        原因:之前是电机控制那边写的底层,ADC1中定义了2个规则通道,所以导致规则通道会采集两个数据,另外一个通道没有数据,自然是0;

解决:在ADC_Structure中的数量中,将ADC1的值改为1。

3.采集的数据没有问题,但是滤波后的数据恒溢出

        原因:求和数据定义在函数中,导致每次DMA中断进行数据求和时,sum变量都重新变成了0,又进行除法运算,所以会溢出。

解决:将sun定义成全局变量。

ADC配置说明

ADC1中使用了1路规则通道,2路注入通道,由于注入通道的数据设置外部TIM触发,所以必须设置为单次触发模式。

原本我以为.ADC_NbrOfChannel是指ADC中所有的通道,将这个值设置成了3,1路规则通道,2路注入通道,导致在采集的时候会有2个数据为0。后来在浏览博客的时候偶然发现这个设置是单指规则通道的,所以改成1了。

而ADC2中配置成2,但是没有使用ADC_RegularChannelConfig函数进行配置,没有打开ADC2的规则通道,其实并不受影响。文章来源地址https://www.toymoban.com/news/detail-851071.html

到了这里,关于STM32双路ADC注入通道和规则通道采样的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32模拟SPI时序配置读取双路24位模数转换(24bit ADC)芯片ADS1220采样数据

    TI公司的双路24位模数转换芯片ADS1220具有比较丰富的模式配置,双路差分输入采样也可以配置为4路单端输入信号采样。有多种参考电压源可选,内部增益(从1倍到128倍)和输出率(可达到2K/s)可配置,模拟电压和数字电路电压可单独设置等等。这里介绍STM32访问和读取ADS12

    2023年04月09日
    浏览(70)
  • STM32基于hal库的adc以DMA的多通道采样以及所遇问题解决

    目录 准备 配置 步骤  总结   正点原子的STM32F103ZET6开发板(精英版) CUBEMX配置软件 KEIL5  右对齐就是正常的数据格式。左对齐除以16后得正常数据。(当输出非常大时考虑是否改了对齐方式,默认都是右对齐)  扫描模式,连续转换模式使能。(多通道下扫描模式自动使能

    2024年02月04日
    浏览(47)
  • STM32G071开发笔记:使用定时器(TRGO功能)触发ADC规则采样以避免低侧电流采样所带来的PWM开关噪声

    目录 背景阐述: 导致问题的原因: 解决方案: 实验方案: 实验验证: 可改进的地方 结尾 RT:笔者在做一个项目的时候遇到了一个因为PWM开关噪声干扰导致ADC采样波动大的问题,经过2天的研究终于想到了一个比较好的办法,这个方法不一定适合所有项目,但和我当前项目

    2024年01月25日
    浏览(56)
  • 【N32L40X】学习笔记11-ADC规则通道采集+dma数据传输

    支持 1 个 ADC,支持单端输入和差分输入,最多可测量 16 个外部和 3 个内部源。 支持 12 位、10 位、8 位、6 位分辨率。 ADC 时钟源分为 工作时钟源、采样时钟源和计时时钟源 仅可配置 AHB_CLK 作为 工作时钟源 。 可配置 PLL 作为 采样时钟源 ,最高可到 64MHz,支持分频 1,2,4,6,8,

    2024年02月15日
    浏览(45)
  • stm32f030 学习笔记 (1)adc单/双通道采集

     1.实现单通道         如 pa0 pa1 pa2 温度传感器         1.实现单通道步骤                 1):配置RCC   GPIOA,UART1,ADC1使能                         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);                         RCC_APB2PeriphClockCmd(RCC_APB2Periph_A

    2024年02月15日
    浏览(38)
  • STM32 ADC采样

    目录 1.基础概念 2.原理:ADC采样过程分为四步:采样、保持、量化、编码。 3.采样定理 4.采样保持放大器(SHA) 5.ADC电压值转换 6.ADC轮询采样 1.基础概念 ADC 全称:Analog-to-Digital Converter,指模拟/数字转换器,就是将模拟信号转换成数字信号 ①模拟信号:是连续变化的,具有电

    2024年02月04日
    浏览(43)
  • STM-32:ADC模数转换器—ADC单通道转换/ADC多通道转换

    ADC(Analog-Digital Converter),意即模拟-数字转换器,简称模数转换器。ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。与ADC相对应,从数字电路到模拟电路的桥梁即DAC(Digital-Analog Convertor),数模转换器。 DAC不是唯一可以

    2024年02月09日
    浏览(44)
  • STM32ADC同步采样

    本文主要讲解如何实现STM32ADC同步采样。 所需工具: 开发板:STM32F103RCT6 STM32CubeMX IDE: Keil-MDK 同步采样可以让多个ADC同时采集它们各自的输入信号,并且保留它们之间的相位关系,这有助于更有效地捕捉信号的动态变化,特别是对于相位频率分析来说,它具有重要的应用价值。

    2023年04月14日
    浏览(43)
  • STM32实现ADC采样

    功能:在单片机上对声音和光强进行采样,通过串口输出其采样值。 工具:实验用到CubeIDE和Cubeprogrammer两个软件,串口调试助手APP,以及STM32L431RCT6单片机。 1、配置使能串口: 2、ctrl+s生成代码。 3、在usart.h中添加头文件。 4、在usart.c中实现printf。  编译代码。可以在main.c文

    2024年02月09日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包