MCP4922 是双模拟DAC - 缓冲电压输出
设备由SPI串行接口控制。它输出一定比例的
输入电压。自呢's a 12bit device its
分辨率是VREF / 4096。所以你可以选择分割的非常好的步骤
from the reference.
有三种重要差异:
所以这的后果是:
该芯片在中找到了相同的同步功能 MCP4728 (LDACN控制信号)允许您同时更新输出。
该芯片采用标准14针PDIP,SOIC和TSSOP。
下载MCP4922数据表 这里 .
Parameter |
MCP4922 |
---|---|
Voltage Supply (Vs) |
2v7〜5v5 |
Abs. Max V DD. |
-0v3〜6v5 |
Interface |
spi. |
SPI rate |
到20MHz. |
Resolution |
12 bit |
掉电I(H / W,S / W)(典型,最大) |
(0.3ua,2ua)(3.3ua,6ua) |
没有负载电流(典型,最大@ 5V) | 350ua,700ua. |
短路(Vout = GND)(典型值,最大) |
15mA,24mA |
偏移错误(典型,最大) |
±0.02,1.00%FSR |
偏移误差漂移(-45〜25,25〜85°C,典型值) | ±0.16ppm,-0.44ppm |
INL (typ,max) LSB |
±2,±12 [3] |
DNL(MIN,TYP,MAX)LSB |
-0.75,±0.2,±0.75 [1] |
增益错误(典型,最大)%fsr | -0.1,1 |
Gain error drift |
-3 ppm /ºC |
Phase margin |
66º |
电容式负载稳定性(5K负载) |
ns. |
Slew rate |
0.55V /美国 |
输出电压稳定时间 |
4.5us |
工作温度 |
-40°C〜125°C |
该芯片在MCP4725的能力中非常相似,并且因为
this it
将具有类似的用途 - 除了拥有的最重要的差异
没有EEPROM并给你两个输出,就是它有能力的
非常高的速度操作。
如果你看看结果 MCP4725
- 即使仅具有非常低的速度波形,它是一种斗争
使用和Ardunio Uno(218Hz)的16个步骤,输出甚至是
使用更多步骤慢(除非使用更快的微控制器和使用
高速I2C)。即使使用Arduino UNO作为控制器,MCP4922也能够更快的操作。
芯片有几种用途:
对于MCL4922,您必须将LDACN连接到控制信号,否则输出将不会更新。
为了 MCP4728
有一个软件同步更新UDACN或硬件
同步更新LDACN。
警告: 您必须将LDACN连接到微控制器控制信号。
如果你不'关心受控同步然后是最简单的
这样做的方法是将LDACN连接到芯片选择CSN。这将意味着
输出在每个写入序列的末尾更新到A或B.
registers.
arduino. IDE:1.8.9+版
警告: LDACN必须连接到微控制器控制信号。
用于测试使用Arduino Uno并将其连接如下:
arduino. | MCP4922 |
---|---|
5V |
VDD. |
GND |
GND. |
11 (MOSI) |
SDI. |
12 (MISO) |
N / C. |
13 (SCK) | SCK. |
10 (CS) |
CSN. |
10(CS)或其他UC引脚 |
LDACN. |
VCC |
Shdnn. |
由于无法从MCP4922读取数据't connect MISO.
第一个示例使用BUIT调查性能速度
SPI硬件模块,而第二个调查使用Arduino
shiftOut() function.
下面的这草图是在完整的正弦波中使用32间隔(从上到下的16步)来设置。所以 输出经过360/32度,并获得每个的DAC结果 angle.
它生成一个正弦波,有16个步顶到底部。这是为了允许比较 MCP4725 结果.
注意:中断熄灭,因此波形没有"wobble". The first
example uses the "fast"内部SPI模块,而第二个使用
位撞击函数。
// MCP4922 Demo code sinewave at 16 res top to bot.
// For comparison to MCP4725 operation (DAC_RESOLUTION=-5).
#include <SPI.h>
#define DAC_RESOLUTION 5
#define DAC_ARRAY_INDICES (pow(2,DAC_RESOLUTION))
spi. Settings settingsA(16000000, MSBFIRST, spi. _MODE0); // At 16 = SPI Clock = 8MHz.
const PROGMEM uint16_t SineLookup_5bits[32]
{
2048, 2447, 2831, 3185, 3495, 3750, 3939, 4056,
4095, 4056, 3939, 3750, 3495, 3185, 2831, 2447,
2048, 1648, 1264, 910, 600, 345, 156, 39,
0, 39, 156, 345, 600, 910, 1264, 1648
};
在 t RCLKPin = 10; // pin 12 on the 74hc595 latch - nSS
在 t SRCLKPin = 13; // pin 11 on the 74hc595 shift register clock - SCK
在 t SERPin = 11; // MOSI
#define MARKER 4
//////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200); // Start serial port (debug).
pinMode(RCLKPin, OUTPUT); // Set SPI control PINs to output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
pinMode(MARKER, OUTPUT);
spi. .begin();
Serial.println("MCP4922 SPI Dual DAC SPI hardware mode");
noInterrupts();
}
//////////////////////////////////////////////////////////////////////////////
// 0 - A, 1 - B
//
void writeMCP4922_AB(byte AB, uint16_t v) {
v |=0xf000; // B15(A/B)=1 B, B14(BUF)=1 on, B13(GAn) 1=x1 B12(SHDNn) 1=off
if (!AB) v &= ~0x8000; // When zero clear B15 for A.
spi. .beginTransaction(settingsA);
digitalWrite(RCLKPin, LOW);
spi. .transfer( (0xff00 & v)>>8 );
spi. .transfer( 0x00ff & v );
digitalWrite(RCLKPin, HIGH);
spi. .endTransaction;
}
void loop() {
for ( 在 t i = 0; i < DAC_ARRAY_INDICES; i++) {
digitalWrite(MARKER, HIGH);
digitalWrite(MARKER, LOW);
writeMCP4922_AB( 0, pgm_read_word(&(SineLookup_5bits[i])) );
}
}
[素描:MCP4922-SPI-Module.ino]
示波器设置为每分为1V并显示输出 频率 of 1.475kHz.
时基:100US / div,黄色1V / div。
所以这种方法比MCP4725快得多。但是它仍然是
受Arduino Uno的速度有限。即使16MHz SPI时钟是
要求它只能达到8MHz。还记得这是一个低点
分辨率波形。添加更多步骤会慢下来。
以下波形显示8MHz的SPI时钟(即使是16MHz
被要求Arduno Uno只能提供8MHz - 合理的
Arduino的主时钟是16MHz):
时基:200ns / div,黄色2v / div。
MCP4922 2使用换档时的能力是多少?
ShiftOut功能是一个磁线串行输出发生器
可以以不同的方式配置。例如,您可以选择MSB或
LSB第一操作。 muti-functional的问题是那个时间
用于处理这些额外。
以下代码生成一个正弦波,具有16个步骤顶部到底部。这是为了允许比较 MCP4725 结果.
// MCP4922 Demo code sinewave at 16 res top to bot.
// For comparison to MCP4725 operation (DAC_RESOLUTION=-5).
#define DAC_RESOLUTION 5
#define DAC_ARRAY_INDICES (pow(2,DAC_RESOLUTION))
const PROGMEM uint16_t SineLookup_5bits[32]
{
2048, 2447, 2831, 3185, 3495, 3750, 3939, 4056,
4095, 4056, 3939, 3750, 3495, 3185, 2831, 2447,
2048, 1648, 1264, 910, 600, 345, 156, 39,
0, 39, 156, 345, 600, 910, 1264, 1648
};
在 t RCLKPin = 10; // pin 12 on the 74hc595 latch - nSS
在 t SRCLKPin = 13; // pin 11 on the 74hc595 shift register clock - SCK
在 t SERPin = 11; // MOSI
#define MARKER 4
//////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200); // Start serial port (debug).
pinMode(RCLKPin, OUTPUT); // Set SPI control PINs to output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
pinMode(MARKER, OUTPUT);
Serial.println("MCP4922 SPI Dual DAC");
}
//////////////////////////////////////////////////////////////////////////////
// 0 - A, 1 - B
//
void writeMCP4922_AB(byte AB, uint16_t v) {
v |=0xf000; // B15(A/B)=1 B, B14(BUF)=1 on, B13(GAn) 1=x1 B12(SHDNn) 1=off
if (!AB) v &= ~0x8000; // When zero clear B15 for A.
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLKPin, MSBFIRST, (0xff00 & v)>>8);
shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & v);
digitalWrite(RCLKPin, HIGH);
}
void loop() {
for ( 在 t i = 0; i < DAC_ARRAY_INDICES; i++) {
digitalWrite(MARKER, HIGH);
digitalWrite(MARKER, LOW);
writeMCP4922_AB( 0, pgm_read_word(&(SineLookup_5bits[i])) );
}
}
注意:正弦表来自 //github.com/adafruit/Adafruit_MCP4725/blob/master/examples/sinewave/sinewave.ino 您可以在哪里找到更多表(最多9位)。
在完整的正弦波中使用32间隔设置此草图(从上到下16步)。所以
that
正在经历360/32度,并为每个人获得DAC结果
角度。示波器设置为每分为1V并显示输出 频率为130Hz.。因此,该位撞击方法比MCP4725慢,而不是使用SPI硬件慢10倍。
时基:1ms / div,黄色1v / div。
Parameter |
MCP4725 |
MCP4922 |
---|---|---|
Voltage Supply (Vs) |
2v7〜5v5 | 相同的 |
Abs. Max V DD. |
-0v3〜6v5 | 相同的 |
Interface |
I2C | spi. |
I2C rate |
100khz,400khz,3.4mhz | 20MHz |
Resolution |
12 bit | 相同的 |
Power Down I (V DD. = 5v5典型,最大值) |
0.06ua,2ua | 0.3ua,2ua |
没有负载电流(典型,最大) | 210ua,400ua. | 350ua,700ua. |
短路(VOUT = GND)(MN,TP,MX) |
7mA,15mA,24mA | 同样没有min. |
偏移错误(典型,最大)%fsr | ±0.02,0.75 | ±0.02,1.00 |
Offset error drift (-45〜25,25〜85℃,典型)ppm |
±1,±2 | ±0.16,-0.44 |
INL (typ,max) LSB |
±2,±14.5 [3] | ±2,±12 |
DNL(min,典型,最大)LSB [2] | -0.75,±0.2,±0.75 | 相同的 |
增益错误(min,典型,最大)%fsr | -2,-0.1,2 | X,-0.1,1 |
Gain error drift |
-3 ppm /ºC | 相同的 |
Phase margin |
相同的 |
|
电容式负载稳定性(5K负载) |
1000pF | ns. |
Slew rate |
0.55V /美国 | 相同的 |
输出电压稳定时间 |
6us | 4.56us |
I2C地址(H / W被选中= 8off) |
0x60,0x61 [1] | N / A. |
工作温度 |
-40°C〜125°C | 相同的 |
这芯片大约有多快地生成32位的SineWave?
SineWave通过Max到Min的32位周期,然后再次到最大值,因此从上到下有16个步骤。
忽略转换速率,和稳定时间,以及处理器时间。来自
波形您可以看到必须输出16位。如果时钟为20MHz(Max SPI速度)
那么这将需要16 *(1/20e6)= 800ns。
生成32个段将需要32 * 800E-9 = 25.6us
产生1 / 25.6e-6 = 39kHz的频率。
警告: 这是一个低分辨率的正弦波。更多步骤=较慢。
这是最大的理论正弦波 - 记住这是一个低位
分辨率正弦波,如果需要更多的细分,则会减速。
以上计算仅用于一个注册更新。对于两个通道更新,速率将减少到19.5kHz
警告: 计算假设处理器专用于此任务!
笔记: 最大理论单通道更新:39kHz。 LOW RES
MCP4922 是用于生成特定控制的有用装置
电压e.g.用于设定点或偏移校准。你可以使用它
用于数字可编程电压或电流输出电路。
该设备比I2C等价物更快,但对于波形
发电很难获得高音频频率(高步
size).
MCP4922 是一种能力的设备,并且操作速度快
所有I2C版本。您可以使芯片速度快,但有一个
arduino uno它相当慢。这些例子显示出非常低的分辨率
波形输出为1.4kHz,更多的步骤将需要更长时间减少
output frequency.
如果您正在寻找高速操作,您需要更快
处理器如DSP处理器。但是即使是最大值
频率输出为39kHz,仍然仅为16步波形。
波形输出的简单替代方案是 AD9833
(然而,这不是DAC并仅生成单个凸起)。
另一种替代方案是平行的DAC。 DAC08。更多细节是 这里 .
与I2C版本不同,此芯片没有EEPROM,因此无法保持电源后的相同输出。
该芯片没有内部电压参考 - 您可以获得具有参考的MCP4822。
MCP4922 具有两个输出。如果速度不是一个问题,你需要大量的输出 MCP4728 在I2C总线上有四个。
这种芯片易于在无焊接面包板上使用,因为它也是如此
配有标准的PDIP包,并为您控制两个模拟
outputs.
使用ADS1115精度16位ADC进行教程进行低功耗。
arduino. 模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。
了解DigitalWrite()的工作原理......现在使用17倍宏宏!
如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。
使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。
HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。
新的! Comments
让你说到你刚刚阅读的东西!留下下面的框中的评论。