赞
踩
目录
注:图片来源为(江科大自化协),在B站可以找到他的视频,stm32讲的很好很清楚,入门stm32很适合,他讲的是标准库,但原理都是一样的,大家可以听一下他的课程,相信好多内容会茅塞顿开的,课程是免费的。
stm32ADC不止一个通道,我们可以配置一个或者多个通道,并且为他们排任意一个序列,单次转换代表这些通道按序列依次转换完成就停止;连续转换是在最后一个序列转换结束后回到第一个序列循环开始,但在非扫描模式下只能转换一个序列;扫描模式是在不止一个序列时,自动按序列依次转换,可以通过判断对应标志位置位判断转换情况,我们可以判断标志位也可以设置中断来判断是否转换完成。
下面是图文介绍,便于理解,EOC代表转换完成标志位置位:
注: 1、2模式下为非扫描模式,只有第一个序列会被扫描;
1、单次转换,非扫描模式
2、连续转换、非扫描模式:
注: 3、4模式下,为扫描模式,每一个序列都会被转换,每次转换完成都会有标志位置位;
我们可以对配置好的通道任意排序,它会自动按排好的序列,自动转换。
3、单次转换,扫描模式
4、连续转换,扫描模式
1、DMA:DAM可以提供外设和存储器或者着存储器和存储器之间的告诉数据传输,无需CPU干扰,节省CPU资源;
2、DAM结构:
内存间数据转运:
ADC扫描模式+DMA:
进入软件后点击此处进入MCU型号选择:
查找型号,注意使用在英文状态下输入:
选择时钟源:
因为我们使用ST-Link,所以这里在SYS中选择调试(Debug)模式为串行线(Serial Wire):
在时钟配置里输入最高配置72MHz按下回车点击OK:
在项目管理页-->Project中设置三个地方:
注意:路径不要有中文
在项目管理页-->代码管理(Code Generator)中勾选第一个:
生成工程后可以选择打开工程也可以在刚才的保存路径下找到打开:
2、各种资源外设配置
Keil不用关闭,在工程文件中再次打开CUBEMX,根据我们的电路设计配置对应的外设接口:
我们这里配置五个ADC通道,分别是:左边摇杆俩个方向的行程、电源电压采集、右边摇杆俩个方向的行程;
2、ADC配置:
下面进行ADC的一些模式配置:
然后我们配置通道和序列:
配置DMA:
1、这里第一步相当于(四、DMA使用->2、DMA结构)中自动重装是否打开,Circular相当于开启自动重装,搬运完成要求的次数后继续重新开始;Normal不开启重装,比如要求搬运50次,那么50次之后需要再次开启才会搬运;
2、我们需要DMA将数据从ADC外设地址搬运到数组,所选择外设到内存(Memory);
3、选择半字是因为ADC数据长度位12位(该单片机为12位ADC),所以16位就够用。
生成代码:
切换到KEIL:
采集数据求平均值:
这里我做了一个示意图,红色箭头线条表示数据存储顺序:
在adc.c里面申明这些变量以及数组:
求平均值函数,在adc.c文件的最下方:
这是需要的程序,按照上图放在对应位置即可:
adc.c
- uint16_t ADC_Value[10][5];//ADC数据存放
-
- uint16_t left_x_sum=0;//左边摇杆X方向数据之和
- uint16_t left_y_sum=0;//左边摇杆Y方向数据之和
- uint16_t right_x_sum=0;//右边摇杆X方向数据之和
- uint16_t right_y_sum=0;//右边摇杆Y方向数据之和
- uint16_t battery_sum=0;//电池电量之和
-
- uint16_t left_x; //左边摇杆X方向数据均值
- uint16_t left_y; //左边摇杆Y方向数据均值
- uint16_t right_x; //右边摇杆X方向数据均值
- uint16_t right_y; //右边摇杆Y方向数据均值
- uint16_t battery; //电池电量均值
- void ADC1_Value_average(void)
- {
- for(int i=0;i<10;i++)
- {
- left_x_sum += ADC_Value[i][0];//行增加,列不变
- left_y_sum += ADC_Value[i][1];
- right_x_sum += ADC_Value[i][2];
- right_y_sum += ADC_Value[i][3];
- battery_sum += ADC_Value[i][4];
- }
- left_x = left_x_sum/10 ;//求均值
- left_y = left_y_sum/10 ;
- right_x = right_x_sum/10;
- right_y = right_y_sum/10;
- battery = battery_sum/10;
- left_x_sum=0;//求和变量清零不影响下次调用
- left_y_sum=0;
- right_x_sum=0;
- right_y_sum=0;
- battery_sum=0;
- }
因为这些变量在main.c中要引用,所以在adc.c中extern这些变量,使这些变量不会被重复定义,adc.h在配置好CUBEMX后会自动include在main.c中
adc.h
- extern uint16_t ADC_Value[10][5];
-
- extern uint16_t left_x;
- extern uint16_t left_y;
- extern uint16_t right_x;
- extern uint16_t right_y;
- extern uint16_t battery;
工程添加内容:
开启ADC和DMA:
开启ADC&DMA的这句函数每执行一次就存放50个数据,所以在每次存够50个数据后就可以就平均值,然后根据ADC采集数值大小执行相应动作,大家也可以在串口打印出来看一下数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。