OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5813|回复: 1

STM32驱动ADM1191实现电流电压的实时监控

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-7-1
在线时间
2 小时
发表于 2021-7-5 16:51:43 | 显示全部楼层 |阅读模式
2金钱
想使用stm32f405来驱动ADM1191实现被测电阻两端的电压电流的实时监控
原理图:

我的程序:
int main()
{
        uint8_t rd_buf[3];
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        LED_GPIO_Config();
        init_control_power_pin();
        SysTick_Init();
        //Usart1_init(115200);
        //Uart4_init(115200);
        _485_init(115200);
        power_en();
        //__1191_convert_con();
        while(1)
        {
                        if(ee_CheckOk())
                        {
                                if(__1191_read_V(rd_buf)) //读取数据
                                {
                                        for(u8 i=0;i<2;i++)
                                        {
                                                _485_SendByte(rd_buf);
                                                //Delay_ms(1000);
                                        }
                                }
                                else
                                        myprintf("read data failed\r\n");
                        }
                        else
                                myprintf("no i2c device!\r\n");
                        LED_TOGGLE;
                        Delay_ms(1000);
        }
}


uint8_t __1191_convert_once()
{
        i2c_Start();
        i2c_SendByte(ADDRESS_ADM1191_ARM|ADM1191_I2C_WR);
        if(i2c_WaitAck() != 0)
        {
                goto cmd_fail;
        }
        i2c_SendByte(0x01);
        if(i2c_WaitAck() != 0)
        {
                goto cmd_fail;
        }
        i2c_Stop();
        cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
        /* 发送I2C总线停止信号 */
        i2c_Stop();
        return 0;
}

/*从ADM1191读取电压*/
uint8_t __1191_read_V(uint8_t *_pReadBuf)
{
        CONV_EN();
        __1191_convert_once();
        Delay_us(200);
        i2c_Start();
        //myprintf("125\n");
        i2c_SendByte(ADDRESS_ADM1191_ARM | ADM1191_I2C_RD);
        if (i2c_WaitAck() != 0)
        {
                goto cmd_fail;        /* EEPROM器件无应答 */
        }
        //Delay_us(500);
        for(uint8_t i=0;i<2;i++)
        {               
                        _pReadBuf = i2c_ReadByte();
                        if(i == 1)
                        {
                                i2c_NAck();
                        }
                        else
                                i2c_Ack();       
        }
        i2c_Stop();
        CONV_DISABLE();
        return 1;
       
        cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
        /* 发送I2C总线停止信号 */
        i2c_Stop();
        return 0;
}

void CONV_EN()
{
        GPIO_SetBits(CONV_GPIO_PORT,CONV_GPIO_PIN);
}
void CONV_DISABLE()
{
        GPIO_ResetBits(CONV_GPIO_PORT,CONV_GPIO_PIN);
}

串口助手获取的数据:

我的疑问:
原理图上是12v,所以所测电压应该在12v左右,但跟我实际测得的数据偏差太大。
求各位大佬救救孩子吧!!!!!!!!!
求求了!!!!!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-7-1
在线时间
2 小时
 楼主| 发表于 2021-7-5 16:54:52 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 11:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表