STM32-ADC多通道数据采集:理论与实践

这篇具有很好参考价值的文章主要介绍了STM32-ADC多通道数据采集:理论与实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章对ADC功能进行了总结,为读者提供了一份全面的STM32-ADC多通道数据采集指南。

STM32-ADC多通道数据采集:

什么是ADC?

Analog to Digital Converter(模拟-数字转换器),ADC采样是将模拟信号转换成数字信号的过程。ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。12位逐次逼近型ADC,1us转换时间。输入电压范围:0到3.3V,转换结果范围:0~4095。

ADC采样的过程可以分为四个主要步骤:

1.采样保持:在一定时间内,对模拟信号进行采样并保持其电压值不变。
2.量化:将采样保持的模拟信号电压值转换成数字量,通常使用比特位数表示。
3.编码:将量化后的数字量编码成二进制形式。
4.存储:将编码后的数字信号存储在计算机或其他数字处理设备中,以便进行进一步的数字信号处理。
ADC采样的精度和速度很大程度上取决于采样率和比特数的选择。较高的采样率和比特数可以提供更精确的数字信号,但也会增加系统成本和复杂性。

ADC的特性:

1.分辨率:ADC的分辨率是指它能够将输入信号分成多少个离散的量化级别。通常用比特数来表示,例如8位ADC的分辨率为2^8=256个量化级别。
2.采样率:ADC的采样率是指它能够对输入信号进行采样的频率。采样率越高,可以捕获到更高频率的信号,但是也需要更高的处理能力和更大的存储空间。
3.精度:ADC的精度是指它能够将输入信号转换为数字信号的准确程度。精度通常用百分比误差或最小有效位(LSB)来表示。
4.噪声:ADC的噪声是指在信号转换过程中引入的随机误差。噪声越小,ADC的精度和可靠性就高。
5.功耗:ADC的功耗是指它在工作中消耗的电力。功耗越低,可以延长电池寿命或降低系统成本。

在多通道采集时需要注意以下几点:

1.通道选择:需要指定采样的通道数以及每个通道的物理引脚。
2.采样顺序:需要指定采样的顺序,可以是顺序采样或者随机采样。
3.转换时间:需要根据ADC的转换时间和采样频率来确定每个通道的采样时间,以确保转换完成后能够在下一个转换周期开始前完成数据读取。
4.数据格式:需要确定ADC输出数据的格式,包括数据位数、精度和符号位等。

ADC功能框图:

STM32,ADC,多通道数据采集,DMA

多通道采集模式----轮询:

1.连续转换,扫描模式(手动转换)。在扫描模式下启动列表之后,里面每一个单独的通道转换完成后不会产生任何标志位、和中断。它只有在整个列表都转换完成后才会产生一次EOC标志位,才能触发中断。这种方法容易造成数据覆盖的问题如果想要用扫描模式实现多通道采集,最好要配合DMA来实现。
其他解决方法:
在扫描的时候每转换一个通道就暂停一次,我们可以等手动把数据转运走之后在继续触发,继续下一次的转换。就能避免数据覆盖的问题但是这种方式效率较低(不建议使用)。
2.单次转换,非扫描模式:在每次触发转换前,我们可以手动更改一下列表的第一个位置的通道就行这种我们可以通过代码来实现。

uint16_t AD_GetValue(uint8_t ADC_Channel){
        ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);//采样不同的通道直接修改第三个参数
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
        while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
        return ADC_GetConversionValue(ADC1);}

主函数代码:

int main(void){

        AD_Init();
        Usart_Init();
        while (1)
        {
            AD0 = AD_GetValue(ADC_Channel_0);
            AD1 = AD_GetValue(ADC_Channel_1);
            AD2 = AD_GetValue(ADC_Channel_2);
            AD3 = AD_GetValue(ADC_Channel_3);
            printf("ADC0: %d  ADC1:%d  ADC2: %d ADC3: %d\r\n",AD0, AD1, AD2, AD3);
            
            Delay_ms(500);
        }}

效果展示:
STM32,ADC,多通道数据采集,DMA

多通道采集模式----DMA:

DMA简介:
1、DMA(Direct Memory Access,直接存储器访问)是一种硬件机制,它可以在不需要CPU干预的情况下实现外设直接和存储器之间的数据传输。在STM32中,DMA可以用于加速数据传输,减少CPU占用率,提高系统性能。DMA控制器是一个独立的外设,它可以与其他外设相连,如ADC、DAC、USART、SPI、I2C等。DMA控制器可以直接访问存储器,而不必通过CPU,从而大大提高数据传输效率。
2、12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)
3、每个通道都支持软件触发和特定的硬件触发(本文采用的是硬件触发方式)
4、STM32F103RCT6 DMA资源:DMA1(6个通道)、DMA2(1个通道)
使用DMA的步骤:
1、初始化DMA控制器,包括设置数据传输方向、数据宽度、传输模式等参数。
2、配置DMA传输的源地址和目的地址。
3、配置传输数据的数量。
4、启动DMA传输。
DMA转运的三个条件:1.传输计数器不为零。2.触发源有信号。3.DMA使能
DMA.c

