基于STM32F103C8T6四路AD采集数据显示在oled屏上非DMA传输方式(附百度网盘下载链接)

这篇具有很好参考价值的文章主要介绍了基于STM32F103C8T6四路AD采集数据显示在oled屏上非DMA传输方式(附百度网盘下载链接)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文采用四路AD采集光照强度、烟雾浓度、一氧化碳、空气质量等四个物理量,并采用中位值平均滤波(防脉冲干扰平均滤波法)算法对偶然出现的脉冲性干扰,消除由其引起的采样值偏差。

  1. ADC简介

STM32F103C8T6有两个ADC,12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐的方式存储在16位数据寄存器中。

  1. 主要用到的ADC参数和函数

void ADC1_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置 ADC 分频因子 6 
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    ADC_DeInit(ADC1);    //将外设 ADC1 的全部寄存器重设为缺省值
    
    ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//连续转化模式设置
    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据左对齐
    ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//软件触发
    ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立模式
    ADC_InitStructure.ADC_NbrOfChannel=1;//通道数
    ADC_InitStructure.ADC_ScanConvMode=DISABLE;//扫描模式设置
    ADC_Init(ADC1,&ADC_InitStructure);
    
    ADC_Cmd(ADC1,ENABLE);//使能指定ADC外设
    
    ADC_ResetCalibration(ADC1);//使能复位校准
    while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
    ADC_StartCalibration(ADC1);//开启AD校准
    while(ADC_GetCalibrationStatus(ADC1));//等待AD校准结束
}

u16 Get_ADC_Value(u8 channel)//ADC采样
{    
   ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5);
     ADC_SoftwareStartConvCmd(ADC1,ENABLE);
     while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
     return ADC_GetConversionValue(ADC1);
}

void ADC_DeInit(ADC_TypeDef* ADCx) :将外设 ADCx 的全部寄存器重设为缺省值 ADC_ContinuousConvMode:用来设置是否开启连续转换模式,单次转换:DISABLE;连续转换:ENABLE,因为我们是单次转换,所以设置为DISABLE

ADC_DataAlign:用来设置 ADC 数据对齐方式是左对齐还是右对齐,ADC转换后的数据被保存到数据寄存器中(ADC_DR)的0~15位或16~32位,数据宽度为16位,ADC转换精度12位。左对齐则是把ADC转换后的数值最高位D12与存储区域的最高位Bit15对齐,存储区域的低4位无意义。右对齐则是ADC转换的数值最低位D0保存在存储区域的最低位Bit0,高四位无意义

ADC_ExternalTrigConv:用来设置启动规则转换组转换的外部事件 ,ADC在收到触发信号后才开始进行模数转换

stm32f103c8t6有几个adc通道,STM32F103C8t6实战,stm32,单片机,嵌入式硬件,Powered by 金山文档

ADC_Mode:ADC的模式非常多,包括独立模式,注入同步模式等等,而不同的ADC是共用通道的,当两个ADC采集同一个通道的先后顺序、时间间隔不同时,就会有多种模式。我们只使用了一个ADC,所以选择独立模式,参数为 ADC_Mode_Independent。

stm32f103c8t6有几个adc通道,STM32F103C8t6实战,stm32,单片机,嵌入式硬件,Powered by 金山文档

ADC_NbrOfChannel:保存要进行ADC数据转换的通道数,可以为1 ~ 16个。这里我们是单次采集一个通道,所以值为 1即可

ADC_ScanConvMode:用来设置是否开启扫描模式,当有多个通道需要采集信号时,可以把ADC配置为按一定的顺序轮流采集各通道的值。如果采集多个通道,必须开启此模式。这里我们是单次采集一个通道的信号,这里我们选择不开启 : DISABLE

注:以下函数都没有写形参和返回值,仅仅写出了它的功能,具体参见STM32F103固件库说明手册

ADC_Init():根据 ADC_InitStruct 中指定的参数初始化外设 ADCx 的寄存器

ADC_Cmd():使能或者失能指定的 ADC,:函数 ADC_Cmd 只能在其他 ADC 设置函数之后被调用

ADC_ResetCalibration(): 重置指定的 ADC 的校准寄存器

ADC_GetResetCalibrationStatus(): 获取 ADC 重置校准寄存器的状态 ,返回值: ADC 重置校准寄存器的新状态(SET 或者 RESET) ,当值为RESET时重置成功

ADC_StartCalibration():开始指定 ADC 的校准状态

ADC_GetCalibrationStatus(): 获取指定 ADC 的校准程序 ,返回值: ADC 校准的新状态

