STM32CubeMX学习教程之八:DAC输出电压,ADC读取电压并输出到串口

原创 2018年04月16日 13:44:57

这一篇教程目标是由DAC输出一个阶梯电压,把它连接到一个ADC,由ADC读取这个电压并输出到串口。

软件:

STM32CubeMX V4.25.0  

System Workbench V2.4

硬件:OneNet 麒麟座V2.3

首先用一条杜邦线短接PA4和PA6两个引脚。我们会把PA4配置为DAC,PA6配置为ADC。

在STM32CubeMX中新建项目,选择正确的MCU型号


首先设置RCC和SYS,如下图


配置USART1为Asychronous模式

UART1配置用默认的115200,8, None和1就好。


然后设置PA4为DAC_OUT1, PA6引脚为ADC2_IN6, 完整引脚配置如下图:


然后根据板子实际情况设置时钟(麒麟座外部晶振是12M,STM32F103x的最高主频是72M),注意CubeMX可能会自动把ADC预分频系数设为6。


DAC和ADC设置都使用默认设置


Project - setting ,ToolChain/IDE选择 SW4STM32


勾选这里


保存以后,点击任务栏的生成代码图标


生成完毕以后在弹出的对话框点击"Open Project", System Workbench自动打开Eclipse并导入和打开了项目。

参考前面文章的printf()重定向到串口的代码,编辑main.c, 添加如下代码


[csharp] view plain copy
  1. /* Private function prototypes -----------------------------------------------*/  
  2. #ifdef __GNUC__  
  3. /* With GCC, small printf (option LD Linker->Libraries->Small printf 
  4.    set to 'Yes') calls __io_putchar() */  
  5. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  
  6. #else  
  7. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  
  8. #endif /* __GNUC__ */  
  9.   
  10. /* Private functions -------------------------------------------------  
[csharp] view plain copy
  1. /* USER CODE BEGIN 0 */  
  2.   
  3. PUTCHAR_PROTOTYPE  
  4. {  
  5.     HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);  
  6.     return ch;  
  7. }  
  8. /* USER CODE END 0 */  

然后修改main.c,添加两个变量存储DAC和ADC的值

[csharp] view plain copy
  1. /* USER CODE BEGIN 1 */ 
  2. int16_t DAC_Value; 
  3. int16_t ADC2_Value;  
  4. /* USER CODE END 1 */  

输出内容:

/* USER CODE BEGIN 3 */
	  if (DAC_Value >= 3967)
	  {
		  DAC_Value = 0;
	  }
	  DAC_Value += 128;
	  printf("DAC Value : %d \r\n",DAC_Value);
	  HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, DAC_Value);
      HAL_Delay(500);
      HAL_ADC_Start(&hadc2);
      HAL_ADC_PollForConversion(&hadc2, 50);

      if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc2), HAL_ADC_STATE_REG_EOC))
      {
          ADC2_Value = HAL_ADC_GetValue(&hadc2);
          printf("ADC2 Reading : %d \r\n",ADC2_Value);
          printf("PA6 Voltage : %.4f \r\n",ADC2_Value*3.3f/4096);
          printf("\r\n");
      }

      HAL_Delay(2000);
  }
  /* USER CODE END 3 */

注意这里printf()输出浮点数%.4f会提示错误: 

The float formatting support (-u _printf_float) is not enabled from linker flags

所以需要在这里添加一个-u _printf_float

project properties > C/C++ Build > Settings > Tool Settings (TAB) > MCU GCC Linker > Miscellaneous > Linker flags

把-specs=nosys.specs -specs=nano.specs 改为 -specs=nosys.specs -specs=nano.specs -u _printf_float

最后,不要忘记把STM32Cube_FW_F1_V1.6.0\Projects\STM3210C_EVAL\Examples\UART\UART_Printf\syscalls.c 文件复制到src目录,很多教程没有提到这点。如果不复制这个文件,那么printf()是不起作用的。

然后右键点击项目,选择Properties, Run-Debug Settings, 点击右侧的New,在弹出对话框中选择Ac6 STM32 Debugging。


