본문 바로가기
Microchip PIC

[로드셀] HX711 사용하기

by 소나무기운 2020. 12. 11.
반응형

안녕하세요. 소나무기운입니다.

 

저울을 만드는 센서지요. 로드셀을 사용하여 무게를 잴수 있는 HX711에 대해서 알아볼겁니다.

 

ㅁ 로드셀 : 알루미늄이나 철판등이 눈에는 안보이지만 휘어질수 있는 구조를 만듭니다.

               휘어질수 있는 표면에 센서를 부착하면 이 센서는 휘어짐에 따라 저항의 변형이 생깁니다.

 

               여러가지 구조가 있습니다만. 제일 이해하기 쉬운 모양이 이렇게 생겼습니다.

3선식 로드셀

               가운데를 고정하고 가장자리를 올리거나 내리면 뒤틀림이 발생합니다.

               이 뒤틀림을 이용하는 것이죠. 로드셀 궁금하시면 찾아보시면 많이 나옵니다.

 

ㅁ 로드셀용 AD컨버터 : 오늘 알아볼 HX711 입니다.

              내부 구조를 살펴 보죠.

             

HX711 내부 구조

왼쪽에 로드셀이 있고 Gain을 거져 24-bit 시그마델타 ADC에 연결되어 있습니다.

마이컴과 연결하는 SPI 비슷한 신호라인을 가지고 있습니다.

 

 

판매되는 모듈은 이렇게 생겼네요.

 

HX711 모듈

 

 

ㅁ HX711의 특징 : 1uA이하의 power down mode (SCK 를 High로 올리면 power down mode 진입)

                         64, 32, 128 Gain 지원 (데이터를 읽고 난 후 클럭 갯수를 줘서 설정)

                         SCK의 클럭 속도가 중요함. Min Max 사이의 시간값으로 잘 맞춰야 정상 동작 함

                         컨버전 속도가 느림 약 10Hz

 

 

ㅁ 간단한 소스 코드 첨부 : Micro chip PIC micom, XC8 컴파일러 사용.

 

 

일정시간 150mS

                         HX711.c

#include "hx711.h"
#include "global.h"
//==============================================================================
extern DevSts tDevSts;

//==============================================================================
void HX711_Process(HX711 data)
{
    static uint8_t byMil = 0;
    int32_t dwData = 0;
    uint16_t nScale;

    // 150mS
    byMil++;
    if (byMil < 150)
        return;
    byMil = 0;

    INTERRUPT_GlobalInterruptDisable();
    dwData = HX711_Average_Value(data, 1);
    INTERRUPT_GlobalInterruptEnable();

    nScale = (uint16_t)(dwData >> 8);

    tDevSts.nScale = nScale;
}

//==============================================================================
void HX711_Init(HX711 data)
{
    SCLK_SetDigitalOutput();
    MISO_SetDigitalInput();

    data.gain = 1; // 1: channel A, gain factor 128

    SCLK_SetHigh();
    __delay_ms(10);
    SCLK_SetLow();
}

//==============================================================================
int32_t HX711_Average_Value(HX711 data, uint8_t times)
{
    int32_t sum = 0;

    for (int i = 0; i < times; i++)
    {
        sum += HX711_Value(data);
    }

    return sum / times;
}

//==============================================================================
int32_t HX711_Value(HX711 data)
{
    int32_t buffer;
    uint16_t nCnt = 0;

    buffer = 0;

    while (MISO_GetValue() == 1)
    {
        CLRWDT();
        __delay_ms(1);
        nCnt++;
        if (nCnt > 1000)
            return 0;
    }

    for (uint8_t i = 0; i < 24; i++)
    {
        SCLK_SetHigh();

        buffer = buffer << 1;

        if (MISO_GetValue() == 1)
        {
            buffer++;
        }

        SCLK_SetLow();
    }

    for (uint8_t i = 0; i < 1; i++) //data.gain; i++)
    {
        SCLK_SetHigh();
        SCLK_SetLow();
    }

    buffer = buffer ^ 0x800000;

    return buffer;
}

//==============================================================================
HX711 HX711_Tare(HX711 data, uint8_t times)
{
    int32_t sum = HX711_Average_Value(data, times);
    data.offset = sum;
    return data;
}
//==============================================================================

XH711.h

#ifndef HX711_H_
#define HX711_H_

//==============================================================================
#include "main.h"
#include "mcc_generated_files/mcc.h"

//==============================================================================
typedef struct _hx711
{
	int32_t offset;
	int32_t gain;
	// 1: channel A, gain factor 128
	// 2: channel B, gain factor 32
	// 3: channel A, gain factor 64
} HX711;

//==============================================================================
void HX711_Init(HX711 data);
HX711 HX711_Tare(HX711 data, uint8_t times);
int32_t HX711_Value(HX711 data);
int32_t HX711_AverageValue(HX711 data, uint8_t times);
void HX711_Process(HX711 data);
int32_t HX711_Average_Value(HX711 data, uint8_t times);
//==============================================================================
#endif /* HX711_H_ */

 

오늘도 수고하셨습니다..

반응형

댓글