微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 连载七:STM32竟然可以这样读取模拟量?!情何以堪!

连载七:STM32竟然可以这样读取模拟量?!情何以堪!

时间:10-02 整理:3721RD 点击:

STM32自带一个或者两个ADC转换器,精度(12位)和速度(14M的ADC时钟)还不错,最快的情况下采样率能到1M左右,能满足一般情况下的应用。性能没问题,有问题的是配置复杂。

eBox将这些复杂的过程封装起来,留给用户超级简单的接口,让用户用起来舒服到家!

eBox中ADC的特性:

(1)速度:ADC时钟采用eBox系统默认设置为RCC_PCLK2_Div6,即72/6=12Mhz,不可修改。每个通道的采样周期为ADC_SampleTime_28Cycles5,即28.5个ADC时钟周期完成一次采样;共开启了16个通道。使用规则顺序采样。由于使用了DMA所以也不会占用cpu资源(其实会占用一定的总线时间的,用于dma和cpu的总线仲裁)。

采样周期的计算:

Tconv = (28.5+12.5)* (1/12Mhz)*16=(41周期/12Mhz)*16=3.4us*16=54.4us。此处说明ADC每个通道更新周期为54.4us,实际的采样率为18.4Khz左右。但是每个通道实际使用的时3.4us完成了一次转换。如果想提高采样率只能申请修改内核,发布特殊需求版本的lib。

(2)analog_read()的速度是不受限制的,可以高速循环调用,但是其值的更新最快速度为Tconv。

(3)精度:ADC精度采用eBox系统默认设置12位,不可修改。返回值最大为4095.

(4)eBox默认支持ADC1的16个通道

使用方法:

  1. #include "ebox.h"
  2. int16_t x;
  3. void setup()
  4. {
  5.     ebox_init();
  6.     uart1.begin(9600);
  7.     PA7.mode(AIN);
  8. }

  9. int main(void)
  10. {
  11.     setup();
  12.     while(1)
  13.     {
  14.         x = analog_read(&PA7);
  15.         uart1.printf("hex = %05d\r\n",x);
  16.         x = analog_read_voltage(&PA7);
  17.         uart1.printf("val = %04dmv\r\n",x);
  18.         uart1.printf("==============\r\n",x);
  19.         delay_ms(1000);
  20.     }
  21. }

复制代码

撸主,我没文化,别骗我好不好!这么假?

没文化还不赶紧下载源代码试试,实践出真知!

最新的源代码下载地址:

https://github.com/eboxmaker/ebox_stm32

点击download zip下载源码,打开example->analog文件夹下面的文件。复制到main.cpp。


我的众筹项目地址:http://z.elecfans.com/30.html 期待大家一起来完善和发展eBox,打造国人自己的库,不仅仅支持STM32,更能支持飞思卡尔MCU、NXP MCU······


请问你是用的什么什么模式采集ADC的值的?能支持一次初始化多个通道吗?
我也用C++封装过ADC的,用的DMA方式;但是如果在程序中间初始化一个通道的话会出现前面初始化过的通道重新又初始化一遍,我觉得这样不好;所以需要使用者在一开始就把所有的需要用到的ADC通道 一次性初始化完。

恩,是这样的,eBox就是在最开始的时候将16通道的配置一起初始化完成,但是没有做IO的配置,所以用户真正需要使用的时候,只需要配置相应的GPIO为模拟输入即可!

因为发的github上的源码并不能找到,404了所以我只能猜想了:你是在程序开始的时候就把GPIO的初始化完成了吗?也就是说你一开始就把所有引脚的功能规定好了;有些能复用功能的引脚就只有一种功能是吧?

听说过ebox好用,没想到这么好用

所有的GPIO都可以实现用户自定义配置,并没有封装死。现在可以支持一种复用,remap的引脚现在没有支持。这个后期会有的

嘿嘿,不好用我就不做这个了

简单,快捷,牛,好好好好

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top