STM์ MCU์ธ STM32F103C8T6์ผ๋ก ์๋ ๋ก๊ทธ ๋๋ฐ์ด์ค์ ADXL345 ๊ฐ์๋(์์ด๋ก) ์ผ์๋ฅผ I2C๋ฅผ ์ด์ฉํ์ฌ ์ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
1) ์ด๊ธฐํ
๋จผ์ ์ด๊ธฐํ๋ฅผ ํด์ค์ผ ํ๋ค. ๋ ์ง์คํฐ ์ธํ ์ ํด์ค ๊ฒ์ด๋ค.
txData[0] = 0x31; // Data format control, Range = +/-16g (D1,D0 : 1 1)
txData[1] = 0x0B; // FULL_RES + Range
HAL_I2C_Master_Transmit(&hi2c1, ADXL345_ADDRESS, txData, 2, HAL_MAX_DELAY);
(1) ๋ฐ์ดํฐ ํฌ๋ฉง ์ค์
์ด ์ผ์์ ๊ธฐ๋ณธ ํด์๋๋ 10-bit์ด๋ค. ์ต๋ ํด์๋๋ 13-bit๋ก ์ค์ ์ด ๊ฐ๋ฅํ๋ค. ๊ฐ์๋ g ๊ฐ๋ 2~16 ์ฌ์ด์์ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
txData[0]์ ๋ฃ์ 0x31์ ๋ ์ง์คํฐ์ ์๋์ ๊ฐ์ด ๋์ ์๋ค.
๋ฐ์ดํฐ ํฌ๋ฉง ๋ ์ง์คํฐ์ด๋ค.
๋ค์์ txData[1]์ ๋ฃ์ 0x0B๋ ์ ๋ ์ง์คํฐ์ ๊ฐ์ ์ค ๊ฒ์ธ๋ฐ, 0000 1011 ๊ฐ์ผ๋ก D3์ D1, D0์ด๋ค.
D3์ '1'์ ์ค์ ํ ํด์๋(13-bit)๋ก ์ธํ ํ์๋ค. (ํด๋น ๋นํธ๊ฐ '0'์ด๋ฉด 10-bit)
FULL_RES: ์ด ๋นํธ๊ฐ '1'์ ๊ฐ์ผ๋ก ์ค์ ๋๋ฉด ์ฅ์น๋ ์ ์ฒด ํด์๋ ๋ชจ๋์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ ์ถ๋ ฅ ํด์๋๋ 4 mg/LSB ์ค์ผ์ผ ํฉํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด RANGE์ ํจ๊ป ์ฆ๊ฐํฉ๋๋ค. ์ด ๋นํธ๊ฐ '0'์ด๋ฉด ์ฅ์น๋ 10๋นํธ ๋ชจ๋์ ์๊ณ RANGE๋ ์ต๋ g-Range ๋ฐ ์ค์ผ์ผ ํฉํฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
D1, D0์ '1'์ ์ค์ G ๊ฐ ๋ฒ์๋ฅผ ์ต๋์น๋ก ์ค์ ํ์๋ค.
(์ฐธ๊ณ ๋ก ์ ๋ฐ์ดํฐ ํฌ๋ฉง ๋ ์ง์คํฐ์ ๋ณด๋ฉด D6์ SPI๊ฐ ์๋๋ฐ, ์ด ์ผ์๊ฐ SPI๋ก๋ ์ธํฐํ์ด์ค๋ฅผ ํ ์ ์์ด์ '1'์ ์ฃผ๋ฉด 3์ SPI ๋ชจ๋์ด๊ณ , '0'์ ์ฃผ๋ฉด 4์ SPI ๋ชจ๋์ด๋ค.)
(2) ๋ชจ๋ ์ค์
๋ชจ๋๋ ๊ณ์ธก ๋ชจ๋์ ์ฌ๋ฆฝ๋ชจ๋๊ฐ ์๋ค.
๋ค์์ txData[0]์ 0x2D๋ฅผ ๋ฃ๊ณ ๋ณด๋ด์ ํ์ ์ ์ด ๋ ์ง์คํฐ๋ฅผ setํ๋ค.
txData[0] = 0x2D; // Power control register
txData[1] = 0x08; // Measurement mode
HAL_I2C_Master_Transmit(&hi2c1, ADXL345_ADDRESS, txData, 2, HAL_MAX_DELAY);
ํ์ ์ ์ด ๋ ์ง์คํฐ์๋ taData[1]์ 0x08 (0000 1000) ๊ฐ์ ์ฃผ์ด ๊ณ์ธก ๋ชจ๋๋ฅผ ์ ํ๋ค.
์ธก์ : '0'์ ๋ถํ์ ๋๊ธฐ ๋ชจ๋์ ๋๊ณ '1'์ ๋ถํ์ ์ธก์ ๋ชจ๋์ ๋์ต๋๋ค. ADXL345๋ ์ต์ ์ ๋ ฅ ์๋น๋ก ๋๊ธฐ ๋ชจ๋์์ ์ ์์ ์ผญ๋๋ค.
์ด๋ ๊ฒ ์ด๊ธฐํ๋ฅผ ๋๋๋ค.
๋ ์ง์คํฐ์ ๊ฐ์ ๋ฃ์๋ ์ฑ๊ธ ๋ฐ์ดํธ ๋ผ์ดํธ๋ฅผ ์ฐธ์กฐํ์.
2) ๊ธฐ๋ฅ์ ์
์ด์ ์ผ์๊ฐ ์ฃผ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํ ๋ด์ฉ์ ์๋์ ๊ฐ์ด ์ ์ํด๋ณด์.
void ADXL345_ReadAccel(int16_t *pBuffer)
{
U08 rxData[6];
HAL_I2C_Mem_Read(&hi2c1, ADXL345_ADDRESS, 0x32, 1, rxData, 6, HAL_MAX_DELAY);
// 0x32,33 : DATA x0,1 , x axis data
// 0x34,35 : DATA y0,1 , y axis data
// 0x36,37 : DATA z0,1 , z axis data
pBuffer[0] = ((int16_t)rxData[1] << 8) | rxData[0]; // x
pBuffer[1] = ((int16_t)rxData[3] << 8) | rxData[2]; // y
pBuffer[2] = ((int16_t)rxData[5] << 8) | rxData[4]; // z
}
mem read๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํฐ ๋ฐ์ดํธ ๋ฆฌ๋๋ฅผ ํ์๋ค.
x์ถ lsb์ธ 0x32๋ฒ์ง๋ถํฐ ์ฐ์์ผ๋ก 6๋ฒ ์ฝ์ผ๋ฉด x, y, z์ lsb, msb ๋ชจ๋ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ด๋ค! ๊ทธ๋์ ๋ฆฌ๋ ๋ฐ์ดํฐ ๋ฒํผ๋ 6์นธ์ผ๋ก ์ ์ธํด์ค์ผ ํ๋ค.
์ด์ ํจ์๋ฅผ ํธ์ถํ๊ณ , ๋งค๊ฐ๋ณ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๊ฒ ๋ค.
ADXL345_ReadAccel(xyz);
๋ณ์๋ x,y,z๋๊น ๋ฐฐ์ด๋ก 3์นธํด์ฃผ๋ฉด ๋๋ค.
int16_t xyz[3];
์ด์ ADXL345_ReadAccelํจ์์์ pBuffer๋ฅผ ํ ํด๋ด๋ฉด xyz์ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
3) ๊ฒฐ๊ณผ
printf("%c[67;5f", 27);
printf("Accel X: %d \r\n", xyz[0]);
printf("%c[68;5f", 27);
printf("Accel Y: %d \r\n", xyz[1]);
printf("%c[69;5f", 27);
printf("Accel Z: %d \r\n", xyz[2]);
์ด์ ๊ฐ์ด ์๋์ค๋์ง ์ฝ์์ ์ถ๋ ฅํ์ฌ ํ์ธํด๋ณด์.
๋ญ๊ฐ ๋์จ๋ค.
์ข์ฐ๋ก ํ๋คํด๋ณด๋ฉฐ ์ด์ ํ ์คํธํ๋ฉด ๋๊ฒ ๋ค.
ํน์๋ ๋ง์ฝ์ ์ ๊ฐ์๋ ์ผ์๊ฐ ์์ง ์๋ค๋ฉด ์๋์์ ๊ตฌ๋งคํด๋ณผ ์๋ ์์ ๊ฒ์ด๋ค.
'Embedded HW & FW > STM (M3,4,7...)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[STM] STM32F103์ผ๋ก ToF ๊ฑฐ๋ฆฌ ์ผ์ VL53L1X๋ฅผ I2C๋ก ์ ์ดํ๊ธฐ (0) | 2023.04.27 |
---|---|
[STM] STM32F103์ผ๋ก ์ ์ธ์ (IR) ์จ๋ ์ผ์๋ฅผ I2C๋ก ์ ์ดํ๊ธฐ (0) | 2023.04.27 |
[STM] STM32F103C8T6์ผ๋ก SHT20 ์จ์ต๋ ์ ์ด I2C๋ก ์ ์ดํ๊ธฐ (0) | 2023.04.25 |
[STM32F103] UART TEST CODE (NO HAL) (0) | 2023.01.04 |
[STM] STM32F103, ADC 2์ฑ๋ ์ฝ๊ธฐ (0) | 2022.09.14 |
์ต๊ทผ๋๊ธ