void MyDMA_Init(uint32_t AddrA, uint32_t AddrB, uint16_t Size){
    MyDMA_Size = Size;
    
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
    DMA_InitTypeDef DMA_InitStructure;
    DMA_InitStructure.DMA_PeripheralBaseAddr = AddrA;//外设站点的基地址,一般为32位的地址。
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度,这里是一个字节的(宽度为8位)
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//地址是否自增(自增)
    //存储器站点的三个参数
    DMA_InitStructure.DMA_MemoryBaseAddr = AddrB;//存储器站点的基地址,一般为32位的地址。
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//数据宽度,这里是一个字节的(宽度为8位)
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//地址是否自增(自增)
    
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DST: destination(目的地)传输方向为存储器到外设站点。SRC:source(源头),外设站点到存储器站点的存储方向。
    DMA_InitStructure.DMA_BufferSize = Size;//以数据单元,指定缓存区的大小。
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//指定传输寄存器是否要自动重装,(DMA_Mode_Circular :循环模式,自动重装。DMA_Mode_Normal:正常模式,不自动重装)
    DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;//DMA是否应用于存储器到存储器的转运(使用软件触发)
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//指定通道的优先级(中等优先级)
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    
    DMA_Cmd(DMA1_Channel1, DISABLE);//DMA失能}

ADC单次扫描+DMA单次运转:

ADC配置函数:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
        
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConv =   ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_NbrOfChannel = 3;
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_Cmd(ADC1, ENABLE);
    
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1) == SET);
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1) == SET);

DMA配置:

	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    DMA_InitTypeDef DMA_InitStructure;
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;//	存储器站点的基地址,这为32位的地址。
	DMA_InitStructure.DMA_PeripheralDataSize = 		 DMA_PeripheralDataSize_HalfWord;//低16位adc1所以未一半
 	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;//存储器站点的基地址,这为32位的地址。
	DMA_InitStructure.DMA_MemoryDataSize = 	DMA_MemoryDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
	DMA_InitStructure.DMA_BufferSize = 3;//以数据单元,指定缓存区的大小未3。
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
 	DMA_Init(DMA1_Channel1, &DMA_InitStructure);

 	DMA_Cmd(DMA1_Channel1, ENABLE);

整体合并:

#include "stm32f10x.h"                  // Device headeruint16_t AD_Value[3];void AD_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);
        
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_NbrOfChannel = 3;
    ADC_Init(ADC1, &ADC_InitStructure);
    
    DMA_InitTypeDef DMA_InitStructure;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 3;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    
    DMA_Cmd(DMA1_Channel1, ENABLE);
    ADC_DMACmd(ADC1, ENABLE);
    ADC_Cmd(ADC1, ENABLE);
    
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1) == SET);
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1) == SET);
    
    }void Get_Value(void){
    DMA_Cmd(DMA1_Channel1, DISABLE);//失能
    DMA_SetCurrDataCounter(DMA1_Channel1, 3);//给传输计数器负值参数dataNumber:指定给传输计数器写入的值
    DMA_Cmd(DMA1_Channel1, ENABLE);//使能
    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    
    while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//查看标志位
    DMA_ClearFlag(DMA1_FLAG_TC1);//清除标志位
    }

main.c:

int main(void){
    OLED_Init();
    AD_Init();
    
    OLED_ShowString(1, 1, "AD0:");
    OLED_ShowString(2, 1, "AD1:");
    OLED_ShowString(3, 1, "AD2:");

    
    while (1)
    {
        Get_Value();
        
        OLED_ShowNum(1, 5, AD_Value[0], 3);
        OLED_ShowNum(2, 5, AD_Value[1], 3);
        OLED_ShowNum(3, 5, AD_Value[2], 3);
        
        Delay_ms(100);
    }}

ADC连续扫描和DMA循环转运模式

