当前位置:首页|资讯|ChatGPT

第六章合集2:使用chatGPT编写简易示波器:touchGFX人机界面和数据采集

作者:西邮严老师发布时间:2023-02-17

6.3.2数据采集界面设计

(1)修改上一节的动态图例程,将AD采样结果,定时更新到graph上显示。

程序逻辑是,通过cubeMX配置ADC,通过DMA方式,将AD采样的数据存储在数组中,存储数量达到规定的值后,产生DMA中断。

在MainView.cpp的handleTickEvent()定期刷新函数中,判断是否采样结束。如果结束了,则将数组中的数据,更新到graph动态图中,达到定期更新显示采样数据的示波器效果。

1)查看STM32F469I-DISCO开发板的原理图(官方文档“mb1189.pdf”),找到连接端子“Arduino UNO connector”部分,了解输出端子管脚配置,我们发现,合适作为ADC1_IN9输入通道使用的管脚为PB1管脚。


图6-12 查看原理图获得AD输入管脚

2)打开工程路径下的cubeMX工程,并配置ADC1的输入为IN9通道,DMA设置为“从外设到内存”,优先级可以设置为高。

 

图 6-13 设置DMA方式将采样结果直接搬运到内存图

3)设置AD采样参数。

为得到最高采样率(2.4MHz),首先在cubeMX的“Clock Configuration”界面,将PCLK2设置为72MHz(默认为90MHz),如下图所示:


 6-14 设置采样时钟

然后回到ADC1的配置界面,对ADC1做如下设置:


 6-15 设置AD采样参数图

如上图所示,我们将ADC的时钟设置为“PCLK2 divided by2”,采样精度默认为12位(每次转换需要15个时钟),将“Continuous Conversion Mode”设置为“Enable”确保连续采样,并将“DMA Continuous Request”设置为“Enable”,确保DMA搬运能连续执行。采样时间设置为3个时钟周期(读者可以选择比较长的采样时间,获得较低的采样率)。

在本例中,采样率的计算方式为:(PCLK2/2)/15=2.4MHz,只有将PCLK2设置为72MHz,才能使得ADC的时钟(PCLK2/2)最高,即36MHz(该单片机的最高ADC时钟),而默认的PCLK2为90M Hz,如果按照默认的PCLK2,是不能得到最高采样率的,读者可以尝试修改PCLK2的参数,体会最高采样率的设置技巧。

4)点击cubeMX右上角的“GENERATE CODE”,然后进入工程文件夹,打开生成的MDK工程,点击并打开“main.c”,在用户定义的变量区,增加AdcConvertedValue数组和 adcDmaOverFlag变量,数组用来存储每次采样的100个数据,变量用来确定100个数据是否已经采样完成。


图 6-16 在主函数申明采样数组和采样结束标志位

在主函数中,当初始化完成之后,增加DMA传输语句,该行程序启动DMA传输,将ADC采样的数据,无需CPU介入,直接搬运到数组中,存储完100个数据之后,产生DMA中断。在采样存储过程中,数据存储的地址会自动增加。如下图所示:


图 6-17 在主函数初始化完成后启动ADC的DMA传输模式

5)点击并打开中断响应文件“stm32f4xx_it.c”,找到cubeMX自动生成的DMA中断函数,在每次100个数据采样完成之后,系统会自动进入这个中断,并执行中断响应函数。在该函数中,我们将采样结束标志位adcDmaOverFlag置为1。如下图所示:

 

图 6-18 采样结束后进入DMA中断响应函数

由于adDmaOverFlag变量是在“main.c”中定义的,因此在“stm32f4xx_it.c”中使用时,请在该文件的用户变量定义区

“”和“”之间增加“extern uint8_t adDmaOverFlag;”,申明该变量是外部变量。

6)回到touchGFX软件界面,将本程序不需要的滚动条及其交互删除,如下图所示:


图 6-19 删除滚动条及交互操作

然后设置动态图控件,将图形的显示点数、可见范围设置为100,并将数据范围更改为0-4095(本例使用的是12位ADC,采样结果最大为4095)。


图 6-20 设置graph的显示范围

7)点击右下角的“Generate Code”,重新生成代码,使用MDK重新打开生成的工程,打开“MainView.hpp”,将其中滚动条响应函数“sliderValueChanged(int )”删除。


图 6-21 删除滚动条交互操作响应函数

8)打开“MainView.cpp”,将其中的滚动条响应函数、随机数发生器函数删除,本例中不需要使用。


图 6-22 删除滚动条交互操作响应函数和随机函数发生器

然后修改“MainView.cpp”,增加包含文件“main.h”(含ADC_HandleTypeDef结构体的定义),增加外部变量“hadc1”、 AdcConvertedValue[100]”、

“adcDmaOverFlag”申明,这些变量均在main.c中定义。如下图所示:


图 6-23 修改“MainView.cpp”将采样结果更新到动态图显示

如上图所示,在handleTickEvent()函数中,每隔100个handleTickEvent周期(每个周期约20ms),查询DMA中断标志位adcDmaOverFlag是否为1,如果为1,则表示DMA中断已经产生,100个点已经采样结束,可以将100个采样数据更新到动态图上面进行显示。显示完毕之后,将DMA中断标志位adcDmaOverFlag置为0,并重新开始下一轮采样。下一轮新的100个采样结果会将存储在数组中旧的采样结果覆盖。

9)程序编译,下载,在开发板背面的输出端子PB1(A0)和GND管脚上,使用信号源,输入幅值为3伏、直流偏移为1.5伏、频率为100KHz、占空比为50%的方波,如下图所示:


图 6-24 方波信号输入测试图

开发板所显示的动态图如下:


 6-25 采样结果显示图

由上图可以看出,对于100KHz的输入信号,每个周期约有24个采样点,可验证单通道采样率为2.4MHz。

读者可改变输入波形,查看ADC采样的波形图,注意信号源给出的电压范围不要超过0-3.3伏,这是STM32F469的ADC的输入范围。



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1