文章目录
AMC7904芯片使用
一、芯片说明
AMC 7904是一款高度集成的自主功率放大器(PA)监控器件,包括四个温度补偿DAC、集成EEPROM和输出控制开关。四个DAC通过内部EEPROM中存储的四个独立的用户定义温度-电压转换函数进行编程,无需额外的外部电路即可校正任何温度效应。启动后,该器件无需系统控制器的干预即可运行,为控制应用中的偏置电压设置和补偿提供完整的系统。AMC 7904有四个模拟输出,通过专用控制引脚切换到负载。输出开关专为快速响应而设计。结合器件PA_ON引脚,这种快速响应可实现正确的电源时序和耗尽型晶体管(如GaAs和GaN)保护。功能集成和宽工作温度范围使AMC 7904成为RF通信系统中功率放大器的一体化自主偏置控制电路的绝佳选择。灵活的DAC输出范围和内置时序特性使该器件可用作LDMOS、GaAs和GaN等多种晶体管技术的偏置控制器。
二、引脚说明及连接
序号 | 名称 | 说明 |
---|---|---|
1 | DRVEN2 | 异步开关控制信号。 |
2 | DRVEN1 | 异步开关控制信号。 |
3 | SDA | I2C双向数据线。如果通过SPI与器件通信,此引脚必须连接到GND。 |
4 | SCL/CS | I2C:时钟输入。SPI:低电平有效串行数据使能。该输入是串行数据的帧同步信号。当信号变为低电平时,此引脚使能串行接口输入移位寄存器。 |
5 | A2/SCLK | I2C:从机地址选择器。SPI:时钟输入。 |
6 | A1/SDI | I2C:从机地址选择器。SPI:数据输入。数据在SCLK引脚的每个下降沿输入移位寄存器。 |
7 | A0/SDO | I2C:从机地址选择器。SPI:数据输出。SDO引脚必须在操作前通过设置SDOEN位使能。数据在SCLK引脚的每个上升沿从输入移位寄存器输出。 |
8 | VIO | IO电源电压(1.65 V至3.6 V)。此引脚设置器件的I/O工作电压。 |
9 | PA_ON | 同步信号。PA_ON为CMOS输出。PA_ON引脚设置为低电平,直到器件准备好完全工作或检测到报警条件。 |
10 | GND | 设备上所有电路的接地参考点 |
11 | OUT1 | DAC 1开关输出 |
12 | DAC1 | DAC 1缓冲输出 |
13 | CLAMP1 | CLAMP1缓冲输出 |
14 | DAC0 | DAC 0缓冲输出 |
15 | VSS | 输出缓冲器负模拟电源(-11 V至0 V) |
16 | VCC | 输出缓冲器正模拟电源(0 V至5.5 V) |
17 | DAC3 | DAC 3缓冲输出 |
18 | CLAMP2 | CLAMP2缓冲输出 |
19 | DAC2 | DAC 2缓冲输出 |
20 | OUT2 | DAC 2开关输出 |
21 | VDD | 模拟电源电压(4.5 V至5.5 V) |
22 | D+ | 远程温度传感器连接。如果未使用,请将这些引脚连接在一起。 |
23 | D– | 远程温度传感器连接。如果未使用,请将这些引脚连接在一起。 |
24 | RESET/ALMIN | 低电平有效复位输入。此引脚上的逻辑低电平使器件启动复位事件。或者,此引脚可配置为输入器件的有效低电平报警信号,以启动报警事件。 |
偏置电压为负
电压转换公式
Vout = -10V*(1 - DACIN / 8192)
Vout是输出的电压,DACIN是芯片识别的值
volt_to_hex = (int)((value + 10) / 10 * 8192);
ValueH = volt_to_hex >> 8;//电压高位
ValueL = volt_to_hex & 0xFF;//电压低位
三、寄存器说明
1、第一页
**00:**本地温度高字节寄存器(分辨率为1℃)只读
**01:**本地温度低字节寄存器(分辨率为0.0625℃)只读
**02:**远程温度高字节寄存器(分辨率为1℃)只读
**03:**远程温度低字节寄存器(分辨率为0.0625℃)只读
**04:**温度状态寄存器 只读
位 | 说明 |
---|---|
7 | 温度ADC状态指示灯 1 = ADC正在转换。 0 = ADC未转换。 |
6 | 局部温度上限状态指示位 1 =局部温度值超过局部温度上限寄存器值。如果导致过温结果的条件不再存在,则在阅读温度状态寄存器时,该位清0。 0 =局部温度值不超过局部温度上限寄存器值。 |
5 | 局部温度下限状态指示位 1 =局部温度值低于局部温度下限寄存器值。如果导致欠温结果的条件不再存在,则该位在阅读温度状态寄存器时清0。 0 =本地温度值不低于本地温度下限寄存器值。 |
4 | 远程温度上限状态指示灯 1 =远程温度值超过远程温度上限寄存器值。如果导致过温结果的条件不再存在,则在阅读温度状态寄存器时,该位清0。 0 =远程温度值不超过远程温度上限寄存器值。 |
3 | 远程温度下限状态指示灯 1 =远程温度值低于远程温度下限寄存器值。如果导致欠温结果的条件不再存在,则该位在阅读温度状态寄存器时清0。 0 =远程温度值不低于远程温度下限寄存器值。 |
2 | 远程接头开路检测 1 =远程接头开路。如果导致开路的条件不再存在,则阅读温度状态寄存器时,该位清0。0 =远程接头不是开路。 |
**05:**AMC状态寄存器 只读
位 | 说明 |
---|---|
7 | 温度报警状态指示位 1 =发出温度报警事件。一旦温度报警位被清除,该位将自动清除。 |
6 | PA_ON状态指示位 1 = PA_ON引脚为高电平。 0 = PA_ON引脚为低电平。 |
5 | EEPROM加载CRC错误指示位 1 =指示EEPROM加载到用户寄存器空间期间的CRC错误。通过向该位写入1将其清0。 |
3 | EEPROM就绪指示灯 0 = EEPROM BURN正在进行。 1 = EEPROM BURN已完成。 |
2 | 双错误检测状态指示位 1 =访问操作存储器中的LUT寄存器时检测到双位错误。错误未得到纠正。通过向该位写入1将其清0。 |
1 | 单个纠错状态指示位 1 =访问操作存储器中的LUT寄存器时检测到单个位错误。错误已被纠正。通过向该位写入1将其清0。 |
0 | GAN就绪指示位 1 =器件处于负输出范围操作。 0 =器件处于正输出范围操作。 |
**07:**软件复位寄存器 只写
软件复位命令
将0x05写入此寄存器将启动复位事件。
将0xAD写入此寄存器会启动寄存器清除事件,使所有运行内存寄存器返回出厂默认值。
在下一个串行接口命令之前需要15 µs的等待时间。
**08:**配置1寄存器 读写
位 | 说明 |
---|---|
6 | 温度传感器关闭控制 1 =将温度传感器置于关闭模式。 0 =将温度传感器置于连续转换模式。 |
5 | ALERT或THERM温度报警模式选择 1 = THERM模式。 0 =警报模式。 |
4 | VSS自动阈值检测器控制。设置有效的VSS电源范围。如果在正输出范围内工作,则必须设置为0 ,1 =宽VSS配置:-11 V ≤ VSS < -7 V。0 =窄VSS配置:-7 V ≤ VSS ≤ -4.5 V。 |
3 | DAC输出电流模式选择1 =高电流模式。0 =正常电流模式。 |
2 | 该位配置温度测量范围。所选范围格式必须用于所有温度数据寄存器(上限和下限、偏移和覆盖)。1 = -64 ° C至+191 ° C。0 = -40 ° C至+127 ° C。 |
1:0 | 启动计时器选择。设置启动时设置的DAC输出与PA_ON释放之间的等待时间00 = 1 ms。01 = 15 ms。10 = 30 ms。11 = 60 ms。 |
**09:**配置2寄存器 读写
位 | 说明 |
---|---|
5 | 用于LUT数据访问的基于汉明的SECDED模块 0 =启用SECDED模块。 1 =禁用SECDED模块。 |
0:3 | 转换率选择 |
**0A:**LUT配置寄存器 读写
位 | 说明 |
---|---|
5 | LUT状态指示位 0 = LUT/ALU引擎被禁用。 1 = LUT/ALU引擎启用。 |
4 | LUT/ALU 控制 0 =启用LUT/ALU引擎。1 =禁用LUT/ALU引擎。温度传感器保持激活状态。在EEPROM访问或寄存器访问第4、5和15页期间,必须禁用LUT/ALU引擎。 |
3 | LUT 2和LUT 3温度输入 0 =本地温度传感器。 1 =远程温度传感器。 |
2 | LUT 0和LUT 1温度输入 0 =本地温度传感器。 1 =远程温度传感器。 |
1 | 远程温度传感器控制 0 =禁用远程温度传感器转换。 1 =启用远程温度传感器转换。 |
0 | 本地温度传感器控制 0 =禁用本地温度传感器转换。 1 =启用本地温度传感器转换。 |
**0B:**DAC覆盖使能寄存器 读写
位 | 说明 |
---|---|
7 | DACx ALU旁路控制 0 = ALU输出发送到DACx。 1 =旁路ALU输出。将BASEx值发送到DACx。 |
6 | 同上 |
5 | 同上 |
4 | 同上 |
3 | DACx重写控制 0 = DACx输入由LUT生成。 1 = DACx输入由串行接口可访问的DACxOW[12:0]数据寄存器提供。 |
2 | 同上 |
1 | 同上 |
0 | 同上 |
**0C:**驱动启用寄存器 读写
位 | 说明 |
---|---|
5 | DAC 3开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。 |
4 | OUT2开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。 |
1 | OUT1开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。 |
0 | DAC 0开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。 |
**0D:**驱动器使能选择寄存器 读写
位 | 说明 |
---|---|
5 | DAC 3开关控制选择 0 = DRVEN2 引脚。1 = DRV3 位。 |
4 | OUT2开关控制选择 0 = DRVEN2 引脚。1 = DRV2 位。 |
1 | OUT1软件开关控制 0 = DRVEN1 引脚。1 = DRV1 位。 |
0 | DAC 0软件开关控制 0 = DRVEN1 引脚。1 = DRV0 位。 |
**0E:**报警配置寄存器 读写
位 | 说明 |
---|---|
7 | ALARMIN引脚复位的功能 1= ALARMIN。0 = 复位。 |
6 | PA_ON报警控制 0 = PA_ON不受报警事件影响。1 = PA_ON在报警事件期间设置为低电平。 |
3 | DAC 3报警控制 0 = DAC 3不受报警事件影响。 1 = DAC3在报警事件期间关闭。 |
2 | OUT2报警控制 0 = OUT2不受报警事件影响。 1 =在报警事件期间OUT2关闭。 |
1 | OUT 1报警控制 0 = OUT 1不受报警事件的影响。 1 =警报事件期间DAC 3关闭。 |
0 | DAC 0报警控制 0 = DAC 0不受报警事件影响。 1 = DAC 0在报警事件期间关闭。 |
**0F:**中断模式寄存器 读写
位 | 说明 |
---|---|
7:6 | 复位命令 00 =无操作。01 =等待温度转换结束。10 =释放DAC。11 =从启动电流模式释放DAC。 |
4 | AMC中断模式 0 =正常操作。 1 =将设备设置为中断模式,忽略自动复位控制信号。 |
3 | 当器件设置为中断模式0时,DRVEN控制=强制所有内部DRVEN开关控制信号为零。1 =使能DRVEN信号控制。 |
2 | 当器件设置为中断模式时,PA_ON控制0 = PA_ON引脚强制为低电平。1 = PA_ON引脚强制为高电平。 |
1 | 器件设置为中断模式时的DAC输出电流控制0 = DAC强制进入启动电流模式。1 = DAC从启动电流模式释放。 |
0 | 器件设置为中断模式0时的DAC输出控制= DAC输入代码强制为全零。1 =可访问DAC输入代码。 |
**10:**局部温度上限寄存器 读写
这些位是与本地温度测量值进行比较的温度上限值。该寄存器中的LSB分辨率为1°C。必须采用TMPRANGE位表示的格式。
**11:**局部温度下限寄存器 读写
这些位是与本地温度测量值进行比较的温度下限值。该寄存器中的LSB分辨率为1°C。必须采用TMPRANGE位表示的格式。
**12:**远程温度上限高字节寄存器 读写
这些位是与远程温度测量值进行比较的温度上限值。该寄存器中的LSB分辨率为1°C。必须采用TMPRANGE位表示的格式。
**13:**远程温度上限低字节寄存器 读写
这些位是与远程温度测量进行比较的温度下限值。该寄存器中四位的分辨率为0.0625°C。必须采用TMPRANGE位表示的格式。
**14:**远程温度下限高字节寄存器 读写
这些位是与远程温度测量进行比较的温度下限值的高字节值。该寄存器的LSB分辨率为1°C。必须采用TMPRANGE位表示的格式。
**15:**远程温度下限低字节寄存器 读写
这些位确定与远程温度测量进行比较的温度下限值的低字节值。该寄存器中四位的分辨率为0.0625°C。必须采用TMPRANGE位表示的格式。
**16:**远程温度偏移高字节寄存器 读写
远程温度偏移高字节。此寄存器的值与ADC转换值相加,结果存储在远程温度寄存器中。在需要校准的应用中,该寄存器用于在ADC转换结果中加上或减去温度偏移值。该寄存器的LSB分辨率为1°C。必须采用TMPRANGE位表示的格式。
**17:**远程温度偏移低字节寄存器 读写
远程温度偏移低字节。此寄存器的值与ADC转换值相加,结果存储在远程温度寄存器中。在需要校准的应用中,该寄存器用于在ADC转换结果中加上或减去温度偏移值。这四位的分辨率为0.0625°C。必须采用TMPRANGE位表示的格式。
**1A:**THERM滞后寄存器 读写
THERM滞后值。这些位确定应用于THERM功能的迟滞量。该寄存器的LSB分辨率为1°C。
**1B:**连续告警寄存器 读写
激活ALERT温度报警所需的连续超限测量值的数量。
**1C:**η-因子校正寄存器 读写
**1D:**数字滤波器控制寄存器 读写
配置远程温度结果的过滤量。
**1E:**版本ID寄存器 只读
**1F:**设备注册ID 只读
**22:**温度覆盖高字节寄存器
温度传感器覆盖值高字节。必须采用TMPRANGE位表示的格式。
**23:**温度覆盖低字节寄存器 读写
位 | 说明 |
---|---|
7:4 | 温度传感器覆盖值低字节。必须采用TMPRANGE位表示的格式。 |
0 | 温度传感器重写控制0 =温度传感器输出用于索引LUT。1 =串行接口可访问的TEMPOW[11:0]数据寄存器用于索引LUT。 |
**24:**复位状态寄存器 只读
重置控制状态。读取寄存器两次以确保数据有效。如果两个连续读数不匹配,则发出额外的读取命令,直到数据相等。
值 | 说明 |
---|---|
0h | 空闲 |
1h | 等待设备启动 |
2h | EEPROM加载启动 |
3h | 正在加载EEPROM |
4h | 中断模式 |
5h | 检查有效的输出缓冲器电源范围 |
6h | 正在进行温度转换 |
7h | 等待LUT/ALU |
8h | 等待报警事件 |
9h | 从所有零代码中释放DAC |
Ah | 等待DAC和PA_ON置位之间的定时器 |
Bh | 从启动电流模式释放DAC |
Ch | 设置PA_ON |
Dh | 释放DRVEN开关控制 |
Eh | 报警事件 |
Fh | 保留 |
**28:**单稳态温度寄存器 只写
当温度传感器处于关断模式时,向该寄存器写入任何值都会触发单次温度转换。
**2A:**软件报警寄存器 读写
软件报警 1 =设置SWALM位启动报警事件。报警状态持续,直到该位清0。
2、第二页
**00、01:**DAC0输入数据寄存器
**02、03:**DAC1输入数据寄存器
**04、05:**DAC2输入数据寄存器
**06、07:**DAC3输入数据寄存器
**08、09:**DAC0覆盖寄存器
DAC 2 [12:8]覆盖数据。写入低字节后,数据会更新。高字节数据必须先写入。
**0A、0B:**DAC1覆盖寄存器
**0C、0D:**DAC2覆盖寄存器
**0E、0F:**DAC3覆盖寄存器
**10、11:**CLAMP1覆盖寄存器
CLAMP1[12:8]覆盖数据。写入低字节后,数据会更新。高字节数据必须先写入。
**12、13:**CLAMP2覆盖寄存器
**18、19:**CLAMP1输入数据寄存器
**1A、1B:**CLAMP2输入数据寄存器
**20、21:**DAC0 LUT数据寄存器
**22、23:**DAC1 LUT数据寄存器
**24、25:**DAC2 LUT数据寄存器
**26、27:**DAC3 LUT数据寄存器
**30、31:**广播寄存器
数据同时发送到所有DAC通道(DAC[0:3]和CLAMP[1:2])。
3、第四页
第4页将LUT 0和LUT 1值存储在对应于从-48 ° C到152°C的4°C增量的位置。没有对应于24°C的增量,因为此温度是基线,对应的LUT值是13位BASE。每个奇数地址行存储一对DELTA寄存器。LUT要求DELTA值表示单调函数。该函数可以增加或减少,具体取决于每个DAC BASE寄存器中的POL位。DELTA值是无符号的。每个偶数地址包含对应奇数地址的SECDED奇偶校验位和汉明位。DAC 0和DAC 1的BASE值以及相应的SECDED代码沿着存储在地址0x 64至0x 6 B中。更新LUT条目所需的方法是禁用LUT,更新条目,然后启用LUT。
**00-63:**步进值 HAMM寄存器
**64-67:**DAC0 基准值 HAMM寄存器
0x65
位 | 说明 |
---|---|
5 | 查找表增量极性控制:1:该设置实现单调递减的查找表传递函数。0:该设置实现了单调增加的LUT传递函数。 |
4:0 | LUT BASE值位[12:8](+24°C时的LUT输出)。 |
0x66
位 | 说明 |
---|---|
7:0 | LUT BASE值位[7:0](+24°C时的LUT输出)。 |
**68-6B:**DAC1基准值 HAMM寄存器
4、第五页
第5页将LUT 2和LUT 3值存储在对应于从-48 ° C到152°C的4°C增量的位置。没有对应于24°C的增量,因为此温度是基线,对应的LUT值是13位BASE。每个奇数地址行存储一对DELTA寄存器。LUT要求DELTA值表示单调函数。该函数可以增加或减少,具体取决于每个DAC BASE寄存器中的POL位。DELTA值是无符号的。每个偶数地址包含对应奇数地址的SECDED奇偶校验位和汉明位。DAC 2和DAC 3的BASE值以及相应的SECDED代码沿着存储在地址0x 64至0x 6 B中。更新LUT条目所需的方法是禁用LUT,更新条目,然后启用LUT。
**00-63:**步进值 HAMM寄存器
**64-67:**DAC2 基准值 HAMM寄存器
0x65
位 | 说明 |
---|---|
5 | 查找表增量极性控制:1:该设置实现单调递减的查找表传递函数。0:该设置实现了单调增加的LUT传递函数。 |
4:0 | LUT BASE值位[12:8](+24°C时的LUT输出)。 |
0x66
位 | 说明 |
---|---|
7:0 | LUT BASE值位[7:0](+24°C时的LUT输出)。 |
**68-6B:**DAC3基准值 HAMM寄存器
5、第十五页
第15页包括20字节的存储器,用于任意数据存储。此数据不会影响设备的运行。必须禁用LUT/ALU功能才能访问这些寄存器上的数据。如果LUT/ALU被启用,写入记事本寄存器的命令将被阻止,读取的数据无效。SECDED引擎不适用于内存的此部分。
**00-13:**记事本寄存器
20字节的内存用于任意数据存储。此数据不会影响设备的运行。
**7C:**EEPROM烧录寄存器
EEPROM烧录命令寄存器将0xE4写入此寄存器将启动EEPROM烧录序列。
四、代码控制
1、设置当前页码
/**
* @名称:AMC7904_Page
* @描述:设置AMC7904芯片的页码
* @参数:regAddr:设备地址; page:页码,1、2、4、5、15
* @返回值:无
*/
void AMC7904_Page(uint8_t regAddr, uint8_t page)
{
if(page != 0x01 && page != 0x02 && page != 0x04 && page != 0x05 && page != 0x0F)
return;
IIC_WriteReg(regAddr, AMC7904_PAGE_ADDR, page);
}
2、读取设备ID
/**
* @名称:AMC7904_ID
* @描述:读取AMC7904芯片ID号
* @参数:regAddr:设备地址
* @返回值:ID号
*/
uint8_t AMC7904_ID(uint8_t regAddr)
{
uint8_t id;
AMC7904_Page(regAddr,0x01);//设置页码为1
id = IIC_ReadReg(regAddr, AMC7904_Device_ID_ADDR);
return id;
}
3、读取温度
/**
* @名称:GetAMC7904Temp
* @描述:读取AMC7904内部温度
* @参数:regAddr:设备地址;
* @返回值:温度值
*/
float AMC7904_Temp(uint8_t regAddr)
{
float temp;
uint8_t TempH, TempL;
AMC7904_Page(regAddr,0x01);//设置页码为1
TempH = IIC_ReadReg(regAddr, 0x00);
TempL = IIC_ReadReg(regAddr, 0x01);
if (TempH & 0x8000) { // 0x8000是16位整数最高位的掩码
TempH &= ~0x8000; // 清除最高位
TempH = -TempH; // 取反得到负数
TempL = -TempL;
}
temp = TempH*1000 + TempL;
return temp/1000;
}
4、读取电压
/**
* @名称:GetAMC7904
* @描述:读取AMC7904芯片输出电压
* @参数:CH:通道号,0~3
* @返回值:输出电压值,-7~0
*/
float GetAMC7904(uint8_t regAddr, uint8_t CH)
{
uint8_t DAC_H, DAC_L;
float Volt;
//设置页码为2
AMC7904_Page(regAddr, 0x02);
//读取对应通道的输出的高低位数据
if(CH > 3)
return 0;
switch (CH)
{
case 0:
DAC_H = IIC_ReadReg(regAddr, AMC7904_DAC0_H_ADDR);
DAC_L = IIC_ReadReg(regAddr, AMC7904_DAC0_L_ADDR);
break;
case 1:
DAC_H = IIC_ReadReg(regAddr, AMC7904_DAC1_H_ADDR);
DAC_L = IIC_ReadReg(regAddr, AMC7904_DAC1_L_ADDR);
break;
case 2:
DAC_H = IIC_ReadReg(regAddr, AMC7904_DAC2_H_ADDR);
DAC_L = IIC_ReadReg(regAddr, AMC7904_DAC2_L_ADDR);
break;
case 3:
DAC_H = IIC_ReadReg(regAddr, AMC7904_DAC3_H_ADDR);
DAC_L = IIC_ReadReg(regAddr, AMC7904_DAC3_L_ADDR);
break;
}
Volt = (float)((DAC_H << 8) | DAC_L) * 10 / 8192 - 10;
return Volt;
}
5、设置电压
/**
* @名称:SetAMC7904_Volt
* @描述:设置AMC7904芯片输出电压(此函数只能暂时设置输出电压,断电后不能保存数据)
* @参数:regAddr:设备地址; CH:通道号,0~3;value:输出负电压值,-7~0(不包含0)
* @返回值:1:设置成功;0:设置失败
*/
uint8_t SetAMC7904_Volt(uint8_t regAddr, uint8_t CH, float value)
{
uint8_t ValueH, ValueL;
int volt_to_hex;
uint8_t set;//标志位
//将输入的电压值转换为相应的数据
//value = value - 0.048;
volt_to_hex = (int)((value + 10) / 10 * 8192);
ValueH = volt_to_hex >> 8;
ValueL = volt_to_hex & 0xFF;
AMC7904_Page(regAddr, 0x01);//设置页码为1
IIC_WriteReg(regAddr, AMC7904_LUT_ADDR, 0x11);//禁用LUT输出
IIC_WriteReg(regAddr, AMC7904_Overwrite_ADDR, 0x0F);//所有DAC覆盖模式使能
IIC_WriteReg(regAddr, 0x0C, 0x33);//驱动使能
delay_1ms(200);
AMC7904_Page(regAddr, 2);//设置页面为2
switch (CH)
{
case 0:
IIC_WriteReg(regAddr, 0x08, ValueH);//写入DAC高字节
IIC_WriteReg(regAddr, 0x09, ValueL);//写入DAC低字节
break;
case 1:
IIC_WriteReg(regAddr, 0x0A, ValueH);//写入DAC高字节
IIC_WriteReg(regAddr, 0x0B, ValueL);//写入DAC低字节
break;
case 2:
IIC_WriteReg(regAddr, 0x0C, ValueH);//写入DAC高字节
IIC_WriteReg(regAddr, 0x0D, ValueL);//写入DAC低字节
break;
case 3:
IIC_WriteReg(regAddr, 0x0E, ValueH);//写入DAC高字节
IIC_WriteReg(regAddr, 0x0F, ValueL);//写入DAC低字节
break;
default:
return 0;
}
AMC7904_Page(regAddr, 0x01);//设置页面为1
set = IIC_ReadReg(regAddr, AMC7904_Status_ADDR);
if(set != 0x49)
return 0;
return 1;
}
6、使用LUT查找表功能
/**
* @名称:SetAMC7904_LUT
* @描述:设置AMC7904芯片的LUT数据
* @参数:regAddr:设备地址;
* Voltage:24℃的电压值,-7~0(不包含0);
* CH:通道号,0~3;
* Slope:0:单调递增;1:单调递减
* @返回值:1:设置成功;0:设置失败
*/
uint8_t SetAMC7904_LUT(uint8_t regAddr, float Voltage, uint8_t CH, uint8_t Slope)
{
int i;
uint8_t ValueH, ValueL;
int volt_to_hex;
//数据判断
if(CH > 3 || Voltage > 0 || Voltage < -7 || Slope > 1 || Slope < 0)
return 0;
if(Slope == 1)
Slope = 0x20;
//将输入的电压值转换为相应的数据
volt_to_hex = (int)((Voltage + 10) / 10 * 8192);
ValueH = volt_to_hex >> 8;
ValueL = volt_to_hex & 0xFF;
//禁用LUT输出
AMC7904_Page(regAddr, 0x01);//设置页码为1
IIC_WriteReg(regAddr, AMC7904_LUT_ADDR, 0x11);
delay_1ms(200);
if(CH == 0 || CH == 1)
{
AMC7904_Page(regAddr, 0x04);//设置页码为4
//设置步进值
for(i = 0; i < 18; i++)//-48~20
{
IIC_WriteReg(regAddr, 0x01 + 2*i, 0x50 + 0x05);//设置DAC0、DAC1的步进值(0~F)
}
for(i = 0; i < 32; i++)//28~152
{
IIC_WriteReg(regAddr, 0x25 + 2*i, 0x50 + 0x05);
}
if(CH == 0)
{
//设置DAC0的基准值
IIC_WriteReg(regAddr, AMC7904_DAC02_Base_H, ValueH | Slope);//1单调递减,0单调递增
IIC_WriteReg(regAddr, AMC7904_DAC02_Base_L, ValueL);
}
else if(CH == 1)
{
//设置DAC1的基准值
IIC_WriteReg(regAddr, AMC7904_DAC13_Base_H, ValueH + Slope);//1单调递减,0单调递增
IIC_WriteReg(regAddr, AMC7904_DAC13_Base_L, ValueL);
}
}
else if(CH == 2 || CH == 3)
{
AMC7904_Page(regAddr, 0x05);//设置页码为5
//设置步进值
for(i = 0; i < 18; i++)//-48~20
{
IIC_WriteReg(regAddr, 0x01 + 2*i, 0x50 + 0x05);
}
for(i = 0; i < 32; i++)//28~152
{
IIC_WriteReg(regAddr, 0x25 + 2*i, 0x50 + 0x05);
}
if(CH == 2)
{
//设置DAC2的基准值
IIC_WriteReg(regAddr, AMC7904_DAC02_Base_H, ValueH | Slope);//1单调递减,0单调递增
IIC_WriteReg(regAddr, AMC7904_DAC02_Base_L, ValueL);
}
else if(CH == 3)
{
//设置DAC3的基准值
IIC_WriteReg(regAddr, AMC7904_DAC13_Base_H , ValueH+ Slope);//1单调递减,0单调递增
IIC_WriteReg(regAddr, AMC7904_DAC13_Base_L, ValueL);
}
}
//使能LUT输出
AMC7904_Page(regAddr, 0x01);//设置页码为1
IIC_WriteReg(regAddr, AMC7904_LUT_ADDR, 0x01);
//保存LUT数据
AMC7904_Page(regAddr, 0x0F);//设置页码为15
IIC_WriteReg(regAddr, AMC7904_EEPROM_ADDR, AMC7904_Code_ADDR);
delay_1ms(300);
return 1;
}
6、.H文件
#ifndef AMC7904_H_
#define AMC7904_H_
#include "IIC.h"
#include <math.h>
#include "systick.h"
#define AMC7904_ADDR1 0xC0// AMC7904 I2C 地址
#define AMC7904_ADDR2 0xC1// AMC7904 I2C 地址
#define AMC7904_ADDR3 0xC2// AMC7904 I2C 地址
#define AMC7904_ADDR4 0xC3// AMC7904 I2C 地址
#define AMC7904_ADDR5 0xC4// AMC7904 I2C 地址
#define AMC7904_ADDR6 0xC5// AMC7904 I2C 地址
#define AMC7904_ADDR7 0xC6// AMC7904 I2C 地址
#define AMC7904_ADDR8 0xC7// AMC7904 I2C 地址
#define AMC7904_TEMP_H_ADDR 0x00 //本地温度高地址
#define AMC7904_TEMP_L_ADDR 0x01 //本地温度低地址
#define AMC7904_Device_ID_ADDR 0x1F // AMC7904 Device ID
#define AMC7904_Version_ID_ADDR 0x1E // AMC7904 Version ID
#define AMC7904_PAGE_ADDR 0x7E // AMC7904 页选择寄存器
#define AMC7904_Code_ADDR 0xE4
#define AMC7904_EEPROM_ADDR 0x7C// AMC7904 EEPROM 地址
#define AMC7904_LUT_ADDR 0x0A // AMC7904 LUT 地址
#define AMC7904_Overwrite_ADDR 0x0B // AMC7904 DAC_Overwrite
#define AMC7904_DAC_Base_ADDR 0x07 // AMC7904 DAC 基准地址
#define AMC7904_Status_ADDR 0x05 // AMC7904 状态寄存器
#define AMC7904_Reset_status_ADDR 0x24 // AMC7904 复位状态寄存器
#define AMC7904_DAC0_H_ADDR 0x00 // AMC7904 DAC0 高字节地址
#define AMC7904_DAC0_L_ADDR 0x01 // AMC7904 DAC0 低字节地址
#define AMC7904_DAC1_H_ADDR 0x02 // AMC7904 DAC1 高字节地址
#define AMC7904_DAC1_L_ADDR 0x03 // AMC7904 DAC1 低字节地址
#define AMC7904_DAC2_H_ADDR 0x04 // AMC7904 DAC2 高字节地址
#define AMC7904_DAC2_L_ADDR 0x05 // AMC7904 DAC2 低字节地址
#define AMC7904_DAC3_H_ADDR 0x06 // AMC7904 DAC3 高字节地址
#define AMC7904_DAC3_L_ADDR 0x07 // AMC7904 DAC3 低字节地址
#define AMC7904_Temp_L 0x01 // -48℃
#define AMC7904_Temp_H 0x63 // 152℃
#define AMC7904_DAC02_Base_H 0x65 // AMC7904 DAC02 基准高字节地址
#define AMC7904_DAC02_Base_L 0x67 // AMC7904 DAC02 基准低字节地址
#define AMC7904_DAC13_Base_H 0x69 // AMC7904 DAC13 基准高字节地址
#define AMC7904_DAC13_Base_L 0x6B // AMC7904 DAC13 基准低字节地址
float AMC7904_Temp(uint8_t addr);//读取温度
uint8_t AMC7904_ID(uint8_t addr);//获取芯片ID
void AMC7904_Page(uint8_t addr, uint8_t page); //设置芯片页
float GetAMC7904(uint8_t regAddr, uint8_t CH); //读取输出值
uint8_t SetAMC7904_Volt(uint8_t regAddr, uint8_t CH, float value); //设置输出电压值
uint8_t SetAMC7904_LUT(uint8_t regAddr, float Voltage, uint8_t CH, uint8_t Slope);//根据温度设置输出LUT
#endif /* AMC7904_H_ */
五、总结
如有错误或好的建议欢迎留言评论