我最近在使用STM32F411CEU最小系统板做开发,但发现它并不自带DAC数模转换模块,所以我选择外接DAC模块MCP4725
准备材料
STM32系列开发板
我这里对MCP4725的使用方法理论上都是通用的,所以对芯片的要求并不严格。
我使用STM32F411CEU
它拥有最高100MHz的主频,官方文档
MCP4725数模转换模块
MCP4725价格低廉,使用I2C接口(拉了拉了)
官方文档
面包板杜邦线若干
众所周知,杜邦线是会自己消失的
代码
在cubemx中打开I2C接口
在项目文件夹内/Core/lnc/
内建立文件MCP4725.h
,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #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
|
这里需要注意一下,根据官方文档,为了使一块板子上可以使用更多个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
|
#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; 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)
|
总结
这款MCP4725模块价格实惠,但i2c接口实在拉跨。以上教程实现了傻瓜式调用,总结一句就是
有手就行