|
- /*
- ADR290 外部芯片详细介绍:
- ADR290是一款低噪声微功耗精密基准源,具有高达30 V输入电压范围和2 ppm / ℃温度系数,适用于精密测量和控制应用。
- 电压范围:+2.7V至+30V
- 工作温度范围:-40℃至+85℃
- 注意事项:在应用中,建议将输入电源作为ADR290提供的参考电压来供电。
- */
- #include <reg52.h>
- // 定义ADR290芯片的地址
- #define ADR290_ADDR 0x90
- // 定义I2C总线的速度
- #define I2C_SPEED 100000
- // 定义I2C的写操作命令
- #define I2C_WRITE_CMD 0x00
- // 定义I2C的读操作命令
- #define I2C_READ_CMD 0x01
- // 定义读取ADR290芯片输出电压的函数
- float ADR290_ReadVoltage()
- {
- unsigned char buf[2];
- float voltage;
- // 发送写操作命令,设置ADR290芯片输出电压范围
- buf[0] = 0x03; // 寄存器地址
- buf[1] = 0x10; // 设置输出电压范围(Vout = 5V)
- // 启动I2C总线并发送写操作命令
- I2C_Start();
- if (!I2C_Write(ADR290_ADDR | I2C_WRITE_CMD, buf, 2)) {
- // 写操作失败,结束I2C通信并返回0
- I2C_Stop();
- return 0;
- }
- // 发送读操作命令,读取ADR290芯片输出电压
- buf[0] = 0x00; // 寄存器地址
- // 启动I2C总线并发送读操作命令
- I2C_Start();
- if (!I2C_Write(ADR290_ADDR | I2C_WRITE_CMD, &buf[0], 1)) {
- // 写操作失败,结束I2C通信并返回0
- I2C_Stop();
- return 0;
- }
- I2C_Start();
- if (!I2C_Read(ADR290_ADDR | I2C_READ_CMD, &buf[0], 2)) {
- // 读操作失败,结束I2C通信并返回0
- I2C_Stop();
- return 0;
- }
- // 计算ADR290芯片输出电压的实际值
- voltage = ((buf[0] << 8) | buf[1]) * 2.5 / 65536;
- // 结束I2C通信并返回ADR290芯片输出电压的实际值
- I2C_Stop();
- return voltage;
- }
- // 定义启动I2C总线的函数
- void I2C_Start()
- {
- // 发送起始位
- SDA = 1;
- SCL = 1;
- SDA = 0;
- // 将SCL拉低
- SCL = 0;
- }
- // 定义停止I2C总线的函数
- void I2C_Stop()
- {
- // 发送停止位
- SDA = 0;
- SCL = 1;
- SDA = 1;
- }
- // 定义向I2C总线写入数据的函数
- unsigned char I2C_Write(unsigned char addr, unsigned char *buf, unsigned char len)
- {
- unsigned char i;
- // 发送设备地址和写操作命令
- SDA = 1;
- SCL = 1;
- SDA = 0;
- SCL = 0;
- for (i = 0; i < 8; i++) {
- SDA = ((addr & 0x80) != 0);
- addr <<= 1;
- SCL = 1;
- SCL = 0;
- }
- // 发送数据
- for (i = 0; i < len; i++) {
- SDA = ((buf[i] & 0x80) != 0);
- buf[i] <<= 1;
- SCL = 1;
- SCL = 0;
- }
- // 等待从设备发送应答信号
- SDA = 1;
- SCL = 1;
- while (SDA) {
- if (--i == 0) {
- // 从设备未发送应答信号,写操作失败
- SCL = 0;
- return 0;
- }
- }
- SCL = 0;
- return 1;
- }
- // 定义从I2C总线读取数据的函数
- unsigned char I2C_Read(unsigned char addr, unsigned char *buf, unsigned char len)
- {
- unsigned char i;
- // 发送设备地址和读操作命令
- SDA = 1;
- SCL = 1;
- SDA = 0;
- SCL = 0;
- for (i = 0; i < 8; i++) {
- SDA = ((addr & 0x80) != 0);
- addr <<= 1;
- SCL = 1;
- SCL = 0;
- }
- SDA = 1;
- SCL = 1;
- SDA = 0;
- SCL = 0;
- // 读取数据
- for (i = 0; i < len; i++) {
- unsigned char j;
- for (j = 0; j < 8; j++) {
- SCL = 1;
- buf[i] = (buf[i] << 1) | SDA;
- SCL = 0;
- }
- SDA = 1;
- SCL = 1;
- SCL = 0;
- }
- // 发送应答信号
- SDA = 0;
- SCL = 1;
- SCL = 0;
- return 1;
- }
- // main函数
- void main()
- {
- float voltage;
- // 初始化I2C总线
- SDA = 1;
- SCL = 1;
- // 读取ADR290芯片输出电压
- voltage = ADR290_ReadVoltage();
- }
- // 定义读取ADR290芯片输出电压的函数
- float ADR290_ReadVoltage()
- {
- unsigned char buf[2];
- float voltage;
- / 发送读取命令 if (!I2C_Write(ADR290_ADDR, ADR290_CMD_READ, 1))
- {
- // 写操作失败,返回错误值
- return -1.0;
- }
- // 从设备读取数据
- if (!I2C_Read(ADR290_ADDR, buf, 2)) {
- // 读操作失败,返回错误值
- return -1.0;
- }
- // 将读取的数据转换为电压值
- voltage = ((buf[0] << 8) | buf[1]) * ADR290_VOLTAGE_LSB;
- return voltage;
- }
复制代码
|
|