精华内容
下载资源
问答
  • STM32 ADC多通道采集

    2018-10-18 14:57:35
    STM32F4ADC多通道采集程序,内容注释详尽,可以作为学习ADC采集的一个不错的程序采集案例
  • STM32F1 ADC多通道采集 DMA方式
  • STM32ADC多通道采集

    2015-08-05 10:47:25
    STM32ADC多通道采集
  • STM32ADC多通道采集(基于DMA)

    千次阅读 多人点赞 2019-05-24 15:32:29
    首先简单介绍DMA,DMA(Direct Memory Access,直接内存存取) ...配置好的DMA可以不停地将ADC转换值写到该变量中,在主函数直接判断该变量就知道此时的AD值,也就是说在主函数中不需要调用ADC_GetConversionValue()函...

    首先简单介绍DMA,DMA(Direct Memory Access,直接内存存取) ,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无需CPU干预,节省CPU资源;ADC转换出来的值直接赋值给定义好的变量中。配置好的DMA可以不停地将ADC转换值写到该变量中,在主函数直接判断该变量就知道此时的AD值,也就是说在主函数中不需要调用ADC_GetConversionValue()函数来获取转换值。

    DMA跟其他外设一样需要进行配置通道,使能时钟等参数
    下面直接看代码:

    volatile vu16 ADCConvertedValue[10][3] ;//开辟的一段内存,用来存放ADC转换结果,也是DMA的目标地址,3通道,每通道采集10次后面取平均数
    
    void Adc_Init (void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	ADC_InitTypeDef  ADC_InitStructure;
    	DMA_InitTypeDef DMA_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1  , ENABLE);
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//要注意,ADC的时钟最大为14M,所以这里6分频,72/6=12<14
    	
    	/************ADC_Init****************/
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_2|GPIO_Pin_3;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	DMA_DeInit(DMA1_Channel1);
    	DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//ADC地址,该参数用以定义DMA外设基地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCConvertedValue; //该参数用以定义DMA内存基地址(转换结果保存的地址)
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //方向(从外设到内存)
    	DMA_InitStructure.DMA_BufferSize = sizeof(ADCConvertedValue)/sizeof(vu16); //定义指定DMA通道的DMA缓存的大小,单位为数据单位。这里也就是Adc_Data的大小
    	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设定外设地址寄存器递增与否,此处设为不变 Disable
    	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //用来设定内存地址寄存器递增与否,此处设为递增,Enable
    	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord ; //外设数据单位
    	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord ;    //内存数据单位
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ; //DMA模式:循环传输
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High ; //优先级:高
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   //禁止内存到内存的传输
    	DMA_Init(DMA1_Channel1, &DMA_InitStructure);  //配置DMA1的1通道
    	DMA_Cmd(DMA1_Channel1,ENABLE);
    		
    	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    	ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    	ADC_InitStructure.ADC_NbrOfChannel = 3;
    	ADC_Init(ADC1, &ADC_InitStructure);
    	
    	ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_13Cycles5);//通道一转换结果保存到ADCConvertedValue[0~10][0]
    	ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_13Cycles5);//通道二转换结果保存到ADCConvertedValue[0~10][1]
    	ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_13Cycles5);通道三转换结果保存到ADCConvertedValue[0~10][2]
    	//ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
    	
    	ADC_DMACmd(ADC1,ENABLE);
    	ADC_Cmd(ADC1, ENABLE);
    	ADC_ResetCalibration(ADC1);
    	while(ADC_GetResetCalibrationStatus(ADC1));
    	ADC_StartCalibration(ADC1);
    	while(ADC_GetCalibrationStatus(ADC1));
    	
    }
    
    

    做完这两步,ADCConvertedValue数组的值就会随输入的模拟电压改变而改变,在主函数中最好取多几次的平均值,再通过公式换算成电压单位。下面是采集函数:

    void Adc_Read(void)
    {
    	int sum;
    	u8 i,j;	
    	
    	ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开始采集
    	for(i=0;i<3;i++)
    	{
    		sum=0;
    		for(j=0;j<10;j++)
    		{
    			sum+=ADCConvertedValue[j][i];
    		}
    		ADC_Value[i]=(float)sum/(10*4096)*3.3;//求平均值并转换成电压值
    		//ADC_Value[i]=(float)sum/10;
    		printf("ADC_Value[%d] = %.3f\n",i,ADC_Value[i]);
    	}
    	Delay_ms(300);
    }
    

    采集结构如下:
    在这里插入图片描述

    展开全文
  • 使用STM32F10X型号板子,进行ADC多路信号采样准换实验。
  • STM32ADC转换程序,测试通过,非DMA方式,可用于多通道采集
  • 使用DMA加速F103的多通道ADC采集速度
  • STM32 adc 多通道采集相互串扰问题解决

    STM32 adc 多通道采集相互串扰问题解决

    参考文章:

    (1)STM32 adc 多通道采集相互串扰问题解决

    (2)https://www.cnblogs.com/yekongdexingxing/p/8079025.html

    (3)https://www.codeprj.com/blog/7b46b11.html


    备忘一下。


    展开全文
  • STM32 ADC 多通道采集非DMA模式

    千次阅读 2018-06-07 17:00:08
    由于多通道的时候采集的时候,AD是连续的按照设定好的铜带顺序进行采集的,所以一般会发生这个通道的数据把另一个通道的数据覆盖的问题,让人感觉每个通道好像错乱一样。比如我明明读的通道5缺显示的通道7的数据。我...

    网上的列子大多数为DMA,所以写个帖子说一下非DMA怎么操作。

    由于多通道的时候采集的时候,AD是连续的按照设定好的铜带顺序进行采集的,所以一般会

    发生这个通道的数据把另一个通道的数据覆盖的问题,让人感觉每个通道好像错乱一样。比如我明明读的通道5

    缺显示的通道7的数据。我开始困扰了许久,以为是板子丝印错误了。

    下面说一下怎么配置的,简单的讲就是把所有通道的GPIO口都设置好,也就是模拟输入

    但是!!!要设置成单通道单次采集,代码如下

    (始终开启)

    (GPIO设置成模拟输入)

       ADC_DeInit(ADC1);  

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;    
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;    
        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_Cmd(ADC1, ENABLE);   
        ADC_ResetCalibration(ADC1);     
        while(ADC_GetResetCalibrationStatus(ADC1));   
        ADC_StartCalibration(ADC1);   

        while(ADC_GetCalibrationStatus(ADC1)){};   


    这样设置之后怎么读取各个端口的数据呢?代码如下

    uint16_t read_adc_value(uint8_t ch)   
    {
        uint16_t adc_val = 0;
        
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );    
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);        
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )){};
        
        adc_val = ADC_GetConversionValue(ADC1);    
        //adc_dbg("ch = %d,adc_val = %d\r\n",ch,adc_val);   
            
        return adc_val;

    }

    也就是每次读取的时候都设置一下采样通道的顺序




    展开全文
  • ①非DMA模式的多通道采集 void ADC_DMA_Config(void) { ADC_InitTypeDef ADC_InitStructure; RCC_HSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RES...

    ①非DMA模式的多通道采集

    void ADC_DMA_Config(void) 
    {
    ADC_InitTypeDef ADC_InitStructure;
    
    RCC_HSICmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    ADC_DeInit(ADC1);
    ADC_StructInit(&ADC_InitStructure);
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; 
    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);
    
    /*没有采用中断和DMA方式,这样采样得到的数据很容易丢失,因为规则通道公用一个数据寄存器,因此需要在一个转换周期内读出数据,紧接着读取下一个通道的数据。*/
    
    ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze); //推迟到转换后的数据被读取
    
    ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);//在延迟和空闲阶段ADC是关闭的
    
    
    
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    /* Wait until the ADC1 is ready */
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)
    { 
    }
    
    
    }

     

    uint16_t  GetADCValue(uint32_t CH_Data )//获取通道数据
    {
        unsigned char  i;
        for(i=0; i<3; i++)
        {
            AD_Value[i] = 0xFF;
            switch (i)
            {
                case 0: ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_9Cycles); break;
                case 1: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
        default: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
            }
    ADC_Cmd(ADC1, ENABLE);
           // ADC_TempSensorVrefintCmd(ENABLE);
            ADC_SoftwareStartConv(ADC1);
            while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) 
            AD_Value[i] = ADC_GetConversionValue(ADC1);
            ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
            ADC_SoftwareStartConv(ADC1);
            ADC_Cmd(ADC1, DISABLE);
        }
    return AD_Value[CH_Data];
    }

     

    ②dma多通道采样与注入采样

    __IO uint16_t ADC_ConvertedValue[2];//内存缓存adc通道数据
    
    void ADC1_Mode_Config(void)
    {
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    
    /* DMA channel1 configuration */
    DMA_DeInit(DMA1_Channel1);
    
    DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //ADC地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 2;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址固定
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;   //内存地址后移
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //半字
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    
    /* Enable DMA channel1 */
    DMA_Cmd(DMA1_Channel1, ENABLE);
    
    /* ADC1 configuration */
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立ADC模式
    ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //开扫描模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //软件触发
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
    ADC_InitStructure.ADC_NbrOfChannel = 2; //转换通道数目
    ADC_Init(ADC1, &ADC_InitStructure);
    
    
    ADC_TempSensorVrefintCmd(ENABLE);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);
    
    
    ADC_InjectedSequencerLengthConfig(ADC1, 1); //注入通道与其长度
      ADC_InjectedChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_7Cycles5);
    // ADC_SetInjectedOffset(ADC1, ADC_InjectedChannel_1, 1000);//设置偏置电压值
    
    ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
    
    ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部触发
    ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE);
    //ADC_AutoInjectedConvCmd(ADC1,ENABLE); //规则通道自动转换到注入通道
    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    }

    由下面代码可以得到注入通道ad值

    ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//启动adc注入通道
    while(RESET ==ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC));//等待转换完成
    value=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//得到第一组的值

    ADC的非DMA的多通道采集完成,参考的网上的例子,学会了很多。其中要根据自己需求注意ADC是扫描模式,ADC是单次转换还是连续转换,还有ADC的模式也要注意。

    软件滤波:

    void bubbleSort(uint8_t column)  //冒泡排序算法,从大到小进行排序
    {  
        int i,j;
        int flag = 1;  
        for(i=0;i<N&&flag;i++) 
        {  
            for(j=0;j<N-1-i;j++) 
            {  
                flag = 0;  
                if(ADC_DMAValue[j][column]>ADC_DMAValue[j+1][column])
                {
                    uint16_t temp = ADC_DMAValue[j][column];  
                    ADC_DMAValue[j][column] = ADC_DMAValue[j+1][column];  
                    ADC_DMAValue[j+1][column] = temp;  
                    flag = 1;  
                } 
             }   
          } 
    }
    
    
    void filter()   //均值滤波处理函数
    {
      for(count=4;count<N-4;count++)     //去掉较大的四个值和较小的四个值,再取其余值的平均值
       {  
          ADC_Value1+=ADC_DMAValue[count][0];  
          ADC_Value2+=ADC_DMAValue[count][1];     
       }
       ADC_Value1=ADC_Value1/(N-8);
       ADC_Value2=ADC_Value2/(N-8);
       RxCounter=7;
    }

     

    转载于:https://my.oschina.net/u/3746145/blog/1587999

    展开全文
  • 程序中编写了ADC采集以及DMA的多通道输出,再加均值滤波使采集回来的信号平滑。相当实用,亲测可用。
  • 寄存器版本的stm32f407 ADC1双通道采样,配置了ADC1的通道11和通道12.采样后的数据通过DMA传输到串口打印出来
  • STM32 ADC多通道转换 描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求...
  • STM32F103多通道ADC

    2018-08-19 17:25:57
    STM32F103ADC多通道采集并使用DMA传输采集结果。ADC分注入通道和常规通道。
  • STM32ADC多通道采集电压

    千次阅读 多人点赞 2019-08-26 20:55:21
    文章目录ADC详解程序说明函数主体引脚配置ADC和DMA配置主函数 ADC详解 前面的博客中详细介绍了STM32ADC的相关信息,这...此次采用多通道采集电压,使用ADC1的通道10、11、12、13、14、15一共六个通道,采用DMA将转...
  • STM32----ADC多通道采集

    2020-06-09 11:21:26
    adc多通道采集数据 之前对于单通道的采集,已经做出了配置的相关解释。 在单通道采集中存储采集的值为单个变量,对于多通道而言需要使用数组来存储每个通道的转换数据。 具体的adc配置文件如下: void ADC_...
  • STM32L4超低功耗单片机内部ADC操作代码,实现温度转换
  • STM32L151的ADC数据采集例程,对于学习STM32L151具有参考价值
  • STM32F4 的16通道ADC采集例程,注释清晰, /**************************************************************************** PCLK2 = HCLK / 2 下面选择的是2分频 ADCCLK = PCLK2 /8 = HCLK / 8 = 168 / 8 = ...
  • STM32F10x ADC多通道采集

    千次阅读 2018-06-13 17:08:55
    1.初始化ADC1void ADC1_Configuration(void){ ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立工作模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描方式...
  • stm32的DMA+ADC多通道数据采集

    千次阅读 多人点赞 2019-11-15 20:58:37
    stm32只有一个规则转换数据寄存器DR,因此普通方法不能同时采集多通道的数据,利用DMA功能一次可以最多采集16个通道的数据。
  • STM32 多通道ADC采集详解(DMA模式和非DMA模式)

    万次阅读 多人点赞 2018-10-26 19:06:20
    ADC相关问题: 1.采集到的值如何转化计算? STM32系列芯片大都是12位只有少部分是16位的,如:F373芯片。 12位分辨率意味着我们采集电压的精度可以达到:Vref / 4096。...扫描模式用于多通道...
  • STM32使用HAL库的ADC多通道数据采集(DMA+非DMA方式) ADC模式介绍: 扫描模式: 多通道采集必须开启,这一项CUBE已经默认设置好了。这个模式就是自动扫描你开启的所有通道进行转换,直至转换完。但是这种连续性是...
  • stm32cubeMX配置ADC多通道采集(非dma和中断方式) stm32cubeMX配置ADC多通道采集(非dma和中断方式) 在百度搜索ADC多通道采集,大部分的都是基于采用dma模式才实现的。而我讲的使用非dma方法。首先有几个概念要搞...
  • STM8S003单片机最小系统上测试ADC多通道采样功能,同时采样AIN2、AIN3、AIN4、AIN5、AIN6通道输入值,并计算各通道采样平均值。
  • STM32ADC多通道采样

    千次阅读 2020-05-17 20:47:45
    基于STM32Cube的ADC多通道采样 STMCube+MDK 用hal库写的好处就是可以不用进行配置IO口发步骤.也有良好的兼容性,更换芯片的时候改代码也简单. 首先打开STM32Cube 点击new project 选择芯片(此处我选的是STM32F051R8...
  • ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出...
  • STM32 ADC使用DMA进行多通道采集

    千次阅读 2018-12-17 14:11:15
    使用[12][3]的排布是因为需要把采集的数据整理成下面这样  通道0,通道1,通道2, 通道0,通道1,通道2, u16 DMAADCData[12][3]; void DMAInit() { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ...
  • STM32F103单片机上,间断模式下,实现3组规则通断数据采集。依次采样ch0,ch1,ch2通道数据。
  • STM32 ADC 多通道16路电压采集

    万次阅读 多人点赞 2017-07-26 22:53:33
    下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,091
精华内容 836
关键字:

stm32adc多通道采集