全部文档
OneOS简介 硬件支持 快速开发指南 编译构造工具 API参考文档 高级语言 用户编程手册 OnePos定位 应用笔记 FAQ

ADC设备用户开发


基础BSP配置--以STM32为例

工程及使用说明

如果在提供的OneOS源码中已经有适合的工程DEMO工程,则可以直接使用;如果没有请参照快速上手中的操作指南,新建一个合适的工程。 针对STM32的ADC多个系列区别较大的情况,驱动设计时只进行了基本的ADC支持,包括ADC单通道模式、单ADC多通道扫描模式、多ADC多通道扫描模式。如有其他使用需求,客户可参考进行修改或者定制。

注意事项:

  1. ADC单通道模式只支持每个ADC只有一个通道的使用;

  2. 多个ADC多通道使用时仅支持规则通道扫描,必须打开DMA使用,同时主ADC1必须使用,否则该模式没有意义!

    特别注意!!!!!

    不同系列的情况不尽相同,如果需要采集多通道数据,建议使用单ADC多通道模式,同时建议使用循环模式,不要频繁开关ADC,避免可能的ADC通道顺序异常问题,因不同系列的区别较大,请谨慎使用该拓展功能。

  3. 针对1、2的情况设备注册时进行了合并,对外只提供一个ADC设备:1模式中通道0对应ADC1;2通道对应ADC2……;2模式中不论开通通道数量,按照STM32的数据映射规则,进行数据和通道映射,使用时需要自己清楚配置后的数据顺序;0通道对应第一个数据,1通道对应第二个数据……;

  4. ADC的通道号需要使用者保证,数据的对应关系使用者要自己根据配置去获得;内部提供了调试的的宏定义方式,使用者可以根据数据情况判断配置是否符合预期(ADC的配置较为多样,但目前系统支持有限,请按规则使用);

  5. ADC多通道模式下的通道转换时间不要设定的太小,测试在1.5周期下会出现DMA处理不过来的情况,长时间运行导致溢出错误;(主要原因:DMA的优先级是低于指令读取等FLASH操作的,响应不过来就会触发QVRN错误)

  6. ADC的多重模式需要注意各个系列不同,部分系列不支持三重模式,甚至于不支持双重模式,具体请参考芯片手册或者STM32CubeMX的配置。

  7. ADC仅支持10、12、14、16位模式,以及右对齐方式!多个ADC必须保证ADC的数据宽度一致;

  8. ADC的位数宽度会根据配置自动识别,但是参考电压在注册(drv_adc.c)时直接设定,不再动态修改;

  9. 不同系列的配置差异并不能全部列出,使用时请参考ST官方的教程和用例,保证ADC的模式配置是正确的,以下仅以万耦一代开发板使用的STM32L475VGT6为例,给出相应的配置及注意事项说明,仅供参考。

STM32CubeMX配置

打开oneos\projects\xxxxx(project文件夹)\board\CubeMX_Config下的STM32CubeMX工程文件,按照具体的需求进行配置,以下示例均以万耦一代开发板为例:

ADC单通道模式

ADC单通道模式下,可以开启多个ADC,但是每个ADC只能打开一个通道,如打开了三个ADC,按照ADC1、ADC2、ADC3的顺序进行注册,每个ADC的通道对外为ADC设备的0、1、2通道,可以开启一个或者多个ADC,注册顺序一致。 配置ADC通道,并配置ADC通道参数:

adc_mode1_cube

  1. Analog标题下是模拟外设信息,选择ADC外设;
  2. Mode标题下是通道信息,选择通道模式;
  3. Configuration->Parameter->ADCs_Common_Settings: 设置ADC共用的通用设置,请根据实际使用正确设置。
  4. Configuration->Parameter->ADC_Settings: 主ADC1的常规ADC参数设置,请根据实际使用正确设置。
  5. Configuration->Parameter->ADC_Regular_ConversionMode: 常规ADC通道参数设置,请根据实际使用正确设置。
  6. 右侧的芯片示意图上根据需要配置硬件引脚;

