datasheet

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

2019-06-15来源: eefocus关键字:STM32CubeMX  DAC  ADC  读取电压  串口

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


软件:


STM32CubeMX V4.25.0  


System Workbench V2.4


固件库版本:

STM32Cube FW_F1 V1.6.1


硬件:


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


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

#ifdef __GNUC__  

/* With GCC, small printf (option LD Linker->Libraries->Small printf 

   set to 'Yes') calls __io_putchar() */  

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

#else  

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

#endif /* __GNUC__ */  

  

/* Private functions -------------------------------------------------  

[csharp] view plain copy


/* USER CODE BEGIN 0 */  

  

PUTCHAR_PROTOTYPE  

{  

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

    return ch;  

}  

/* USER CODE END 0 */  

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


[csharp] view plain copy


/* USER CODE BEGIN 1 */ 

int16_t DAC_Value; 

int16_t ADC2_Value;  

/* USER CODE END 1 */  

 


输出内容:


 


/* USER CODE BEGIN 3 */

  if (DAC_Value >= 3967)

  {

  DAC_Value = 0;

  }

  DAC_Value += 128;

  printf("DAC Value : %d rn",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 rn",ADC2_Value);

          printf("PA6 Voltage : %.4f rn",ADC2_Value*3.3f/4096);

          printf("rn");

      }

 

      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.0ProjectsSTM3210C_EVALExamplesUARTUART_Printfsyscalls.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读数有差距是因为线材的压降和噪声的影响。


关键字:STM32CubeMX  DAC  ADC  读取电压  串口

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

上一篇:STM32CubeMX学习教程之九:串口与DMA
下一篇:STM32CubeMX学习教程之七:ADC读取电压并输出到串口

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

推荐阅读

STM32CubeMX下按键模块控制PWM蜂鸣器模块

中断服务时,有另一个优先级更高的中断提出中断请求,这时会暂时终止当前正在执行的级别较低的中断源的服务程序,去处理级别更高的中断源,待处理完毕,再返回到被中断了的中断服务程序继续执行,这个过程就是中断嵌套。如果中断里调用HAL_Delay就会停在那里,因为根本不会进入那个级别更低的中断。CUBE生成的程序中, SysTick是中断型延时,SysTick是内核中断,优先级别默认最低。所以我后面的延时函数使用了SysTick。了解中断之后就是STM32中的按键:按键需要上拉电阻,当按键按下接地,低电平导通,CPU读取低电平配置方法使按键对应的PC13和PA15为GPIO模式,勾上修改,将GPIO mode 设置为下降沿触发中断,设置电阻
发表于 2019-06-24
STM32CubeMX下按键模块控制PWM蜂鸣器模块

STM32CubeMx(Keil5)开发之路——2点亮第一个LED灯

运行环境Windows10STM32CubeMX___Version 5.0.0Keil5(MDK5)___Version 5.15简介本例程主要讲解如何通过IO的输出高低电平实现LED灯的亮灭STM32CubeMx基本配置基础配置过程请参考 STM32CubeMx(Keil5)开发之路—1配置第一个项目STM32CubeMx GPIO配置查看电路图PC0—PC7为LED管脚,并且低电平点亮LED灯,这里只对PC0进行配置   1——在STM32CubeMx的芯片中鼠标左键点击选择PC02——点击选择GPIO_Output1——点击选择GPIO2——点击进行更细节的设置3——选择默认输出的高低电平
发表于 2019-06-21
STM32CubeMx(Keil5)开发之路——2点亮第一个LED灯

STM32CubeMx(Keil5)开发之路——3发送USART数据和printf重定向

运行环境Windows10STM32CubeMX___Version 5.0.0Keil5(MDK5)___Version 5.15简介本例程主要讲解如何通过串口发送数据和重定向printfSTM32CubeMx基本配置基础配置过程请参考 STM32CubeMx(Keil5)开发之路—1配置第一个项目STM32CubeMx USART1配置1——点击USART1进行设置2——模式选择Asynchronous异步传输3——可以看到右边自动出现了Tx和Rx4——可以自行设置波特率,停止位,校验位等参数代码修改1——选择main.c文件2——在USER CODE中添加如下代码,重定向printfint fputc(int ch
发表于 2019-06-21
STM32CubeMx(Keil5)开发之路——3发送USART数据和printf重定向

STM32CubeMx(Keil5)开发之路——4采用DMA方式收发数据

运行环境Windows10STM32CubeMX___Version 5.0.0Keil5(MDK5)___Version 5.15简介本例程主要讲解如何通过串口发送数据和重定向printfSTM32CubeMx基本配置基础配置过程请参考 STM32CubeMx(Keil5)开发之路—配置第一个项目STM32CubeMx USART1配置1——点击USART1进行设置2——模式选择Asynchronous异步传输3——可以看到右边自动出现了Tx和Rx4——可以自行设置波特率,停止位,校验位等参数1——选择DMA设置2——添加DMA3——添加DMA的Tx和Rx通道1——选择NVIC设置2——打开USART1全局中断3——随便设置一个
发表于 2019-06-21
STM32CubeMx(Keil5)开发之路——4采用DMA方式收发数据

STM32CubeMX(Keil5)开发之路——5定时器中断TIM

运行环境Windows10STM32CubeMX___Version 5.0.0Keil5(MDK5)___Version 5.15简介本例程主要讲解如何使用定时器实现一个定时器中断,每秒打印一串数据STM32CubeMx基本配置基础配置过程请参考 STM32CubeMx(Keil5)开发之路—配置第一个项目为了方便调试,重定向printf,进行usart设置1——点击USART1进行设置2——模式选择Asynchronous异步传输3——可以看到右边自动出现了Tx和Rx4——可以自行设置波特率,停止位,校验位等参数1——点击Clock Configuration进行设置2——注意这几个地方的时钟(后面进行分频设置的时候需要)点击
发表于 2019-06-21
STM32CubeMX(Keil5)开发之路——5定时器中断TIM

STM32CubeMX(Keil5)开发之路——6外部中断

运行环境Windows10STM32CubeMX___Version 5.0.0Keil5(MDK5)___Version 5.15简介本例程主要讲解如何设置外部中断,采用中断的方式按键是否按下,在中断中进行打印数据。STM32CubeMx基本配置基础配置过程请参考 STM32CubeMx(Keil5)开发之路—配置第一个项目STM32CubeMx 外部中断配置查看电路图,如下图所示K1——K3为外部输入引脚,连接PE2——PE4,并且按下按键时为低电平,因此待会儿需要设置为下降沿触发 为了方便调试,重定向printf,进行usart设置1——点击USART1进行设置2——模式选择Asynchronous异步传输
发表于 2019-06-21
STM32CubeMX(Keil5)开发之路——6外部中断

小广播

何立民专栏

单片机及嵌入式宝典

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

相关热搜器件

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