然后任务栏上点击Run图,当然会报错的,原因请查看另一篇我的博客(https://blog.csdn.net/toopoo/article/details/79680323),所以需要右键点击  项目名Run.cfg ,给它改个名字,


然后右键点击项目树里面的项目名称,选择“Propeties”,然后在Run/Debug Settings-选择项目名-Edit-Main-C/C++Application那里点击“Search Project”,然后选择出现的默认的elf文件:


然后在Debugger-User Defined-Browse 那里选择你自己改名的配置文件:


然后右键点击那个新的cfg文件,选择"Open With - Text Editor", 进行如下更改:

source [find interface/stlink.cfg] 更改为 source [find interface/stlink-v2.cfg]

reset_config srst_only srst_nogate connect_assert_srst 这一行改为 reset_config none 

然后再Run一下,就可以了。


然后使用串口程序,波特率设为115200,就可以看到如下这些信息:


DAC Value : 128 
ADC2 Reading : 66 
PA6 Voltage : 0.0532 

DAC Value : 256 
ADC2 Reading : 193 
PA6 Voltage : 0.1555 

DAC Value : 384 
ADC2 Reading : 321 
PA6 Voltage : 0.2586 

DAC Value : 512 
ADC2 Reading : 448 
PA6 Voltage : 0.3609 

DAC Value : 640 
ADC2 Reading : 576 
PA6 Voltage : 0.4641 

DAC Value : 768 
ADC2 Reading : 704 
PA6 Voltage : 0.5672 

DAC Value : 896 
ADC2 Reading : 832 
PA6 Voltage : 0.6703 

DAC Value : 1024 
ADC2 Reading : 1140 
PA6 Voltage : 0.9185 

DAC Value : 1152 
ADC2 Reading : 1089 
PA6 Voltage : 0.8774 

DAC Value为1152时,麒麟座的蜂鸣器开始鸣叫,因为PA4引脚是蜂鸣器的使能引脚,0.8V已经能让蜂鸣器工作了。

DAC和ADC读数有差距是因为线材的压降和噪声的影响。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/toopoo/article/details/79959487

STM32_DAC输出电压

今天讲解“STM32F103 DAC输出电压”功能。   今天提供并讲解的软件工程,基于软件工程“A0.0.0(STM32F10x_TIM延时)”修改而来。若不知道如何而来,请关注微信公众号“Em...
  • ybhuangfugui
  • ybhuangfugui
  • 2016-05-07 21:35:51
  • 8357

ADC测量实时电压值并通过串口显示总结

第三期的任务是ADC实验,测量实时电压值并通过串口显示。做出的现象是可以显示电压值,但数值误差很大,提供3.3V电压源,一端接电压源地线,另一端接PA5引脚,测量这两端电压值,测出的数据在1.800V...
  • qq_41156336
  • qq_41156336
  • 2018-02-02 15:53:26
  • 110

STM32CubeMX创建工程实现双DAC波形输出

STM32Cube软件生成初始化代码,极大减少代码工作。同样在STM32F103板实现双DAC波形输出 生成keil里面的工程后,在main主程序里添加 /* USER CO...
  • mcubbs
  • mcubbs
  • 2016-12-25 22:46:20
  • 1768

STM32F0xx_DAC输出电压配置详细过程

前言 数模转换DAC的功能在现实应用中所占的分量,相对定时器TIM、串口USART等要小的多,这也是ST为什么内部集成DAC模块相对来说不是那么多的原因。但在有需要使用数模转换功能的项目中,自带的这...
  • ybhuangfugui
  • ybhuangfugui
  • 2016-06-02 21:11:08
  • 2793

C8051F020实现ADC采样芯片外的模拟电压,通过LCD显示,并通过串口发送到PC机

C8051F020实现ADC采样芯片外的模拟电压,通过LCD显示,并通过串口发送到PC机 /*****************************************************...
  • qq_28796345
  • qq_28796345
  • 2015-11-30 21:09:43
  • 1283

STM32CubeMX学习教程之七:ADC读取电压并输出到串口

软件:STM32CubeMX V4.25.0  System Workbench V2.4硬件:OneNet 麒麟座V2.3在STM32CubeMX中新建项目,选择正确的MCU型号首先设置RCC和SY...
  • toopoo
  • toopoo
  • 2018-04-16 11:57:55
  • 14

STM32CubeMX:DAC

芯片:STM32F103VET6 应用管脚: DAC_OUT2(PA5) 实现DAC输出0~3.3V可调电压。 配置界面 DAC配置(无需修改) ...
  • anchises
  • anchises
  • 2016-08-03 16:27:20
  • 1406

STM32之DAC固定电压输出配置

STM32F103VCT6自带两个12位DAC,DAC的转换速度一直没有查到,网上有人说是1MHZ的频率,那就是1us了。ADC的转换时间在56MHZ工作频率下为1us,在72MHZ工作频率下为1.1...
  • u011418715
  • u011418715
  • 2014-06-22 20:38:42
  • 1482

【stm32f407】DAC实验

一.描述 STM32F4的DAC模块(数字/模拟转换模块)是12位数字输入,电压输出型的DAC。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置...
  • XiaoXiaoPengBo
  • XiaoXiaoPengBo
  • 2017-06-15 12:04:54
  • 2205

基于STM32CubeMX的adc之DMA传输

  • 2016年08月30日 21:57
  • 23.46MB
  • 下载
收藏助手
不良信息举报
您举报文章:STM32CubeMX学习教程之八:DAC输出电压,ADC读取电压并输出到串口
举报原因:
原因补充:

(最多只允许输入30个字)