注意事项:

  1. 扫描模式配置必须把扫描模式,连续转换模式等全部关闭,否则会导致ADC异常,详细的配置可以参考ST官方教程或用例。
  2. 此模式下ADC工作在阻塞模式下,每次获得数据都会等待ADC转换完成但会数值。
  3. 其他可选参数配置,如转换时间,模拟看门狗,矫正电压等,自行根据需要进行配置。

单ADC多通道模式

单ADC多通道模式只支持ADC1,因为STM32的多个系列的ADC并不一致,部分较早的系列只支持ADC1作为主ADC使用,拥有唯一DMA,为兼容全系列做此限定。此模式下顶层adc设备的有效通道值为ADC配置通道数量,顺序为RANK中定义的顺序。

主ADC配置

adc_mode2_adc

配置注意事项:

  1. Configuration->Parameter->ADCs_Common_Settings->Mode = Independent mod: 将ADC配置为独立模式,此时不共用DMA;
  2. Configuration->Parameter->ADC_Settings: 此项配置为ADC的基本配置,针对扫描模式需要注意打开图中的Scon Conversion Mode、Countinuous Conversion Mode、DMA Continuous Requests;部分设置是和通道数相关的,需根据Configuration->Parameter->ADC_Regular_ConversionMode中RANK配置的通道数量才能进行设置;
  3. Configuration->Parameter->ADC_Regular_ConversionMode: 配置ADC的通道参数,包括通道的数量和顺序,每个通道的转换时间等参数,根据需要自行配置。

DMA配置

adc_mode2_dma

配置注意事项:

  1. DMA Request Settings中的Mode配置,Normal为单次模式,Circular为循环模式;Data Width中的两项都设置为Half Word( 不能配置错误! );

  2. Circular模式下,如果ADC的转换速度过快,如ADC时钟过快,转换周期过短可能会导致ADC数据无法及时通过DMA转移,会导致OVR错误,将会导致ADC停止工作。此时会给出错误提示,不进行自主恢复。解决该问题的方法: ​ i、在Clock Configuration中修改ADC的输入频率(此方法不推荐使用); ​ ii、在Configuration->Parameter->ADC_Settings中设置Clock Prescaler,增大分频系数(优先考虑此方法); ​ iii、在Configuration->Parameter->ADC_Regular_ConversionMode中配置Sampling Time,增加ADC通道的转换时间(根据实际应用的要求进行配置)。

    配置为Circular模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为开启状态;

  3. Normal模式下,每次要刷新数据必须先调用一次os_device_open指令打开设备,经过设定的转换时间后会更新出数据,此时客户能够去获得数据(不建议使用该模式,该模式不提供转换完成的自动处理,但提供转换完成的中断回调,客户需要自己注册中断回调函数进行管理,如当前是否完成数据转换等);

    配置为Normal模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为关闭状态;

  4. 循环模式下,请不要尝试多次调用设备打开指令,此时会直接返回错误,设备无法打开,因为底层ADC一直处于运行状态,不能重复打开;

多ADC多通道模式

多ADC多通道模式至少要包含ADC1,因为STM32的多个系列的ADC并不一致,部分较早的系列只支持ADC1作为主ADC使用,拥有唯一DMA,为兼容全系列做此限定。此模式下顶层adc设备的有效通道值为ADC数量乘上最大配置通道数量的两倍,顺序为RANK中定义的顺序结合ADC的数量配置得到,参考下图:

adc_dma_channel

注意事项:

ADC的多重模式作为拓展功能,使用时必须保证以下关系:ADC的开启数量和ADC的通道数量最大值满足一定的关系,能够实现完整的循环转换,否则数据会位置不固定。示例:如果是双重ADC模式,ADC1开启3个通道,ADC2开启2个通道,那么实际启用DAM时会设置一个2(ADC数量)*3(单个ADC通道的最大值)*2共计12的缓存空间,数据顺序为:1.1--2.1--1.2--2.2--1.3--2.1--1.1--2.2--1.2--2.1--1.3--2.2;此时能够完成循环,数据准确稳定。如果是三重ADC模式,如果ADC1开启2个通道,ADC2和ADC3各开启3个通道,此时会出现3*3*2共计18个缓存,此时会出现不能按照途中的顺序完成整周期转换,那么数据会出现循环错位,ADC1的转换缓存中的数据和通道不是唯一确定的,读数不稳定,需要在配置时保证,程序不进行相应的维护。

