ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:542.93KB ,
资源ID:28526043      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28526043.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(stm32 ADC多通道采样例程HAL库.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

stm32 ADC多通道采样例程HAL库.docx

1、stm32 ADC多通道采样例程HAL库Stm32 基于HAL库ADC多通道采样例程1、用cubemx建立工程,cubemx 5.3.0版本,芯片型号:stm32f103zet6(1)开启外部高速时钟HSE,配置系统时钟为72M注意:ADC1时钟配置为9MHz(2)配置串口1,设置好波特率并开启串口中断2、启用ADC1 通道1,3,4,5,6注意要先设置好通道数量才能配置,各自ADC通道的参数。Rank 是转换顺序,我们按1,2,3,4,5的顺序分别对应ADC1通道0,1,4,5,6。多通道采样要开启扫描工作模式,在这里我们还有开启连续转换方式,连续转换是在ADC转换按照约定的转换顺序全部通道

2、完成一次转换后,又自动启动下一次转换。3、启用ADC转换DMA传输,多通道转换时要启用ADC的DMA传输,才能在相应的通道转换完成后,DMA自动去获取转换值。中断方式没法在多通道采样时使用,因为在多通道扫描模式下,只有在最后一个通道转换结束时才会产生中断请求。而ADC数据寄存器是共用的,这时候进入中断取值只能得到一个通道的数值。4、到此,基础配置和ADC通道配置已经完成,接着我们设置工程名称和保存路径等就可以了,一般工程名和保存路径最好不要有中文,不然可能会出现一些意想不到的问题,在测试的过程中就遇到工程名或者保存路径中都用英文但是词组名称之间用空格隔开,在打开生成的工程文件后,向新建的分类文

3、件夹中添加自己写的xxx.c文件,就导致keil软件卡死,不知道是keil软件还是cubemx的问题。5、设置好工程名称和路径后就可以生成代码了,生成代码后我们选择打开工程。接着我们开始编写代码(1)首先我们要修改main函数的一个错误,就是在初始化时要把MX_DMA_Init()函数放在MX_ADC1_Init()函数之前执行,cubemx生成代码时MX_DMA_Init()是在ADC初始化函数之后。如果在后面则转换时打印输出的ADC值,大多数都为0,具体原因就不知道是怎么回事了,应该是cubemx这个版本还不太稳定。接下来我们在usart.c文件中增加一些代码1)增加printf重定向到串

4、口的代码,并定义一个串口接收到数据的标志变量和数据缓冲数组。作用是在我们用串口调试助手给单片机发送数据时才打印输出ADC数据。uint8_t RecFlag,RxBuf512;【代码】:/重定向c库函数printf到USARTxstruct _FILE /标准库需要的支持函数 int handle; ;int fputc(int ch, FILE *f) while(huart1.Instance-SR&0X40)=0);/循环发送,直到发送完毕 huart1.Instance-DR = (uint8_t)ch ; return (ch);2)编写串口数据接收函数void My_UsartDa

5、teRec(UART_HandleTypeDef *huart),这里就不在回调函数中编写了,然后stm32f1xx_it.c文件中的串口中断函数中调用这个函数来接收串口数据。此外我们还需要在串口初始化函数void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)中,增加使能串口接收中断和空闲中断。_HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); /使能接收中断_HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);/使能空闲中断 记得在stm32f1xx_it.c文件开始部分包

6、含usart.h头文件。【代码】:void My_UsartDateRec(UART_HandleTypeDef *huart)/ uint8_t temp=0; static unsigned int num; /接收计数 /查询是否发生了空闲中断 if(_HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE)!=RESET&_HAL_UART_GET_IT_SOURCE(huart,UART_IT_IDLE)!=RESET) RecFlag =1;/收到数据 num=0; _HAL_UART_CLEAR_IDLEFLAG(huart);/清除空闲中断 else if

7、(_HAL_UART_GET_IT_SOURCE(huart,UART_IT_RXNE)!=RESET)/帧传输未完成,按字节接收 if(num Instance-DR); / else /缓冲区溢出 / temp=huart-Instance-DR; _HAL_UART_CLEAR_FLAG(huart,UART_FLAG_RXNE); (2)在adc.c文件中增加代码1)定义采样次数和通道数量,ADC数据保存数组【代码】:#include adc.h/* USER CODE BEGIN 0 */#include string.h#define M 20 /采样次数#define N 5 /

8、通道数#if N1 volatile uint16_t ADC_ValueN;/多个通道定义成数组#else uint16_t ADC_Value;#endif/uint8_t GetADCtimes=20,ChannelNums;/采样次数和通道数volatile uint16_t ADC_ValBuf100=0;/100=20*5 ADC_ValBuf/* USER CODE END 0 */ADC_HandleTypeDef hadc1;DMA_HandleTypeDef hdma_adc1;2)编写ADC计算平均值函数void Get_ADC_AverageValue(void),并在

9、adc.h中声明。【代码】:/* USER CODE BEGIN 1 */#if N1/*多通道按顺序循环转换,ADC值也按顺序存放在ADC_Value数组中*/void Get_ADC_AverageValue(void) uint32_t sumN=0; uint16_t i,j; for(i=0;iM;i+) /sum0对应通道0,sum1对应通道1 for(j=0;jN;j+) sumj+=ADC_ValBufi*N+j; /获取各个通道ADC值总和 for(i=0;iN;i+) ADC_Valuei=sumi/M;/计算平均值 #elsevoid Get_ADC_AverageVal

10、ue(void) uint32_t sum; uint16_t i; for(i=0;iM;i+) sum+=ADC_ValBufi; ADC_Value=sum/N;/计算平均值#endif/* USER CODE END 1 */(3)最后我们就可以编写main函数了Length变量是数据的个数,所以直接通过sizeof(ADC_ValBuf)/2来计算得出。首先,我们要在main函数开头的初始化部分调用ADC DMA启动函数,HAL_ADC_Start_DMA()函数中HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_ValBuf,sizeof(ADC_V

11、alBuf)/2);接着我们编写while循环中的函数。【代码】:while (1) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if(RecFlag=1) RecFlag=0; Get_ADC_AverageValue(); for(i=0;i4&i%5=0) printf (n); /打印出每个通道20次采样的数值 printf (%d ,ADC_ValBufi); printf(nn); printf (计算平均数后各通道的ADC值为:n); for(i=0;i5;i+) switch(i) /打印出计算平均数后每个通道的ADC值

12、case 0:printf (ADC1 Channel 0 Value:%dn,ADC_Valuei); break; case 1:printf (ADC1 Channel 1 Value:%dn,ADC_Valuei); break; case 2:printf (ADC1 Channel 4 Value:%dn,ADC_Valuei); break; case 3:printf (ADC1 Channel 5 Value:%dn,ADC_Valuei); break; case 4:printf (ADC1 Channel 6 Value:%dn,ADC_Valuei); break; /* USER CODE END 3 */到这里,我们在cubemx生成的工程文件中增加这些代码,就可以实现了ADC多通道采样。其中比较关键的是:ADC多通道采样需要启用扫描模式,并启用DMA接收ADC值(很重要),中断方式没法在多通道时实现ADC值接收。(4)结果测试首先,我们把通道0接到GND,把通道4和通道6接到3.3V,通道1和通道5不接入电压(悬空),然后用串口调试助手给单片机发送一个数据,按照设计的代码,程序将输出采样的ADC数据。我们可以看到,通道0 ,20次采样结果都为0;通道1,5显示浮空时的采样数据;通道4,6 数值都在4044左右。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1