我们都知道微控制器仅适用于数字值,但在现实世界中,我们必须处理模拟信号。这就是为什么使用 ADC(模数转换器) 将现实世界中的模拟值转换为数字形式以便微控制器可以处理信号的原因。但是,如果我们需要来自数字值的模拟信号怎么办,那么这里就是 DAC(数模转换器)。
数模转换器的一个简单示例 是在录音棚中录制歌曲,在录音棚中,歌手使用麦克风并唱歌。这些模拟声波被转换为数字形式,然后存储在数字格式的文件中,当使用存储的数字文件播放歌曲时,这些数字值将转换为用于扬声器输出的模拟信号。因此,在此系统中使用了DAC。
DAC可用于许多应用, 例如电机控制,LED灯的控制亮度,音频放大器,视频编码器,数据采集系统等。
我们已经将MCP4725 DAC模块与Arduino接口。今天,我们将使用相同的MCP4725 DAC IC通过STM32F103C8微控制器设计数模转换器。
所需组件
- STM32F103C8
- MCP4725 DAC IC
- 10k电位器
- 16x2 LCD显示屏
- 面包板
- 连接线
MCP4725 DAC模块(数模转换器)
MCP4725 IC是一个 12位数模转换器模块 ,用于产生(0至5V)的输出模拟电压,并通过I2C通信进行控制。它还带有板载非易失性存储器EEPROM。
该IC具有12位分辨率。这意味着我们使用(0到4096)作为输入来提供相对于参考电压的电压输出。最大参考电压为5V。
计算输出电压的公式
O / P电压=(参考电压/分辨率)x数字值
例如, 如果我们使用5V作为参考电压,并假设数字值为2048。那么计算DAC输出。
O / P电压=(5/4096)x 2048 = 2.5V
MCP4725的引脚排列以下是MCP4725的图像,其中清楚地指出了引脚名称。
MCP4725的引脚 |
采用 |
出 |
输出模拟电压 |
地线 |
GND输出 |
SCL |
I2C串行时钟线 |
SDA |
I2C串行数据线 |
VCC |
输入参考电压5V或3.3V |
地线 |
输入地 |
MCP4725中的I2C通信
该DAC IC可以使用I2C通信与任何微控制器接口。I2C通信仅需要两条线SCL和SDA。默认情况下,MCP4725的I2C地址为0x60。点击链接以了解有关STM32F103C8中I2C通信的更多信息。
STM32F103C8中的I2C引脚:
SDA: PB7或PB9,PB11。
SCL:PB6或PB8,PB10。
电路图和说明
STM32F103C8和16x2 LCD之间的连接
LCD引脚号 |
LCD引脚名称 |
STM32引脚名称 |
1个 |
地面(地) |
地线(G) |
2 |
VCC |
5伏 |
3 |
VEE |
电位器中心的引脚用于对比 |
4 |
寄存器选择(RS) |
PB11 |
5 |
读/写(RW) |
地线(G) |
6 |
启用(EN) |
PB10 |
7 |
数据位0(DB0) |
无连接(NC) |
8 |
数据位1(DB1) |
无连接(NC) |
9 |
数据位2(DB2) |
无连接(NC) |
10 |
数据位3(DB3) |
无连接(NC) |
11 |
数据位4(DB4) |
PB0 |
12 |
数据位5(DB5) |
PB1 |
13 |
数据位6(DB6) |
PC13 |
14 |
数据位7(DB7) |
PC14 |
15 |
LED正极 |
5伏 |
16 |
LED负极 |
地线(G) |
MCP4725 DAC IC和STM32F103C8之间的连接
MCP4725 |
STM32F103C8 |
万用表 |
SDA |
PB7 |
数控 |
SCL |
PB6 |
数控 |
出 |
PA1 |
阳性探针 |
地线 |
地线 |
负探针 |
VCC |
3.3伏 |
数控 |
还连接了一个电位计,其中心引脚连接到STM32F10C8的PA1模拟输入(ADC),左引脚连接到GND,最右端连接到STM32F103C8的3.3V。
在本教程中,我们将连接MCP4725 DAC IC和STM32,并使用10k电位计为STM32 ADC引脚PA0提供模拟输入值。然后使用ADC将模拟值转换为数字形式。之后,将这些数字值通过I2C总线发送到MCP4725。然后使用DAC MCP4725 IC将这些数字值转换为模拟值,然后使用STM32的另一个ADC引脚PA1从OUT引脚检查MCP4725的模拟输出。最后,在16x2 LCD显示屏上同时显示ADC和DAC值以及电压。
编程STM32F103C8进行数模转换
现在不需要FTDI程序员将代码上传到STM32F103C8。只需通过STM32的USB端口将其连接到PC,然后使用ARDUINO IDE开始编程即可。访问此链接以了解有关在Arduino IDE中编程STM32的更多信息。最后给出了该STM32 DAC教程的完整程序。
首先包括I2C和LCD使用图书馆wire.h,SoftWire.h和liquidcrystal.h库。在此处了解有关STM32微控制器中I2C的更多信息。
#包括
接下来根据与STM32F103C8连接的LCD引脚定义和初始化LCD引脚
const int rs = PB11,en = PB10,d4 = PB0,d5 = PB1,d6 = PC13,d7 = PC14; LiquidCrystal LCD(rs,en,d4,d5,d6,d7);
然后定义MCP4725 DAC IC的I2C地址。MCP4725 DAC默认I2C地址为0x60
#define MCP4725 0x60
在void setup()中
首先在STM32F103C8的PB7(SDA)和PB6(SCL)引脚上开始I2C通信。
Wire.begin(); //开始I2C通讯
接下来,将LCD显示器设置为16x2模式并显示欢迎信息。
lcd.begin(16,2); lcd.print(“电路图摘要”); 延迟(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print(“ STM32F103C8”); lcd.setCursor(0,1); lcd.print(“带有MCP4725的DAC”); delay(2000); lcd.clear();
在void loop()中
1.首先在缓冲区中放入控制字节值(0b01000000)。
(010在写模式下设置MCP4725) 缓冲区= 0b01000000;
2.以下语句从引脚PA0读取模拟值,并将其转换为0到4096之间的数字值,因为ADC为12位分辨率,并存储在变量 adc中 。
adc = AnalogRead(PA0);
3.以下语句是一个公式,用于根据3.3V的基准电压从ADC输入值(0至4096)计算电压。
浮动ipvolt =(3.3 / 4096.0)* adc;
4.通过移位4位,以在左移4位到右ADC变量,和最显著位值在缓冲器把大多数显著位值在缓冲 ADC 变量。
缓冲区= adc >> 4; 缓冲区= adc << 4;
5.以下语句从STM32的ADC引脚PA1读取模拟值,该引脚是DAC输出(MCP4725 DAC IC的OUTPUT引脚)。该引脚也可以连接到万用表以检查输出电压。
unsigned int AnalogicRead = AnalogRead(PA1);
6.此外,使用以下语句使用公式计算来自变量 Analogread 的电压值。
浮动电压=(3.3 / 4096.0)*模拟读取;
7.在同一个 void循环() 中,几乎没有其他语句,下面将进行解释
从MCP4725开始传输:
Wire.beginTransmission(MCP4725);
将控制字节发送到I2C
Wire.write(缓冲区);
将MSB发送到I2C
Wire.write(缓冲区);
将LSB发送到I2C
Wire.write(缓冲区);
结束传输
Wire.endTransmission();
现在使用lcd.print()在LCD 16x2显示屏上显示这些结果
lcd.setCursor(0,0); lcd.print(“ A IP:”); lcd.print(adc); lcd.setCursor(10,0); lcd.print(“ V:”); lcd.print(ipvolt); lcd.setCursor(0,1); lcd.print(“ D OP:”); lcd.print(analogread); lcd.setCursor(10,1); lcd.print(“ V:”); lcd.print(opvolt); 延迟(500); lcd.clear();
使用STM32测试DAC
当我们通过旋转电位计来改变输入ADC的值和电压时,输出DAC的值和电压也会改变。此处,输入值显示在LCD显示的第一行中,输出值显示在第二行。万用表也连接到MCP4725输出引脚,以验证模拟电压。
带有演示视频的完整代码如下。