ADC及DMA配置

adc_mode3_adc1

adc_mode3_adc2

注意事项:

  1. 多ADC使用时先完成每个ADC的基础配置,如ADC_Settings、ADC_Regular_ConversionMode等; 再进行部分通用配置,如DMA相关的配置,否则会出现无法进行选择的情况;
  2. 多个ADC配置完成后,修改Configuration->Parameter->ADCs_Common_Settings中的Mode,根据使用的是双重还是三重ADC模式进行配置;DMA Access Mode 必须选择为DMA access mode enabled,才能打开共用DMA模式;
  3. 在主ADC1的Configuration->Parameter->ADC_Settings中根据通道数配置相关的扫描选项,并把DMA Continuous Requests打开。

adc_mode3_dma

注意事项:

  1. DMA Request Settings中的Mode根据需要进行配置,Normal为单次模式,Circular为循环模式;Data Width中的两项都设置为Word;

  2. 不同系列的ADC多重模式差异,部分系列不支持ADC三重模式,甚至不支持双重模式,此时不能使用该模式。

  3. Circular模式下,如果ADC的转换速度过快,如ADC时钟过快,转换周期过短可能会导致ADC数据无法及时通过DMA转移,会导致OVR错误,将会导致ADC停止工作。此时会给出错误提示,不进行自主恢复。解决该问题的方法: ​ i、在Clock Configuration中修改ADC的输入频率(此方法不推荐使用); ​ ii、在Configuration->Parameter->ADC_Settings中设置Clock Prescaler,增大分频系数(优先考虑此方法); ​ iii、在Configuration->Parameter->ADC_Regular_ConversionMode中配置Sampling Time,增加ADC通道的转换时间(根据实际应用的要求进行配置)。

    配置为Circular模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为开启状态;

  4. Normal模式下,每次要刷新数据必须先调用一次os_device_open指令打开设备,经过设定的转换时间后会更新出数据,此时客户能够去获得数据(不建议使用该模式,该模式不提供转换完成的自动处理,但提供转换完成的中断回调,客户需要自己注册中断回调函数进行管理,如当前是否完成数据转换等);

    配置为Normal模式时,必须要同时修改Configuration->Parameter->ADC_Settings中的DMA Continuous Requests为关闭状态;

  5. 循环模式下,请不要尝试多次调用设备打开指令,此时会直接返回错误,设备无法打开,因为底层ADC一直处于运行状态,不能重复打开;

  6. 多ADC多通道模式下存在转换顺序问题,请注意转换的通道的实际顺序是和用户配置紧密相关

配置和生成工程

  1. 点击Clock Configuration检查时钟配置,然后点击GENARATE CODE生成STM32CubeMX工程代码;

cube_clock_generate

  1. 在对应的oneos\projects\xxxxx(project文件夹) 目录下打开OneOS-Cube工具,在命令行输入menuconfig打开可视化配置界面;
  2. 如下图示,通过空格或向右方向键选择 Top) → Drivers→ MISC 下的 Using ADC device drivers 选项;
    Top) → Drivers→ MISC
                                       OneOS Configuration
    [*] Using generic GPIO device drivers
    [*] Using push button device drivers
    [*] Using led device drivers
    [ ] Using buzzer device drivers
    [*] Using ADC device drivers
    [ ] Using DAC device drivers
    [ ] Using PWM device drivers
    [ ] Using Input Capture device drivers
    [ ] Using Pulse Encoder device drivers
    
  3. 通过Esc退出配置界面,退出时选择保存。
  4. 在命令行输入scons --ide=mdk5命令,构建工程;

工程编译及实现

  1. 打开对应的oneos\projects\xxxxx(project文件夹)目录下的project.uvprojx工程文件;
  2. 在工程中将原有或自己编写的adc test文件加入到application子文件夹中;
  3. 编译并下载工程,运行程序;
  4. 打开串口工具如xshell等,通信成功后,即可通过输入adc_sample指令获得相关的调试指令,根据提示和设置进行输入和ADC测试;
  5. 通过硬件调节电压,即可观察到不断回读ADC采样电压值(电压值单位mv);

results matching ""

    No results matching ""

    返回顶部