์ I2C ์ผ์๋ฅผ ๋ถ์ด๋๋ฐ ๊ฐ์ด ๊ณ์ ์ด์ํ๋ค. ์ฝ๋๋ฅผ ๋ช ๋ฒ ๊ณ ์ณค๋๋ฐ ๋์์ง์ง ์์๊ณ ์ฌ์์๋ฅผ ๋ณด๋ ์ฝ๋ ๋ฌธ์ ๊ฐ ์๋์๋ค.
Table of contents
Open Table of contents
๋ณํ ์๊ฐ์ด ํ์ํ๋ค
์ฝ๋ ํ๋ฆ์ ์ด๋ฌ๋ค.
i2c_write(ADDR, REG_CTRL, CMD_START); /* ์ธก์ ์์ */
i2c_read(ADDR, REG_DATA, buf, 2); /* ๊ฐ ์ฝ๊ธฐ */
CMD_START ๋ฅผ ๋ณด๋ด๊ณ ๊ณง๋ฐ๋ก i2c_read ๋ฅผ ๊ฑด๋ค. ์ฌ์์์๋ ์ด๋ ๊ฒ ์ ํ ์์๋ค.
Measurement time: typ. 65ms, max. 85ms (14-bit resolution)
์ธก์ ์ 65๋ฐ๋ฆฌ์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ ๊ทธ ์ ์ ์ฝ์ผ๋ฉด ์ด์ ๊ฐ์ด๋ ์ฐ๋ ๊ธฐ๊ฐ ๋์จ๋ค.
i2c_write(ADDR, REG_CTRL, CMD_START);
delay_ms(90); /* ์ต๋์น๋ณด๋ค ์ฌ์ */
i2c_read(ADDR, REG_DATA, buf, 2);
90๋ฐ๋ฆฌ์ด๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๊ณ ์ต๋์น๊ฐ 85๋๊น ์ฌ์ ๋ฅผ ๋๋ค. ์ด ์๊ฐ์ ์ผ์๊ฐ ์ ํ ๊ฒ์ด๋ผ ์ฝ๋๋ก ์ค์ผ ์ ์๋ค.
์ค๋น ์ฌ๋ถ๋ฅผ ๋ฌผ์ด๋ณด๋ ๋ฐฉ๋ฒ๋ ์์๋ค
๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ํ๋ฅผ ํ์ธํ ์๋ ์์๋ค.
i2c_write(ADDR, REG_CTRL, CMD_START);
int wait = 0;
uint8_t st;
do {
delay_ms(5);
i2c_read(ADDR, REG_STATUS, &st, 1);
wait += 5;
} while (!(st & STATUS_READY) && wait < 200);
if (!(st & STATUS_READY)) return -1; /* ์ํ ์ด๊ณผ */
i2c_read(ADDR, REG_DATA, buf, 2);
STATUS_READY ๊ฐ ์๋ฉด ๋ฐ๋ก ์ฝ์ผ๋ ํ๊ท ๋๊ธฐ๊ฐ ์งง์์ง๋ค. ๋์ ํต์ ์ด ๋์ด๋๊ณ 5๋ฐ๋ฆฌ์ด๋ง๋ค ์ํ๋ฅผ ๋ฌป๋๋ค.
์ด ์ฅ์น๋ 1์ด์ ํ ๋ฒ ์ฝ์ผ๋ฉด ๋๋ ๊ณ ์ ๋๊ธฐ๋ก ํ๊ณ ์์ฃผ ์ฝ์ด์ผ ํ๋ ์๋ฆฌ๋ผ๋ฉด ์ํ ํ์ธ์ด ๋ซ๋ค.
ํด์๋ ์ค์ ์ ๋ฐ๋ผ ์๊ฐ์ด ๋ฌ๋ผ์ก๋ค
์ฌ์์๋ฅผ ๋ ์ฝ์ด ๋ณด๋ ํด์๋ ์ค์ ์ด ์์๋ค.
14-bit 65ms
12-bit 17ms
11-bit 9ms
์ฐ๋ฆฌ๋ 0.1๋ ๋จ์๋ฉด ์ถฉ๋ถํด์ ํด์๋๋ฅผ 12๋นํธ๋ก ๋ฎ์ท๊ณ ๋๊ธฐ๊ฐ 17๋ฐ๋ฆฌ์ด๋ก ์ค์๋ค.
ํ์ํ ์ ๋ฐ๋๋ฅผ ๋จผ์ ์ ํ๋ฉด ๋๋จธ์ง๊ฐ ์ ํด์ง๋ค. ๋ฌด์กฐ๊ฑด ์ต๊ณ ํด์๋๋ฅผ ์ธ ์ด์ ๊ฐ ์์๊ณ ๊ทธ ์ค์ ๋ I2C ๋ก ๋ ์ง์คํฐ์ ์จ ๋ฃ๋ ๊ฐ์ด๋ค.
๋ณํ์๊ณผ ์ ๊ธฐ ํน์ฑ
๊ฐ์ ๋ณํํ๋ ์๋ ํ์ธํ๋ค.
Temperature = -46.85 + 175.72 * (raw / 65536)
๋ด๊ฐ ์ฐ๋ ์์ raw / 256.0 ์ด์๋๋ฐ ๋ค๋ฅธ ์ผ์์ ์์ด์๋ค.
float temp = -46.85f + 175.72f * ((float)raw / 65536.0f);
๊ณ์๊ฐ ์ผ์๋ง๋ค ๋ค๋ฅด๋ ๋น์ทํ ์ผ์๋ผ๊ณ ๊ฐ์ ์์ ์ฐ๋ฉด ์ ๋๋ค. ๊ณ์๋ฅผ #define ์ผ๋ก ๋นผ ๋๋ฉด ๋ค์์ ์ผ์๊ฐ ๋ฐ๋์ด๋ ๊ทธ ์ค๋ง ๊ณ ์น๋ฉด ๋๋ค.
๊ฐ์ด ๊ฐ๋ ํ๋ ๋ฌธ์ ๋ ๋จ์ ์์ด์ ์ฌ์์์ ์ ๊ธฐ ํน์ฑ์ ๋ดค๋ค.
Supply voltage: 2.1 ~ 3.6V
I2C pull-up: 10kฮฉ typ.
ํ๋ก๋ฅผ ํ์ธํ๋ ํ์ ์ ํญ์ด 4.7k์๊ณ ๋ฒ์ ์์ด๊ธด ํ๋ฐ ์ ์ด ๊ธธ์ด์ ์ ํธ๊ฐ ํ๋ค๋ ธ๋ค.
I2C ๋ SDA ์ SCL ๋ ์ ํธ์ ์ ์ฌ๋ฟ์ด ๋๋ ์ฐ๋ ๊ตฌ์กฐ๋ผ ํ์
์ด ์์ผ๋ฉด ์ ํธ๊ฐ ๋์ ์ชฝ์ผ๋ก ์ ์ฌ๋ผ๊ฐ๋ค. ์ด๊ฒ์ ์ฝ๋๋ก ๋ชป ๊ณ ์ณ์ ํ๋์จ์ด ๋ด๋น์์๊ฒ ๋๊ฒผ๋ค.
์ฆ์์ด ์ฝ๋์์ ์ ์กํ๋ฉด ๊ทธ ์๋๋ฅผ ๋ด์ผ ํ๋ค.
๊ฒ์ฆ โ ํ์ธ ์์์ ์๋ณ ๋ ์ง์คํฐ
์ ์ฅ์น๋ฅผ ๋ถ์ผ ๋ ๋ณผ ์์๋ฅผ ์ ์๋ค.
1. ์ฌ์์์์ ํ์ธ
- ์ฃผ์, ๋ ์ง์คํฐ ๋งต
- ์ธก์ ์๊ฐ, ์ค๋น ํ์ธ ๋ฐฉ๋ฒ
- ๊ฐ ๋ณํ์
- ๋์ ๋ฒ์ (์จ๋, ์ ์)
- ํต์ ์๋ ์ํ
2. ํต์ ํ์ธ
- ์ฃผ์๋ก ์๋ตํ๋๊ฐ (์ค์บ)
- ์๋ณ ๋ ์ง์คํฐ ๊ฐ์ด ๋ง๋๊ฐ
3. ๊ฐ ํ์ธ
- ์๋ ค์ง ์กฐ๊ฑด์์ ๊ฐ์ด ๋ง๋๊ฐ (์์จ์์ 25๋ ๊ทผ์ฒ)
- ๋ฒ์ ์์ธ๊ฐ
- ๋ฐ๋ณต ์ฝ์์ ๋ ํ๋ค๋ฆผ์ด ์ผ๋ง์ธ๊ฐ
2๋ฒ์ ์๋ณ ๋ ์ง์คํฐ ํ์ธ์ด ์ ์ฉํ๋ค. ๋๋ถ๋ถ์ ์ผ์๊ฐ ๊ณ ์ ๊ฐ์ ์ฃผ๋ ๋ ์ง์คํฐ๋ฅผ ๊ฐ๊ณ ์๋ค.
uint8_t id;
i2c_read(ADDR, REG_ID, &id, 1);
if (id != EXPECTED_ID) {
log_error("์ผ์ ์๋ณ ๋ถ์ผ์น: 0x%02X (๊ธฐ๋ 0x%02X)", id, EXPECTED_ID);
return -1;
}
REG_ID ๊ฐ ๋ง์ผ๋ฉด ํต์ ์ ๋๋ ๊ฒ์ด๊ณ ๊ฐ์ด ์ด์ํ๋ฉด ํต์ ์ด ์๋๋ผ ๋ค๋ฅธ ๋ฌธ์ ๋ค. ํต์ ์์ฒด๊ฐ ์ ๋๋๋ฐ ๊ฐ ์ฒ๋ฆฌ๋ฅผ ๋ณด๋ ๊ฒ์ ์์๊ฐ ๋ค๋ฐ๋ ๊ฒ์ด๋ค.
๊ฐ๋ค์ด ์ด๋์ ์๋์ง ์ ์ ์๊ฒ ์ฃผ์๋ ๋ฌ์๋ค.
#define MEAS_TIME_MS 90 /* ์ฌ์์ 5.2์ : 14bit max 85ms */
#define TEMP_MIN (-40.0f) /* ์ฌ์์ 2.1์ ๋์ ๋ฒ์ */
#define EXPECTED_ID 0xBE /* ์ฌ์์ 6.4์ */
์ซ์๋ง ์์ผ๋ฉด ์ ๊ทธ ๊ฐ์ธ์ง ๋ชจ๋ฅด๋๋ฐ ์ฌ์์ ์ ๋ฒํธ๋ฅผ ์ ์ด ๋๋ ํ์ธ์ด ๋นจ๋ผ์ก๋ค.
์ ๋ฆฌ
- ํ๋์จ์ด๊ฐ ์ ํ ๊ฒ์ ์ฝ๋๋ก ๋ชป ๋ฐ๊พธ๋ ์ฌ์์๋ฅผ ๋จผ์ ๋ณธ๋ค
- ๊ฐ์ ์๋ฆฌ๋ฅผ ๊ณ์ ๊ณ ์น๋ฉด ๊ทธ ์๋ฆฌ๊ฐ ์์ธ์ด ์๋ ์ ์๋ค
- ์ธก์ ์๊ฐ์ด ์์ผ๋ฉด ๊ทธ๋งํผ ๊ธฐ๋ค๋ฆฌ๊ณ ์ต๋์น๋ณด๋ค ์ฌ์ ๋ฅผ ๋๋ค
- ์ค๋น ํ์ธ ๋ฐฉ์๊ณผ ๊ณ ์ ๋๊ธฐ๋ ์ฝ๋ ๋น๋๋ก ๊ณ ๋ฅธ๋ค
- ์ ๋ฐ๋ ์ค์ ์ด ์ธก์ ์๊ฐ์ ์ ํ๋ค
- ๋ณํ์์ ์ผ์๋ง๋ค ๋ค๋ฅด๋ ๋น์ทํ๋ค๊ณ ๊ฐ์ ์์ ์ฐ์ง ์๋๋ค
I2C๋ ํ์ ์ด ์์ผ๋ฉด ์ ํธ๊ฐ ์ ์ฌ๋ผ๊ฐ๋ค- ์ฝ๋์์ ์ ์กํ๋ฉด ์ ๊ธฐ ํน์ฑ๊ณผ ํ๋ก๋ฅผ ๋ณธ๋ค
- ์๋ณ ๋ ์ง์คํฐ๋ก ํต์ ์ฌ๋ถ๋ฅผ ๋จผ์ ๊ฐ๋ฅธ๋ค
#define์์ ์์ ์ฌ์์ ์ ๋ฒํธ๋ฅผ ์ ์ด ๋๋ค