AMC7904芯片使用

AMC7904芯片使用

一、芯片说明

​ AMC 7904是一款高度集成的自主功率放大器(PA)监控器件,包括四个温度补偿DAC、集成EEPROM和输出控制开关。四个DAC通过内部EEPROM中存储的四个独立的用户定义温度-电压转换函数进行编程,无需额外的外部电路即可校正任何温度效应。启动后,该器件无需系统控制器的干预即可运行,为控制应用中的偏置电压设置和补偿提供完整的系统。AMC 7904有四个模拟输出,通过专用控制引脚切换到负载。输出开关专为快速响应而设计。结合器件PA_ON引脚,这种快速响应可实现正确的电源时序和耗尽型晶体管(如GaAs和GaN)保护。功能集成和宽工作温度范围使AMC 7904成为RF通信系统中功率放大器的一体化自主偏置控制电路的绝佳选择。灵活的DAC输出范围和内置时序特性使该器件可用作LDMOS、GaAs和GaN等多种晶体管技术的偏置控制器。

二、引脚说明及连接

序号名称说明
1DRVEN2异步开关控制信号。
2DRVEN1异步开关控制信号。
3SDAI2C双向数据线。如果通过SPI与器件通信,此引脚必须连接到GND。
4SCL/CSI2C:时钟输入。SPI:低电平有效串行数据使能。该输入是串行数据的帧同步信号。当信号变为低电平时,此引脚使能串行接口输入移位寄存器。
5A2/SCLKI2C:从机地址选择器。SPI:时钟输入。
6A1/SDII2C:从机地址选择器。SPI:数据输入。数据在SCLK引脚的每个下降沿输入移位寄存器。
7A0/SDOI2C:从机地址选择器。SPI:数据输出。SDO引脚必须在操作前通过设置SDOEN位使能。数据在SCLK引脚的每个上升沿从输入移位寄存器输出。
8VIOIO电源电压(1.65 V至3.6 V)。此引脚设置器件的I/O工作电压。
9PA_ON同步信号。PA_ON为CMOS输出。PA_ON引脚设置为低电平,直到器件准备好完全工作或检测到报警条件。
10GND设备上所有电路的接地参考点
11OUT1DAC 1开关输出
12DAC1DAC 1缓冲输出
13CLAMP1CLAMP1缓冲输出
14DAC0DAC 0缓冲输出
15VSS输出缓冲器负模拟电源(-11 V至0 V)
16VCC输出缓冲器正模拟电源(0 V至5.5 V)
17DAC3DAC 3缓冲输出
18CLAMP2CLAMP2缓冲输出
19DAC2DAC 2缓冲输出
20OUT2DAC 2开关输出
21VDD模拟电源电压(4.5 V至5.5 V)
22D+远程温度传感器连接。如果未使用,请将这些引脚连接在一起。
23D–远程温度传感器连接。如果未使用,请将这些引脚连接在一起。
24RESET/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 =发出温度报警事件。一旦温度报警位被清除,该位将自动清除。
6PA_ON状态指示位 1 = PA_ON引脚为高电平。 0 = PA_ON引脚为低电平。
5EEPROM加载CRC错误指示位
1 =指示EEPROM加载到用户寄存器空间期间的CRC错误。通过向该位写入1将其清0。
3EEPROM就绪指示灯 0 = EEPROM BURN正在进行。 1 = EEPROM BURN已完成。
2双错误检测状态指示位
1 =访问操作存储器中的LUT寄存器时检测到双位错误。错误未得到纠正。通过向该位写入1将其清0。
1单个纠错状态指示位
1 =访问操作存储器中的LUT寄存器时检测到单个位错误。错误已被纠正。通过向该位写入1将其清0。
0GAN就绪指示位 1 =器件处于负输出范围操作。 0 =器件处于正输出范围操作。

**07:**软件复位寄存器 只写

