STM32单片机基础20——使用DAC输出任意指定电压

本文详述了使用STM32CubeMX配置STM32L431RCT6单片机的DAC,以输出指定电压的过程。从硬件准备到MDK工程生成,再到代码编写和下载,每一步都提供了详细步骤。通过配置DAC通道和时钟源,实现了通过DAC输出0-4096对应0-3.3V的电压。
摘要由CSDN通过智能技术生成

本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的DAC外设,输出任意指定电压值。

1. 准备工作

硬件准备

mark

  • 万用表

软件准备

  • 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;

Keil MDK和串口助手的安装包都可以关注“小熊派开源社区”微信公众号,在资料教程一栏中可获取安装包。

2.生成MDK工程

选择芯片型号

打开STM32CubeMX,打开MCU选择器:

搜索并选中芯片STM32L431RCT6:

配置时钟源

  • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
  • 如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:

配置串口

小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:

<

开关电源具有体积小、效率高、重量轻、噪声低等优点,其应用越来越广泛。我们在设计蓄电池充电器时,就采用开关电源作为主电路,其中开关器件采用第三代IGBT,其主要优点是耐压高,驱动功率小,开关频率高,导通电阻小。 目前,数模转换器从接口上可分为两大类:并行接口数模转换器和串行接口数模转换器。并行接口数模转换器的引脚多,体积大,占用单片机的口线多;而串行数模转换器的体积小,占用单片机的口线少。 电源设计人员经常面临种种互相对立的要求。一方面要缩小体积、降低成本,另一方面又要提供更多功能并提高输出功率。受原理上的限制,模拟电源本身的功能有限,而模拟电源控制器的设计更是越来越复杂。由于这一原因,有些设计人员转向了纯数字电源设计。然而,对于许多设计人员来说,如此快速地转向不熟悉的领域并不容易。比较可行的一种折衷方法是采用传统模拟电源,但增加数字单片机做为前端。 这种设计的优点在于电源本身的控制仍然使用模拟技术来实现。因此电源设计人员不需要从头重新开始全数字设计就可以为现有设计增加新的功能。采用这种方法,设计中仍然使用熟悉的误差放大器、电流检测以及电压检测电路。当然,尽管有些设计单元(如补偿网络)仍然采用分立器件实现,但其余部分则由单片机来控制。 单片机能够带来的功能可分为四类:控制、监测、判断性功能及通信。控制功能与单片机和电源之间的硬件接口有关。有些电源控制器在内部生成控制信号(如参考电压)。这样的控制器为单片机提供的外部连接点很少。 目前,单片机在许多电源设计中的作用主要是监测。许多单片机都有片上模数转换器(ADC)和模拟比较器。因此,单片机在监测输入电压、输入电流、输出电压输出电压和温度等信号方面是理想之选。 单片机能够监测范围如此广泛的信号,就可以完成更多功能,如智能故障检测。单片机的多功能源于其可编程能力,可以方便地进行定制来满足设计要求。这样,对于故障情况就可以分类进行处理。短暂的过流以及其他非关键故障可能只需要设置一个标志就可以了。而过热这样的故障则可能需要关闭电源,直到故障排除。需要重新启动电源的故障也可以进行更严格的控制。在某个时间段内如果有太多的故障,单片机就可以永久关断电源。 由于采用接口简单的模拟数字转换器TLC5615,使得开关电源的硬件电路大为简化,线路板面积缩小,成本降低。
STM32F407单片机16bit_DAC_AD5689模拟量(-10V~10V)电压输出实验KEIL工程源码: int main(void) { uint16_t data=0xFFFF/2; double temp,opa; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); KEY_GPIO_Init(); printf("硬石DAC(AD5689)模块模拟量电压输出测试\n"); AD5689_Init(); AD5689_WriteUpdate_DACREG(DAC_A,data); AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data); printf("data:%d\n",data); opa=OPA_RES_R2/OPA_RES_R1; while(1) { if(KEY1_StateRead()==KEY_DOWN) { if(data>(0xFFFF-1000)) data=(0xFFFF-1000); data +=1000; AD5689_WriteUpdate_DACREG(DAC_A,data); AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data); temp=(double)(data*2-0xFFFF)*2500*opa/0xFFFF; //temp为目标电源值,这里先放大1000倍(方便计算而已),等后面显示再还原 //data是数字量DA值,当data取值为:0~0xFFFF对应AD5689输出为0~5V //本例程是输出-10V~10V,这个功能主要是靠运放实现,特殊的电路使得: //AD5689输出0V时对应运放输出-10V,AD5689输出2.5V对应运放输出0V,AD5689输出5V对应运放输出10V //(上面虽说是10V,实际上应该是 2.5V*opa(运放放大倍数),这里opa=40.2K/10K=4.02) //所以使得程序:data值为0时运放输出-10V, data为0xFFFF/2时输出运放输出0V,data为0xFFFF时输出运放输出10V //temp=(data-0xFFFF/2)/(0xFFFF/2)*2.5*1000*opa printf("data:%d->%0.3fV\n",data,temp/1000); } if(KEY2_StateRead()==KEY_DOWN) { if(data<1000) data=1000; data -=1000;
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值