ADC_RegularChannelConfig ():设置指定 ADC 的规则组通道,设置它们的转化顺序和采样时间,RANK值是指在进行多通道扫描时,本通道的扫描顺序。例如通道4、5、6、7的RANK值被分配为4、3、2、1,则在ADC扫描时,扫描的顺序为通道7、6、5、4 。

ADC_SampleTime:用于配置本通道的采样周期,这里的周期指的是ADCCLK的时钟周期,ADC时钟频率越高,转换速度就越快,但ADC时钟有上限值,不能超过14Mhz。ADC的时钟(ADCCLK)为ADC预分频器的输出,而ADC预分频器的输入则为高速外设时钟(PCLK2)。PCLK2的常用时钟频率为72Mhz,可设置PCLK2为2、4、6、8分频。因为ADCCLK必须低于14Mhz,所以ADCCLK最高频率为PCLK2的8分频,即ADCCLK = 9Mhz.

STM32的ADC采样时间计算公式:T=采样周期+12.5个周期

本实验中ADC通道的转换时间:T= (239.5+12.5)x(1÷12) = 21us

注:12.5为固定周期

ADC_SoftwareStartConvCmd():使能或者失能指定的 ADC 的软件转换启动功能

ADC_GetFlagStatus();检查制定 ADC 标志位置 1 与否

stm32f103c8t6有几个adc通道,STM32F103C8t6实战,stm32,单片机,嵌入式硬件,Powered by 金山文档

ADC_FLAG 的值

u16 ADC_GetConversionValue(ADC_TypeDef* ADCx) :返回最近一次 ADCx 规则组的转换结果

  1. 中位值平均滤波(防脉冲干扰平均滤波法)

方法:“中位值滤波法"+“算术平均滤波法”

连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值,N值的选取:3~14

优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。对周期干扰有良好的抑制作用,平滑度高,适于高频振荡的系统。

缺点:测量速度慢。

这里采用了一个二维数组来分别存储四个AD通道的采样值,然后分别进行计算,具体代码如下:

void middleAverageFilter()    //中位值平均滤波(防脉冲干扰平均滤波法)
{
    u16 i,j,k,g;
    u16 temp;
      u16 Sum_Value[ADC_Value_Size] = {0};
    u16 value_buf[ADC_Value_Size][ADC_Value_Number] = {0};
        for(g = 0 ; g < ADC_Value_Size ; g++)
        {
            for(i = 0; i < ADC_Value_Number; i++)
            {
                    value_buf[g][i] = Get_ADC_Value(g+0x04);

            }
        }

    /*从小到大冒泡排序*/    
        for(g = 0 ; g < ADC_Value_Size ; g++)
        {
            for(j = 0; j < ADC_Value_Number-1; j++)
            {
                    for(k = 0; k < ADC_Value_Number-j-1; k++)
                    {
                            if(value_buf[k] > value_buf[k+1])
                            {
                                    temp = value_buf[g][k];
                                    value_buf[g][k] = value_buf[g][k+1];
                                    value_buf[g][k+1] = temp;
                                
                            }
                    }
            }
      }
        for(g = 0 ; g < ADC_Value_Size ; g++)
        {
            for(i = 1; i < ADC_Value_Number-1; i++)
            {
                    Sum_Value[g] += value_buf[g][i];
            } 
      }
    Light_value =4096 - Sum_Value[0]/(ADC_Value_Number-2);
        m7_value=Sum_Value[1]/(ADC_Value_Number-2);
        m135_value =4096 - Sum_Value[2]/(ADC_Value_Number-2);
        m2_value = Sum_Value[3]/(ADC_Value_Number-2);        
}
  1. 传感器

本实验用到了 MQ-2 烟雾传感器、MQ-7一氧化碳传感器、MQ-135空气质量传感器和光敏电阻传感器。传感器这里就不再介绍啦,大家有传感器就应该有资料的,直接连在对应的引脚就可以用啦

stm32f103c8t6有几个adc通道,STM32F103C8t6实战,stm32,单片机,嵌入式硬件,Powered by 金山文档
stm32f103c8t6有几个adc通道,STM32F103C8t6实战,stm32,单片机,嵌入式硬件,Powered by 金山文档

4. 实验现象

stm32f103c8t6有几个adc通道,STM32F103C8t6实战,stm32,单片机,嵌入式硬件,Powered by 金山文档
  1. 百度网盘下载链接

链接:https://pan.baidu.com/s/1SpTvf2CjtPRw3GmdaW4xTA

提取码:1k6q文章来源地址https://www.toymoban.com/news/detail-544250.html

