STM32CubeMX学习笔记5:ADC模数转换电压至串口输出

2019-07-18来源: eefocus关键字:STM32CubeMX  ADC  模数转换  串口输出

MCU:STM32F103ZET6


IDE:  MDK-ARM V5 +STM32CubeMX5.0.0


串口调试助手:SSCOM3.2



功能描述:通过ADC1通道1采样外部电压值,将采样的AD值和转换后的电压值通过串口打印出来。需要配置的有USART1和ADC。


一. 在 Pinout&Configuration---System Core中:

1. 首先设置时钟RCC的HSE(外部高速时钟)为晶振模式:Crystal/ceramic Resonator


2. 设置系统SYS的Debug为Serial Wire:


二. 在 Pinout&Configuration---Analog和Connectivity中:

1. 设置PA1为ADC1_IN1模式:

根据原理图可知ADC1的通道1的引脚为PA1,因此设置PA1为ADC1_IN1模式。


        

        

2. 在Configuration的Parameter Settings中设置ADC1的参数:


分别设置模式,单单个扫描和单次扫描,并在规则通道参数设置中设置为软件触发的方式。(对应的标准库代码在右上角)。


3. 打开USART1,并设置模式为异步收发模式Asynchronous:


4. 设置USART1的参数,通用的“96-N-8-1”模式,即波特率9600,N校验位(无校验),数据位数为8,停止位为1位:


三.在 Clock Configuration中:

配置时钟为72 Mhz。



四.在 Project Manager---Project中:

1.设置项目的名称以及保存的位置,选择Toolchain/IDE为MDK-ARM V5,

Tips:最好把Linker Settings中的Minimum Heap Size设置为0x600。



2.在Code Generator选项中如下勾选:


最后点Generate Code生成代码,并选择“Open Project”:


五.代码分析与改写:

和笔记4相同,同样需要用到串口输出的功能,首先将printf()函数的输出功能映射到串口上:


1. 首先在main.c中进行宏定义:

 

/* Private function prototypes -----------------------------------------------*/

#ifdef __GNUC__

  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__ */

2. 对于MDK-ARM编译器,在main.c中加入重定向函数:(此处与官方例程中不同,将&UartHandle改为&huart1)

/* USER CODE BEGIN 0 */

int fputc(int ch,FILE *f)

{

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);

return ch;

}

/* USER CODE END 0 */

3. 在main.c中设置变量用于存储AD和电压值:(注意VOL_Value一定是浮点型的)


 /* USER CODE BEGIN 1 */

uint16_t ADC_Value;

float VOL_Value;

  /* USER CODE END 1 */

4.在while(1)循环中添加AD与电压转换程序:


步骤依次为:


① HAL_ADCEx_Calibration_Start()//校准ADC


② HAL_ADC_Start()//开启ADC


③ HAL_ADC_PollForConversion()//等待转换过程


④若if循环判断转换完成后,HAL_ADC_GetState()获取AD值存在ADC_Value中并打印。


⑤将AD值转换为电压值存在VOL_Value中并打印。


/* USER CODE BEGIN WHILE */

  while (1)

  {

HAL_ADCEx_Calibration_Start(&hadc1);  //校准

HAL_ADC_Start(&hadc1);   //开启

HAL_ADC_PollForConversion(&hadc1,50);  //等待转换完成

if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))

{

ADC_Value=HAL_ADC_GetState(&hadc1);

printf("检测AD值为:%drn",ADC_Value);

VOL_Value=ADC_Value*3.3/4096;

printf("检测电压值为:%.2fV rn",VOL_Value);

}

HAL_Delay(200);

    /* USER CODE END WHILE */

至此应该是完成了HAL库下ADC转换读取电压的程序,但是不知是硬件出了问题还是软件有逻辑错误,我的电压值一直很小,变化也不大,希望有遇到相同问题的朋友可以交流一下。(基于标准库函数的程序也遇到了这个问题)。


2019/2/20 10:23 更新:


针对上述问题,经过反复检查程序找到了问题。源程序如下:


u16 Get_ADC_Value(u8 ch,u8 times)   //获取AD转换值的结果

{

u8 t;

u8 temp_val=0;

ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); //最大的转换周期,239.5个

for (t=0;t

{

ADC_SoftwareStartConvCmd(ADC1,ENABLE); 

while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));  //转换完成后退出

temp_val+=ADC_GetConversionValue(ADC1);

delay_ms(5);

}

return temp_val/times;

temp_val的取值范围是0-4095,因此应定义为32位的变量:u8 temp_val=0→u32 temp_val=0;


针对HAL库中程序,一定要定义VOL_Value为浮点型的。


则会得到正确的结果:


关键字:STM32CubeMX  ADC  模数转换  串口输出

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468396.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32CubeMX学习笔记4:printf( )重定向到USART串口输出(参考官方例程)
下一篇:STM32CubeMX学习笔记6:按键控制DMA串口发送

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

关于由CubeMx生成stm32f4+freertos,不正常分析之堆栈大小设置

freertos官方手册上有说,移植中出现的问题大多数是由堆栈设置不合理造成的,今天结合自身遇到问题分析一下1.任务堆栈设置过小,很容易造成硬件溢出,跳转到void HardFault_Handler(void);调试方法,可以通过调用函数,UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );来跟踪剩余堆栈,不过在CubeMx中的Configuration->FreeRtos->Include parameters中使能uxTaskGetStackHighWaterMark函数;2.整体设置过小,TOTAL_HEAP_SIZE
发表于 2019-08-23

CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器

先上图如图 是我生成的一个波形  这个波形的占空比在连续的四个周期内分别是10%,20%,30%,40%, 并且按照这个顺序循环这里大致介绍一下实现的方式。使用的软件是Cubemx(库函肯定也可以实现)第一步是器件选型  这一部分不做介绍  用的是Stm32F407第二是时钟配置接下来是定时器配置 第三步就是生成代码了这里 需要在生成的代码里面加上一行开始的代码。
发表于 2019-08-23
CubeMX Stm32F407生成一定周期的占空比不同的方波DMA+定时器

STM32F429-DISCO上手,stm32cubeMX与IAR学习,中断及Printf

stm32f429及stm32f439已经带有LTDC控制器,意味着可以输出RGB888及RGB565的图像信号,这与以往的单片机CPU8080接口LCD有很大不同,也是入手STM32F429-DISCO的原因,价格不贵,mouser上不含税150,淘宝180,非常适合学习。STM推出了一个叫STM32CUBEMX的软件,可以用来配置将要用到的模块,配置时钟树,输出源文件,相当给力。(不过貌似也有童鞋说坑,个人觉得挺好用的)芯片选型后配置JTAG(SWD),一个HSE(8MHz),两个GPIO_OUT,一个GPIO_IRQ(都是板子上有的东西)配置时钟树,有问题的会自动标成红色,特别要记下的就是SYSCLK(系统时钟),没什么好说
发表于 2019-08-15
STM32F429-DISCO上手,stm32cubeMX与IAR学习,中断及Printf

【STM32CubeMX】15,NVIC,中断优先级

以前虽然用到了中断,但很少用到中断优先级。现在必须有了,比如急停之类的。http://www.waveshare.net/study/article-641-1.html抢占优先级是用来判断一个中断是否可以打断另外一个中断的中断服务程序抢先运行。 响应优先级是用来判断抢占优先级相同的几个中断那个中断会优先响应。中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的四个比特位分配各个优先级数字所占的位数。例如3位用于抢占优先级(优先级有2^3=8种优先级),1位用于响应优先级(优先级有2^1=2种优先级)。 中断服务函数里面就调用了GPIO外部中断处理
发表于 2019-08-14
【STM32CubeMX】15,NVIC,中断优先级

【STM32CubeMX】11,STM32之CAN回环测试,过滤器的匹配设置

1,因为自己目前只有一块板子有CAN模块,所以先做CAN的回环测试。主要参考http://www.stm32cube.com/question/33下面的代码测试可以使用1-1,在CAN的编程中,主要是注意四大结构体,这几个都是自动生成的,1、CAN_HandleTypeDef  hcan1;// CAN handle Structure definition首先定义CAN的处理结构体,hcan1内部包括了3、CanTxMsgTypeDef; 4、CanRxMsgTypeDef;的头地址2、CAN_FilterConfTypeDef  sFilterConfig;// CAN filter
发表于 2019-08-14
【STM32CubeMX】11,STM32之CAN回环测试,过滤器的匹配设置

【STM32CubeMX】10,STM32之FSMC 之TFTLCD,移植,显示变量

1,学了这章之后,主要掌握了怎么移植标准库的函数2,对.c .h文件的#include文件的修改3,在LCD中,最关键的是读写命令地址的书写4,LCD的初始化可以看给的参考例程5,变量的显示sprintf函数https://baike.baidu.com/item/sprintf/9703430?fr=aladdinhttp://www.openedv.com/posts/list/61386.htm6,在stm32 例子的 c语言 程序中看到这样一句 *(__IO uint16_t *) (((uint32_t)0x60020000) ) 7,fsmc目前还没怎么操作它,看以后怎么用吧
发表于 2019-08-14
【STM32CubeMX】10,STM32之FSMC 之TFTLCD,移植,显示变量

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved