打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
INA3221的使用教程(IIC)

INA3221使用方法和INA226基本上一致,多了选择多通道读取,根据数据手册制定不一样的初始化代码。

INA3221不能够直接读分流电阻的电流,但可以通过算得两端电压算出电流。

上代码:

INA3221.c:

#include "INA3221.h"static void delay_nns_3221(uint16_t D)  //30纳秒ns  根据手册要用到IIC的HS高速模式{    while(--D);}void delay_nms_3221(uint16_t ms)  //毫秒{    uint16_t i;    uint32_t M = 0;//720W    for(i = 0;i < ms; i  )    for(M=12000;M > 0;M--);}void delay_nus_3221(uint16_t us)//微秒{    uint16_t i;    uint16_t M = 0;//720W    for(i = 0;i < us; i  )    for(M=72;M > 0;M--);}/****************IIC***************************/void INA3221_IIC_Init(void){    GPIO_InitTypeDef GPIO_Initure;    __HAL_RCC_GPIOB_CLK_ENABLE();   //使能GPIOB时钟         //PC11,12初始化设置    GPIO_Initure.Pin=GPIO_PIN_6|GPIO_PIN_7;//PB6SCL PB7SDA    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉    GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;     //高速    HAL_GPIO_Init(GPIOB,&GPIO_Initure);        IIC_SDA_H_3221;    IIC_SCL_H_3221;          delay_nms_3221(5);}    void INA3221_IIC_Start(void){    IIC_SDA_H_3221;                IIC_SCL_H_3221;    delay_nns_3221(5);     IIC_SDA_L_3221;//START:when CLK is high,DATA change form high to low     delay_nns_3221(5);    IIC_SCL_L_3221;//钳住I2C总线,准备发送或接收数据     delay_nns_3221(5);}    void INA3221_IIC_Stop(void){    IIC_SDA_L_3221;//STOP:when CLK is high DATA change form low to high     delay_nns_3221(5);    IIC_SCL_H_3221;         delay_nns_3221(5);    IIC_SDA_H_3221;//发送I2C总线结束信号    delay_nns_3221(5);                                   }void INA3221_IIC_Ack(void){    IIC_SDA_L_3221;    delay_nns_3221(5);    IIC_SCL_H_3221;    delay_nns_3221(5);    IIC_SCL_L_3221;        delay_nns_3221(5);    IIC_SDA_H_3221;}void INA3221_IIC_NAck(void){    IIC_SDA_H_3221;    delay_nns_3221(5);    IIC_SCL_H_3221;delay_nns_3221(5);    IIC_SCL_L_3221;    delay_nns_3221(5);    IIC_SDA_L_3221;}        uint8_t INA3221_IIC_Wait_Ack(void){    uint8_t ucErrTime=0;    //SDA_IN();      //SDA设置为输入      IIC_SDA_H_3221;    delay_nns_3221(5);           IIC_SCL_H_3221;    delay_nns_3221(5);                  while(READ_SDA_3221)    {        ucErrTime  ;        if(ucErrTime>250)        {            INA3221_IIC_Stop();            return 1;        }    }    IIC_SCL_L_3221;//时钟输出0            return 0;  }void INA3221_IIC_Send_Byte(uint8_t txd){                                 IIC_SCL_L_3221;//拉低时钟开始数据传输   for(uint8_t i = 0;i < 8;i  )    {                      if(txd&0x80)                    IIC_SDA_H_3221;                else                    IIC_SDA_L_3221;                        txd<<=1;                               IIC_SCL_H_3221;        delay_nns_3221(5);        IIC_SCL_L_3221;        delay_nns_3221(5);    }                //    IIC_SDA_H_3221;    //    IIC_SCL_H_3221;            //当去掉wait_ack时的时候添加    //    delay_nns_3221(5);        //IIC_SCL_L_3221;} uint8_t INA3221_IIC_Read_Byte(unsigned char ack){      uint8_t TData=0,i;    for(i=0;i<8;i  )    {        IIC_SCL_H_3221;        delay_nns_3221(5);        TData=TData<<1;        //if(GPIOB->IDR& GPIO_IDR_IDR7)        //判断SDA是否为高            if(SDA_READ_3221)        {            TData|=0x01;        }        IIC_SCL_L_3221;        delay_nns_3221(5);    }        if(!ack)            INA3221_IIC_NAck();        else            INA3221_IIC_Ack();//    IIC_SCL_L_3221;//    delay_nns_3221(5);//    IIC_SDA_L_3221;//    delay_nns_3221(5);                //ACK//    IIC_SCL_H_3221;//    delay_nns_3221(5);//    IIC_SCL_L_3221;//    delay_nns_3221(5);//    IIC_SDA_H_3221;    return TData;}/**********************IIC_END*************************/void INA3221_Init(void){    INA3221_IIC_Init();    //HAL_Delay(10);    INA3221_SendData(0x82 ,CFG_REG_3221,0x8000);//软件复位    INA3221_SendData(0x84 ,CFG_REG_3221,0x8000);    HAL_Delay(10);    INA3221_SendData(0x82 ,CFG_REG_3221,0x7127);//7127    INA3221_SendData(0x84 ,CFG_REG_3221,0x7127);//    HAL_Delay(2);//    INA3221_SendData(0x82, 0x01, 0x00);//    INA3221_SendData(0x82, 0x03, 0x00);//    INA3221_SendData(0x82, 0x05, 0x00);//    INA3221_SendData(0x84, 0x01, 0x00);//    INA3221_SendData(0x84, 0x03, 0x00);//    INA3221_SendData(0x84, 0x05, 0x00);//    }void INA3221_SendData(uint8_t addr,uint8_t reg,uint16_t data){    uint8_t temp = 0;    INA3221_IIC_Start();    INA3221_IIC_Send_Byte(addr);    INA3221_IIC_Wait_Ack();     INA3221_IIC_Send_Byte(reg);    INA3221_IIC_Wait_Ack();        temp = (uint8_t)(data>>8);    INA3221_IIC_Send_Byte(temp);    INA3221_IIC_Wait_Ack();     temp = (uint8_t)(data&0x00FF);    INA3221_IIC_Send_Byte(temp);    INA3221_IIC_Wait_Ack();        INA3221_IIC_Stop();}void INA3221_SetRegPointer(uint8_t addr,uint8_t reg){    INA3221_IIC_Start();     INA3221_IIC_Send_Byte(addr);    INA3221_IIC_Wait_Ack();     INA3221_IIC_Send_Byte(reg);    INA3221_IIC_Wait_Ack();     INA3221_IIC_Stop();}uint16_t INA3221_ReadData(uint8_t addr){    uint16_t temp=0;    INA3221_IIC_Start();     INA3221_IIC_Send_Byte(addr 1);    INA3221_IIC_Wait_Ack();        temp = INA3221_IIC_Read_Byte(1);    temp<<=8;        temp |= INA3221_IIC_Read_Byte(0);        INA3221_IIC_Stop();    return temp;}uint16_t INA3221_GetVoltage(uint8_t addr,uint8_t channel){    uint32_t temp=0;    switch(channel)    {        case 1:INA3221_SetRegPointer(addr,0x02);break;        case 2:INA3221_SetRegPointer(addr,0x04);break;        case 3:INA3221_SetRegPointer(addr,0x06);break;        default:break;    }    temp = INA3221_ReadData(addr);//printf("\r\n temp = %d",temp);    if(temp&0x8000)    temp = ~(temp - 1);        return (uint16_t)temp;//    return (u16)temp;    }//40uV/bituint16_t INA3221_GetShuntVoltage(uint8_t addr,uint8_t channel){    uint32_t temp=0;    switch(channel)    {        case 1:INA3221_SetRegPointer(addr,0x01);break;        case 2:INA3221_SetRegPointer(addr,0x03);break;        case 3:INA3221_SetRegPointer(addr,0x05);break;        default:break;    }    temp = INA3221_ReadData(addr);    if(temp&0x8000)    temp = ~(temp - 1);        return (uint16_t)temp;    }//1mA/bit//long INA226_GetShunt_Current(u8 addr)//{//    long temp=0;//    INA226_SetRegPointer(addr,CUR_REG);//    temp = INA226_ReadData(addr);//    if(temp&0x8000)//    {//        temp = ~(temp - 1);//        temp = (u16)temp - 2 * (u16)temp;//    }//    return temp;//}
View Code