到了这里,关于基于STM32F103C8T6四路AD采集数据显示在oled屏上非DMA传输方式(附百度网盘下载链接)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于STM32F103C8T6的HC-06蓝牙通信

    如果朋友们 遇到了如下问题 ,可以仔细借鉴本文章和另一篇专门讲解 蓝牙通信问题 的文章,一定能够解决你在蓝牙通信时遇到的诸多困难 1.在调试蓝牙模块AT指令时无返回值 2.身边 无USB转TTL模块 可以直接调试蓝牙模块(本人就是由于无模块花了了整整一天才调试成功)

    2024年02月03日
    浏览(30)
  • 基于STM32F103C8T6ADC检测交流电压

    上篇文章写了硬件部分的实现思路,通过采样电阻的到小电压后经过二级放大电路得到单片机可处理的交流电压,此文介绍了如何采用单片机采集交流电压以及stm32ADC外设的使用。首先是硬件电路部分。  电路没有采用核心板,而是直接将芯片焊接到主板上,采用type-c接口供

    2024年02月12日
    浏览(24)
  • STM32f103c8t6模板的搭建-基于正点例程

           笔者认为正点编写的官方例程结构较为整洁,可以便于后期的例程开发,如果开发者对于项目开发中芯片要求较高的话,有很多人会选择正点的开发板,但是通常大多数是stm32初学者会选择用价格更为便宜的c8t6来进行学习,而正点选用的教程开发板大多都是些RC、ZE、

    2024年02月06日
    浏览(38)
  • 基于STM32F103C8T6的超声波测距应用

    #一、超声波HC_SR04简介 #二、超声波工作原理 #三、超声波测距步骤 #四、硬件接线 #五、项目代码 一、超声波HC_SR04简介 超声波传感器模块上面通常有两个超声波元器件,一个用于发射,一个用于接收。电路板上有四个引脚:VCC、GND、Trig(触发)、Echo(回应) 工作电压与电流

    2024年02月03日
    浏览(18)
  • HX711压力传感器(基于STM32F103C8T6)

    HX711模块是我们目前比较常见的压力传感器模块,主要的作用是用来做压力检测,重量监测等等。博主的这篇博文主要实现功能为,在对重量或者压力进行监测的同时,可以累加或者清零数值,在此基础上就可以对比如饮水量进行统计等等。 HX711模块是市面上比较常见的模块

    2024年02月11日
    浏览(22)
  • 基于stm32f103c8t6的定时器详解(持续更新)

    先声明:stm32f103c8t6中没有基本定时器、只有TIM1-TIM4:分别是高级定时器和通用定时器(对照下图请自行阅读stm32f103x的datasheet) 1、定时器功能:定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能

    2023年04月24日
    浏览(22)
  • [STM32F103C8T6]基于stm32的循迹,跟随,避障智能小车

    目录 1.小车驱动主要是通过L9110S模块来驱动电机 motor.c 2.我们可以加入串口控制电机驱动(重写串口接收回调函数,和重定向printf) Uart.c main.c  3.点动功能 uart.c main.c 为什么使用的是HAL_Delay()要设置滴答定时器的中断优先级呢? 4.小车PWM调速,  6.跟随功能 7.避障功能 超声波测距

    2024年02月13日
    浏览(30)
  • 基于stm32f103c8t6及AS608-----指纹锁项目

              博主纯小白, 本文适合于初学者,大佬还请勿喷,欢迎提出意见,有纰漏之处将及时纠正。 在浅学了stmf103c8t6后,想着依据现在所拥有的知识和能力做一个小项目。 注:工程代码在文章末尾。 掌握C语言基础....这个最基础啦... 接触过类似单片机,稍微看得懂芯片

    2023年04月09日
    浏览(35)
  • 基于STM32F103C8T6的UAV飞控板硬件设计

    一、主控单元:         主控单元基于意法半导体公司的STM32F103C8T6单片机进行设计。STM32F103C8T6DE 内核为ARM Cortex-M3;最大主频:72MHz ;工作电压范围:2V~3.6V ;程序存储容量:64KB; 程序存储器类型:FLASH ;RAM总容量:20KB; GPIO端口数量:37 ;封装为LQFP-48;串行单线调试(

    2024年02月08日
    浏览(25)
  • 功耗测评 | STM32F103C8T6

    STM32F103C8T6 MCU越来越广泛的应用在生产生活的各个领域,外接丰富的传感器、功能模块、通信模块、显示存储等可以形成各种可样的产品项目应用。对于功耗要求比较高的产品,一般会选择STM32L系列的MCU,但是从功耗的评测角度,逻辑上是基本相似的。 在很多应用场合中都对

    2024年02月07日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包