/

STM32外接DAC模块MCP4725

我最近在使用STM32F411CEU最小系统板做开发,但发现它并不自带DAC数模转换模块,所以我选择外接DAC模块MCP4725

准备材料

STM32系列开发板

我这里对MCP4725的使用方法理论上都是通用的,所以对芯片的要求并不严格。
我使用STM32F411CEU
它拥有最高100MHz的主频,官方文档
STM32F411CEU

MCP4725数模转换模块

MCP4725价格低廉,使用I2C接口(拉了拉了)
官方文档
MCP4725 Breakout

面包板杜邦线若干

众所周知,杜邦线是会自己消失的

代码

在cubemx中打开I2C接口
在项目文件夹内/Core/lnc/内建立文件MCP4725.h,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//MCP4725 Driver
#ifndef INC_MCP4725_H_
#define INC_MCP4725_H_

#include "stdint.h"
#include "stm32f4xx_hal.h"

#define MCP4725_ADDRESS 0xc0
#define MCP4725_READ 0x01
#define MCP4725_DAC 0x40
#define MCP4725_DAC_EEPROM 0x60

void MCP4725_Out(I2C_HandleTypeDef *hi2c,uint16_t outputValue,uint8_t writeMode);

#endif /* INC_MCP4725_H_ */

这里需要注意一下,根据官方文档,为了使一块板子上可以使用更多个MCP4725,MCP4725的A0引脚可以选择上拉或者下拉,当下拉时,MCP4725的地址为0x60,上拉时为0x61,不拉时默认下拉。我这里使用默认下拉0x60地址,抄代码时请按需修改。
在项目文件夹内/Core/Src/内建立文件MCP4725.c,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//MCP4725 Driver

#include "MCP4725.h"
#include "stdint.h"

void MCP4725_Out(I2C_HandleTypeDef *hi2c,uint16_t outputValue,uint8_t writeMode){
uint8_t buffer[3]={0x00};
uint32_t flag=0;
if(writeMode==1){
buffer[0]=MCP4725_DAC_EEPROM;
}
else{
buffer[0]=MCP4725_DAC;
}
outputValue=outputValue * 4096 / 3300.0f;//3300表示标准电压3.3v,按需修改
buffer[1]=(outputValue/16);
buffer[2]=(outputValue%16)<<4;

flag=HAL_I2C_Master_Transmit(hi2c,MCP4725_ADDRESS,buffer,3,1000);

HAL_Delay(1);
}

下一步在主函数中做出修改
加入头文件

1
2
#include "MCP4725.h"
#include "MCP4725.c"

调用实例

1
MCP4725_Out(&hi2c1,2000,1)//在i2c1接口的MCP4725上输出2000mv电压

总结

这款MCP4725模块价格实惠,但i2c接口实在拉跨。以上教程实现了傻瓜式调用,总结一句就是

有手就行