안녕하세요. 소나무기운입니다.
저울을 만드는 센서지요. 로드셀을 사용하여 무게를 잴수 있는 HX711에 대해서 알아볼겁니다.
ㅁ 로드셀 : 알루미늄이나 철판등이 눈에는 안보이지만 휘어질수 있는 구조를 만듭니다.
휘어질수 있는 표면에 센서를 부착하면 이 센서는 휘어짐에 따라 저항의 변형이 생깁니다.
여러가지 구조가 있습니다만. 제일 이해하기 쉬운 모양이 이렇게 생겼습니다.
가운데를 고정하고 가장자리를 올리거나 내리면 뒤틀림이 발생합니다.
이 뒤틀림을 이용하는 것이죠. 로드셀 궁금하시면 찾아보시면 많이 나옵니다.
ㅁ 로드셀용 AD컨버터 : 오늘 알아볼 HX711 입니다.
내부 구조를 살펴 보죠.
왼쪽에 로드셀이 있고 Gain을 거져 24-bit 시그마델타 ADC에 연결되어 있습니다.
마이컴과 연결하는 SPI 비슷한 신호라인을 가지고 있습니다.
판매되는 모듈은 이렇게 생겼네요.
ㅁ 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_ */
오늘도 수고하셨습니다..
'Microchip PIC' 카테고리의 다른 글
MPLAB X IDE 단축키 정리 (0) | 2021.12.27 |
---|---|
[C언어] unused parameter 'xxx' 해결방법 (0) | 2021.12.07 |
[개발제품소개] BLE, 로드셀, 모바일폰 통신, 저소모전력 설계 (0) | 2021.02.08 |
[열전대 온도센서] MCP9600 사용하기 (0) | 2020.12.15 |
[PIC] HEF ( High Endurance Flash ) EEP ROM 대용 (1) | 2020.08.28 |
댓글