در ارتباط MCU های با سطح ولتاژ منطقی 5 ولت با سنسور ها و چیپ های با تغذیه پایین تر از 5 ولت ، باید از کانورترهای سطح ولتاژ استفاده کرد . در بسیاری از سنسور های ULP ولتاژ تغذیه حتی پایین تر از 3.3 ولت است به طور مثال ممکن است ولتاژ کاری 1.2 ولت باشد . در چنین شرایطی استفاده از تقسیم مقاومتی کار مناسبی به نظر نمی رشد چرا که وجود مقاومت باعث تلف انرژی خواهد و این موضوع در ندارات پرتابل و ULP از اهمیت بالایی برخوردار است . چیپ PCA9306 یک کانورتر ارتباط های I2C با سطح 1.2 ولت به 5 ولت ارتباط I2C می باشد . در واقع این ماژول امکان ارتباط یک MCU با ولتاژ خروجی حداکثر 5 ولت را با سنسور هایی با ولتاژ حداقل 1.2 ولت فراهم می سازد .

در تصویر زیر پین های این مازول نشان داده شد است :

پین های SCL1 و SDA1 به MCU با ولتاژ بالاتر متصل می شود .

پین های SCL2 و SDA2 نیز به چیپ با ولتاژ پایین تر متصل میشود .

همچنین پین های VREF1 و VREF2 برای ولتاژ مرجع هر کدام از طرفین ارتباط می باشد . این پین ها را باید به تغذیه MCU و زرف دوم ارتباط متصل نمود .

 

 

راه اندازی ماژول PCA9306 با آردوینو :

در مثال زیر برای راه اندازی ماژول HMC5883L از ماژول PCA9306 استفاده شده است . نحوه اتصال ماژول در تصویر زیر نشان داده شده است .

 

 

 

#include <Arduino.h> 
#include "HMC5883L.h"

HMC5883L::HMC5883L()
{
 m_Scale = 1;
}

MagnetometerRaw HMC5883L::ReadRawAxis()
{
 uint8_t* buffer = Read(DataRegisterBegin, 6);
 MagnetometerRaw raw = MagnetometerRaw();
 raw.XAxis = (buffer[0] << 8) | buffer[1];
 raw.ZAxis = (buffer[2] << 8) | buffer[3];
 raw.YAxis = (buffer[4] << 8) | buffer[5];
 return raw;
}

MagnetometerScaled HMC5883L::ReadScaledAxis()
{
 MagnetometerRaw raw = ReadRawAxis();
 MagnetometerScaled scaled = MagnetometerScaled();
 scaled.XAxis = raw.XAxis * m_Scale;
 scaled.ZAxis = raw.ZAxis * m_Scale;
 scaled.YAxis = raw.YAxis * m_Scale;
 return scaled;
}

int HMC5883L::SetScale(float gauss)
{
    uint8_t regValue = 0x00;
    if(gauss == 0.88)
    {
        regValue = 0x00;
        m_Scale = 0.73;
    }
    else if(gauss == 1.3)
    {
        regValue = 0x01;
        m_Scale = 0.92;
    }
    else if(gauss == 1.9)
    {
        regValue = 0x02;
        m_Scale = 1.22;
    }
    else if(gauss == 2.5)
    {
        regValue = 0x03;
        m_Scale = 1.52;
    }
    else if(gauss == 4.0)
    {
        regValue = 0x04;
        m_Scale = 2.27;
    }
    else if(gauss == 4.7)
    {
        regValue = 0x05;
        m_Scale = 2.56;
    }
    else if(gauss == 5.6)
    {
        regValue = 0x06;
        m_Scale = 3.03;
    }
    else if(gauss == 8.1)
    {
        regValue = 0x07;
        m_Scale = 4.35;
    }
    else
        return ErrorCode_1_Num;
    
    // Setting is in the top 3 bits of the register.
    regValue = regValue << 5;
    Write(ConfigurationRegisterB, regValue);
}

int HMC5883L::SetMeasurementMode(uint8_t mode)
{
    Write(ModeRegister, mode);
}

void HMC5883L::Write(int address, int data)
{
 Wire.beginTransmission(HMC5883L_Address);
 Wire.write(address);
 Wire.write(data);
 Wire.endTransmission();
}

uint8_t* HMC5883L::Read(int address, int length)
{
 Wire.beginTransmission(HMC5883L_Address);
 Wire.write(address);
 Wire.endTransmission();
 
 Wire.beginTransmission(HMC5883L_Address);
 Wire.requestFrom(HMC5883L_Address, length);

 uint8_t buffer[length];
 if(Wire.available() == length)
 {
     for(uint8_t i = 0; i < length; i++)
     {
         buffer[i] = Wire.read();
     }
 }
 Wire.endTransmission();

 return buffer;
}

char* HMC5883L::GetErrorText(int errorCode)
{
    if(ErrorCode_1_Num == 1)
        return ErrorCode_1;
    
    return "Error not defined.";
}

 

Tags:
About Author: USER_4