INA3221.h:

#ifndef __INA3221_H#define __INA3221_H #include "main.h"#define     CFG_REG_3221             0x00        //#define     SV_REG_3221             0x01        //分流电压, 此处分流电阻为 0.1欧#define     BV_REG_3221             0x02        //总线电压#define     PWR_REG_3221         0x03        //电源功率#define     CUR_REG_3221        0x04        //电流#define     CAL_REG_3221         0x05        //校准,设定满量程范围以及电流和功率测数的 //#define     ONFF_REG         0x06        //屏蔽 使能 警报配置和转换准备就绪//#define     AL_REG             0x07        //包含与所选警报功能相比较的限定值#define     INA3221_GET_ADDR 0XFF        //包含唯一的芯片标识号#define       INA3221_ADDR1    0x80//IO操作#define IIC_SCL_H_3221   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET) //SCL H#define IIC_SCL_L_3221   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET) //SCL H#define IIC_SDA_H_3221   HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET) //SDA_H#define IIC_SDA_L_3221  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_RESET) //SDA_L#define READ_SDA_3221     HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)  //输入SDA#define SDA_READ_3221  GPIOB->IDR& GPIO_IDR_IDR7  static void delay_nns_3221(uint16_t D);void delay_nms_3221(uint16_t ms) ;    void delay_nus_3221(uint16_t us);        void INA3221_IIC_Init(void);            void INA3221_IIC_Start(void);    void INA3221_IIC_Stop(void);void INA3221_IIC_Ack(void);void INA3221_IIC_NAck(void);uint8_t INA3221_IIC_Wait_Ack(void);void INA3221_IIC_Send_Byte(uint8_t txd);uint8_t INA3221_IIC_Read_Byte(unsigned char ack);void INA3221_Init(void);    void INA3221_SendData(uint8_t addr,uint8_t reg,uint16_t data);        void INA3221_SetRegPointer(uint8_t addr,uint8_t reg);            uint16_t INA3221_ReadData(uint8_t addr);            uint16_t INA3221_GetVoltage(uint8_t addr,uint8_t channel);            uint16_t INA3221_GetShuntVoltage(uint8_t addr,uint8_t channel);                             #endif
View Code

 

来源:https://www.icode9.com/content-4-692801.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
IIC详解,包括原理、过程,最后一步步教你实现IIC
stm32之IIC通信协议
SHT30使用的学习过程2 SHT30驱动程序
linux e2prom 驱动代码
【新提醒】基于HC32V103开发板的OLED显示驱动
超详细陀螺仪MPU6050模块输出姿态角(有完整版源码)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服