MindSDK应用基础—ADC模块样例

引言
mindsdk为mm32主流的微控制器,实现了一组adc样例工程。本文通过讲解adc模块的样例工程,介绍adc模块的功能和用法。关于adc模块对应的驱动程序,以及adc外设模块硬件的实现细节,可具体查阅mindsdk工程的源文件,以及mm32微控制器(例如mm32f5270)的用户手册。
 样例工程
mindsdk中为adc驱动设计的样例工程包括:
adc_basic
adc_interrupt
adc_dma
adc_seq
adc_fixed_seq
adc_ext_seq
adc_awdg
adc_oversample
adc_sw_write_calib
其中, adc_baic 、 adc_interrupt 、 adc_dma 分别演示了adc最典型的功能,包括通过轮询、中断、dma来获取一个adc转换通道的转换结果。adc_awdg 来展现adc模拟看门狗的功能, adc_seq 、 adc_fixed_seq 、 adc_ext_seq 则展现adc按照不同的转换序列来进行转换。还有一些用于特殊场景的功能,例如通过软件写入校准值,以及硬件实现的多次采样取平均值、基本滤波等。
adc_basic
adc_basic 描述了使用adc模块最基本的方式,通过轮询方式对一个通道进行转换,并获取通道的转换值。在样例工程中,通过 adc_init() 函数,配置adc数据有效数据位 adc_resolution_alt0 ,adc的转换模式为单通道单次转换模式 adc_convmode_singleslot 、转换数据对其方式为右对齐 adc_align_right 、通道转化结果通过单端转换方式,将通道与adc内部参考电压vref的差数字量化后输出 adc_singlediffconvmode_singleend 、配置单端转换方式的参考电压为内部参考电压 adc_singleconvvref_internal ,配置待转换通道的序列和每个转换通道的采样周期。之后,每次通过 adc_doswtrigger() 函数,使用软件触发的方式启动adc转换。
实际运行程序时,用户在串口调试终端中每次输入任意字符,改变转换通道的输入电压,会看到串口终端界面对应数值的变化。
adc_interrupt
adc_interrupt 相对于 adc_basic 样例工程,实现了adc转换完成后触发中断服务,在中断服务中获取转换值的用法。
其实现原理,是在 adc_basic 的配置的基础上,通过 adc_enableinterrupts() 函数和 nvic_enableirq()函数 开启adc的中断。当adc转换通道完成转换后,就进入中断服务函数。
实际运行程序时,用户在串口调试终端每次输入任意字符,改变转换通道的输入电压,会看到串口终端界面对应数值的变化。
adc_dma
adc_dma 在 adc_basic 的基础上增加对dma外设模块的使用。在应用层 app_adc_init() 函数中添加对dma通道的配置,通过 dma_initchannel() 函数, dma_xfermode_periphtomemory 配置传输方向为外设到内存、 memaddr 和 periphaddr 配置内存和外设地址、 memaddrincmode 和 periphaddrincmode 配置内存和外设的增量模式、 xfercount 传输的数据量、 dma_reloadmode_autoreloadcontinuous 自动重载传输量、 dma_xferwidth_32b 以32位的数据进行传输。外设映射的dma通道初始配置完成后,通过 dma_enablechannel() 函数使能dma通道,通过 nvic_enableirq() 和 dma_enablechannelinterrupts() 函数开启dma中断。之后,每次通过 adc_doswtrigger() 函数触发adc开始转换,当转换完成后dma开始搬运,当dma搬运完成后进入中断服务函数,以此循环往复。
实际运行程序时,用户在串口调试终端中每次输入任意字符,改变转换通道的输入电压,会看到串口终端界面对应数值的变化。
adc_fixed_seq
adc_fixed_seq 在 adc_dma 样例的基础上,将转换的adc通道由一个通道,设置为多个通道形成一个序列来进行转换,当序列转换完成后,就停止转换。通过 adc_enableseqslotfixed() 函数来配置转换序列的顺序为有低到高的顺序进行转换。dma将adc每个通道数据搬运到指定内存。通过在循环中调用 adc_doswtrigger() 函数来进行一个序列的多次转换。或者通过 adc_convmode_seqcontinues 启用序列的连续转换模式。通过 adc_doswtrigger() 函数可以停止序列转换。
实际运行程序时,用户在串口调试终端中每次输入任意字符,改变配置的转换序列中每个通道的输入电压值,会看到串口调试终端界面对应数值变化。
adc_seq
adc_seq 与 adc_fixed_seq 样例的不同之处在于, adc_fixed_seq 样例只能实现一个由高到低或者由低到的通道转换序列进行转换,例如ch0-ch1-ch3或者ch3-ch1-ch0的转换顺序。adc_seq 样例则实现任意通道序列的转换,例如ch3-ch0-ch5,任意的序列。通过adc_enableseqslot () 函数配置具体的转换序列。adc根据配置的转换序列开始进行转换。当序列转换完成后,停止转换。可以重复的调用 adc_doswtrigger() 开启下一个序列的转换,一次循环往复。或者通过 adc_convmode_seqcontinues 启用序列的连续转换模式。通过 adc_doswtrigger() 函数可以停止序列转换。
实际运行程序时,用户在串口调试终端中每次输入任意字符,改变转换通道的输入电压,会看到串口终端界面对应数值的变化。
adc_ext_seq
adc_ext_seq 实现在当前任意序列转换过程中插入额外的序列,当插入额外的序列时,当前任意序列中正在转换的通道完成,将切换到插入的序列中进行转换,当转换完成后在继续之前任意序列中剩余通道的转换。通过 adc_enableextseqslot() 函数配置额外的序列。例如当前任意序列为ch3-ch0-ch5,额外的序列为ch1-ch4。adc_enableautoextseqslot() 函数开启自动注入模式,即任意序列转换完成后,开启注入通道的转换,转换额外的序列。这种注入模式增加了整个序列的长度。当一个完整序列转换完成后,停止转换,调用 adc_doswtrigger() 函数来进行一个序列的多次转换。或者通过 adc_convmode_seqcontinues 启用序列的连续转换模式。通过 adc_doswtrigger() 函数可以停止序列转换。
实际运行时,用户在串口调试终端中每次输入任意字符,改变转换通道的输入电压,会看到串口终端界面对应数值的变化。
adc_awdg
adc_awdg 在 adc_basic 的基础上增加对转换结果进行监控,通过 adc_enablehwcomp() 函数配置需要监控的转换通道 chnnum 、设置的上限值 highlimit 和下限值 lowlimit ,可以根据上限值和下限值的大小关系设置监控范围,当上限值大于或等于下限值时,监控通道的转换值在两个阈值之外的数值,若开启中断则会进入中断服务函数;同理,当上限值小于下限值时,监控通道转换值在两个阈值之间的数值,若开启中断则会进入中断服务函数。之后,每次通过 adc_doswtrigger() 函数,使用软件触发的方式启动adc转换。
实际运行时,用户在串口调试终端中每次输入任意字符,改变转换通道的输入电压,当电压值满足监控区间时,会看到串口终端界面当前转换数据。
adc_oversample
adc_oversample 在 adc_seq 的基础上通过 adc_setoversample()`函数启动硬件的过采样模式, adc_oversampleratio_256 配置过采样率为256, adc_oversampledatadiv_8 配置数据右移8位, adc_oversampletriggermode_multi 配置为所有通道的过采样转换只需要进行一次触发。injectoversamplemode 配置是否开启注入通道的过采样模式。之后,每次通过 adc_doswtrigger() 函数,使用软件触发的方式启动adc转换。
adc_sw_write_calib
adc_sw_write_calib 在 adc_basic 的基础上实现使用软件保存adc的校准值,然后通过软件将校准值写入寄存器中。通过 adc_getcalibfactor() 函数获取校准值,通过 adc_setcalibfactor() 来写入校准值。


常见的存储Idea数据库的地方
淘宝上DIY电脑暗藏巨坑所以那么便宜 小白们看准了
2023新思科技开发者大会回顾 | 以技术创新应对SysMoore时代五大挑战
动态平衡原理分析(智能平衡车的工作原理)
基于LabVIEW的设备远程监测系统研究
MindSDK应用基础—ADC模块样例
清华姚班组团队,要凭硬实力攻克区块链难题
美国AR眼镜公司Vuzix是如何做到一年翻10倍的?
瑞萨电子推出I3C智能开关器件RG3MxxB12系列
消防机器人 消防员的“得力助手”
智慧电厂人员定位厘米级可视化定位方案
Diodes推出多款符合汽车规格的双线单极和锁存切换器集成电路
医疗设备远程维护系统,智慧医疗全面实现的重要一环!
如何成为更好的防御性程序员 5个小技巧
XKB Connectivity的连接器与日本JST连接器的对比
动辄几百万,虚拟数字人如何降低制作成本?
路灯照明智能控制系统方案
电子产品设计中的bga焊点空洞问题详解
专访WAA专家委员会委员刘应状——促进WLAN从研发、设备制造到应用的良性循环
详谈Linux操作系统中的显示服务器