#include "stm32f10x.h"                  // Device headeruint16_t AD_Value[3];void AD_Init(void){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
    
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5);//    ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5);
        
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_NbrOfChannel = 3;
    ADC_Init(ADC1, &ADC_InitStructure);
    
    DMA_InitTypeDef DMA_InitStructure;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)AD_Value;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 3;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    
    DMA_Cmd(DMA1_Channel1, ENABLE);
    ADC_DMACmd(ADC1, ENABLE);
    ADC_Cmd(ADC1, ENABLE);
    
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1) == SET);
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1) == SET);
    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);}//void Get_Value(void)//{//    DMA_Cmd(DMA1_Channel1, DISABLE);//失能//    DMA_SetCurrDataCounter(DMA1_Channel1, 3);//给传输计数器负值参数dataNumber:指定给传输计数器写入的值//    DMA_Cmd(DMA1_Channel1, ENABLE);//使能//    //    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//    //    while (DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET);//查看标志位//    DMA_ClearFlag(DMA1_FLAG_TC1);//清除标志位//}

main.c

int main(void){
    OLED_Init();
    AD_Init();
    
    OLED_ShowString(1, 1, "AD0:");
    OLED_ShowString(2, 1, "AD1:");
    OLED_ShowString(3, 1, "AD2:");
    
    while (1)
    {//        Get_Value();
        OLED_ShowNum(1, 5, AD_Value[0], 4);
        OLED_ShowNum(2, 5, AD_Value[1], 4);
        OLED_ShowNum(3, 5, AD_Value[2], 4);
        
        Delay_ms(100);
    }}

效果展示

STM32,ADC,多通道数据采集,DMA文章来源地址https://www.toymoban.com/news/detail-496807.html

到了这里,关于STM32-ADC多通道数据采集:理论与实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【STM32F407 ADC+DMA采集压力变送器数据(HAL库)】

    之前项目中需要对麦克传感器的mpm480隔爆压力变送器(4-20ma输出)的数据进行实时采集,使用STM32F407作为控制器,使用信号转换模块将压力变送器4-20ma的输出转换为0-3.3v的信号量,输入到STM32F407板子的ADC1的通道10,并使用DMA2通道0数据流0将采集的多个值从外设直接存入存储器

    2024年02月16日
    浏览(14)
  • 基于STM32的ADC采样及各式滤波实现(HAL库,含VOFA+教程)_数据采集滤波算法stm32(3)

    2.2 VOFA+使用方法 VOFA+ 的数据协议引擎有 3种 : FireWater , JustFloat , RawData 。每种数据协议引擎都有自己特殊的使用效果,读者朋友可以根据自己的实际需要去选择使用。作者这里主要给大家演示一下 FireWater协议 下的VOFA+使用效果和方法。 FireWater协议 是 CSV风格 的字符串流,

    2024年04月23日
    浏览(20)
  • STM32-单通道ADC采集(DMA读取)实验

    关于ADC的一些原理和实验我们已经有了2篇笔记,链接如下: 关于ADC的笔记1_Mr_rustylake的博客-CSDN博客 STM32-ADC单通道采集实验_Mr_rustylake的博客-CSDN博客 实验要求:通过ADC1通道1(PA1)采集电位器的电压,并显示ADC转换的数字量和换算后的电压值。 我们通过下表可以知道DMA1通道

    2024年02月16日
    浏览(18)
  • 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日
    浏览(8)
  • STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

    时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向一定要勾选Use Micro LIB  获取ADC通道值 主函数   串口输出

    2024年02月15日
    浏览(20)
  • STM32 CubeMX ADC采集 单通道,多通道,内部温度(轮询,DMA,中断)(HAL库)

    12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入电压是否超出用户定

    2024年02月06日
    浏览(22)
  • STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

     时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  添加DMA  DMA模式选择循环模式  使能DMA连续请求 采样时间配置160.5 转换次数为8  配置好8次转换的顺序  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向

    2024年02月08日
    浏览(15)
  • 使用RT-Thread studio IDE开发stm32F407(实现adc多通道采集)

    注意:使用这个IDE配置工程特别简单( only   10  minutes ) step1:选择对应的芯片或开发板创建RT-Thread项目   step2:配置RT-Thread Settings(按我的步骤顺序进行) 由于要用到ADC,所以我们使能这个框架,直接把它选上就ok 是不是特别简单?接下来第三步,要难一点了 step3 注意: 这

    2024年02月09日
    浏览(19)
  • 【正点原子STM32连载】第三十三章 单通道ADC采集实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章介绍使用APM32E103模数转换器(ADC)进行带通道的电压采集。通过本章的学习,读者将学习到单通

    2024年02月19日
    浏览(19)
  • 【正点原子STM32连载】第三十五章 多通道ADC采集(DMA读取)实验 摘自【正点原子】APM32E103最小系统板使用指南

    1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 本章介绍APM32E103的DMA进行多通道的ADC采集。通过本章的学习,读者将学习到DMA、ADC的使用。 本章分

    2024年01月24日
    浏览(19)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包