软件复位命令
将0x05写入此寄存器将启动复位事件。
将0xAD写入此寄存器会启动寄存器清除事件,使所有运行内存寄存器返回出厂默认值。
在下一个串行接口命令之前需要15 µs的等待时间。

**08:**配置1寄存器 读写

说明
6温度传感器关闭控制 1 =将温度传感器置于关闭模式。 0 =将温度传感器置于连续转换模式。
5ALERT或THERM温度报警模式选择 1 = THERM模式。 0 =警报模式。
4VSS自动阈值检测器控制。设置有效的VSS电源范围。如果在正输出范围内工作,则必须设置为0 ,1 =宽VSS配置:-11 V ≤ VSS < -7 V。0 =窄VSS配置:-7 V ≤ VSS ≤ -4.5 V。
3DAC输出电流模式选择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配置寄存器 读写

说明
5LUT状态指示位 0 = LUT/ALU引擎被禁用。 1 = LUT/ALU引擎启用。
4LUT/ALU 控制 0 =启用LUT/ALU引擎。1 =禁用LUT/ALU引擎。温度传感器保持激活状态。在EEPROM访问或寄存器访问第4、5和15页期间,必须禁用LUT/ALU引擎。
3LUT 2和LUT 3温度输入 0 =本地温度传感器。 1 =远程温度传感器。
2LUT 0和LUT 1温度输入 0 =本地温度传感器。 1 =远程温度传感器。
1远程温度传感器控制 0 =禁用远程温度传感器转换。 1 =启用远程温度传感器转换。
0本地温度传感器控制 0 =禁用本地温度传感器转换。 1 =启用本地温度传感器转换。

**0B:**DAC覆盖使能寄存器 读写

说明
7DACx ALU旁路控制 0 = ALU输出发送到DACx。 1 =旁路ALU输出。将BASEx值发送到DACx。
6同上
5同上
4同上
3DACx重写控制 0 = DACx输入由LUT生成。 1 = DACx输入由串行接口可访问的DACxOW[12:0]数据寄存器提供。
2同上
1同上
0同上

**0C:**驱动启用寄存器 读写

说明
5DAC 3开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。
4OUT2开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。
1OUT1开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。
0DAC 0开关控制,如果配置为软件操作 0 =关断电压。 1 = ON电压。

**0D:**驱动器使能选择寄存器 读写

说明
5DAC 3开关控制选择 0 = DRVEN2 引脚。1 = DRV3 位。
4OUT2开关控制选择 0 = DRVEN2 引脚。1 = DRV2 位。
1OUT1软件开关控制 0 = DRVEN1 引脚。1 = DRV1 位。
0DAC 0软件开关控制 0 = DRVEN1 引脚。1 = DRV0 位。

**0E:**报警配置寄存器 读写

说明
7ALARMIN引脚复位的功能 1= ALARMIN。0 = 复位。
6PA_ON报警控制 0 = PA_ON不受报警事件影响。1 = PA_ON在报警事件期间设置为低电平。
3DAC 3报警控制 0 = DAC 3不受报警事件影响。 1 = DAC3在报警事件期间关闭。
2OUT2报警控制 0 = OUT2不受报警事件影响。 1 =在报警事件期间OUT2关闭。
1OUT 1报警控制 0 = OUT 1不受报警事件的影响。 1 =警报事件期间DAC 3关闭。
0DAC 0报警控制 0 = DAC 0不受报警事件影响。 1 = DAC 0在报警事件期间关闭。

**0F:**中断模式寄存器 读写

说明
7:6复位命令 00 =无操作。01 =等待温度转换结束。10 =释放DAC。11 =从启动电流模式释放DAC。
4AMC中断模式 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等待设备启动
2hEEPROM加载启动
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:0LUT BASE值位[12:8](+24°C时的LUT输出)。

0x66

说明
7:0LUT 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:0LUT BASE值位[12:8](+24°C时的LUT输出)。

0x66

说明
7:0LUT 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_ */

五、总结

如有错误或好的建议欢迎留言评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值