You are on page 1of 17

MMA8452Q – STM32

LÊ DUY MINH – 090 4011 740

MỤC LỤC

1. Cảm biến gia tốc kiểu MEM MMA8452q...................................................................................3


II. GIAO TIẾP I2C GIỮA VI ĐIỀU KHIỂN STM32F103 VÀ CẢM BIẾN GIA TỐC MMA8452Q...................4
1. Giao tiếp I2C của cảm biến gia tốc MMA8452Q.........................................................................4
1.1 Hoạt động I2C.....................................................................................................................4
1.2 Lưu đồ thuật toán giao tiếp giữa vi điều khiển STM32F103 và cảm biến gia tốc
MMA8452Q...................................................................................................................................7
1.3 Lập trình giao tiếp giữa cảm biến MMA8452Q và vi điều khiển STM32F103....................8
1.4 Dòng dữ liệu 12 bít và chuyển đổi dữ liệu........................................................................11
1.5 Định nghĩa các thanh ghi của cảm biến gia tốc MMA8452Q...........................................13
Mô đun cảm biến gia tốc MMA8452Q........................................................................................15

Hình 1. Cảm biến gia tốc MMA8452Q.........................................................................3


Hình 2. Quy định phương đo của cảm biến gia tốc MMA8452Q.................................3
Hình 3. Biểu đồ đọc 1 byte từ cảm biến gia tốc MMA8452Q.......................................5
Hình 4. Sơ đồ ghi 1 byte tín hiệu từ vi điều khiển chủ lên cảm biến MMA8452Q.......6
Hình 5. Lưu đồ thuật toán giao tiếp giữa vi điều khiển và cảm biến.............................7
Hình 6. Mô đun cảm biến gia tốc MMA 8452Q.........................................................15
Hình 7. Sơ đồ mạch nguyên lý mô đun cảm biến gia tốc MMA8452Q......................15

MỤC LỤC BẢNG


Bảng 1. Các chân dùng trong truyền thông I2C của cảm biến MMA8452Q..................4
Bảng 2. Thanh ghi 0x2A...............................................................................................9
Bảng 3. Thanh ghi XYZ_DATA_CFG (địa chỉ 0x0E).................................................9
Bảng 4. Thiết lập dải đo với các giá trị FS0 và 1..........................................................9
Bảng 5. Thiết lập tần số lấy mẫu với các giá trị DR....................................................10
Bảng 6. Thanh ghi trạng thái (chỉ đọc)........................................................................11
Bảng 7. Thanh ghi dữ liệu X_MSB (0x00).................................................................11
Bảng 8. Thanh ghi dữ liệu X_LSB (0x01)..................................................................12

1
LÊ DUY MINH – 090 4011 740

1. Cảm biến gia tốc kiểu MEM MMA8452q

Hình 1. Cảm biến gia tốc MMA8452Q.

Cảm biến gia tốc MMA8452Q đo rung động theo 3 phương X, Y, Z với đầu ra
số có độ phân giải 12/8 bít được đóng gói với các hàm nhúng có thể lập trình. Hai
chân ngắt có thể cấu hình với các hàm ngắt nhằm tiết kiệm năng lượng cho vi điều
khiển chủ trong quá trình thu thập dữ liệu liên tục.
Có thể lựa chọn độ phân giải ±2g, ±4g và ±8g với bộ lọc thông cao thời gian
thực cho cảm biến gia tốc MMA8452Q.
Thông số kỹ thuật
- Kích thước: 3x3x1mm.
- Nguồn nuôi: 1,95 – 3,6 VDC.
- Mức điện áp giao tiếp: 1,95 – 3,6 VDC.
- Độ phân giải: ±2g, ±4g, ±8g.
- Tần số lấy mẫu: từ 1,56 Hz đến 800 Hz.
- Có thể cấu hình tín hiệu ra 12 bít hoặc 8 bít.
- Giao tiếp I2C.
- Thiết lập 6 nguồn ngắt khác nhau cho 2 chân ngắt.
- Đo gia tốc theo ba phương X, Y, Z.

Hình 2. Quy định phương đo của cảm biến gia tốc MMA8452Q.
2
LÊ DUY MINH – 090 4011 740

II. GIAO TIẾP I2C GIỮA VI ĐIỀU KHIỂN STM32F103 VÀ CẢM BIẾN GIA
TỐC MMA8452Q
1. Giao tiếp I2C của cảm biến gia tốc MMA8452Q
Dữ liệu gia tốc có thể truy cập qua chuẩn truyền thông I 2C nhằm phù hợp với
việc kết nối cảm biến với vi điều khiển. Cảm biến gia tốc MMA8452Q có thể sinh ra
một ngắt đặc trưng mỗi khi một tập hợp tín hiệu gia tốc được cập nhật nhằm đồng bộ
hóa việc lấy dữ liệu.
Các thanh ghi trong cảm biến MMA8452Q cũng được truy cập qua giao tiếp
I C. Để kích hoạt truyền thông I2C, chân VDDIO phải ở mức điện áp cao. Trường hợp
2

chân VDD ở mức điện áp thấp nhưng chân VDDIO ở mức điện áp cao MMA8452Q
sẽ ở chế độ tắt và giao tiếp I2C bị bỏ qua, vi điều khiển có thể giao tiếp với thiết bị
khác qua đường truyền thông I2C này .

Chân Mô tả
SCL Xung đồng hồ giao tiếp I2C

SDA Truyền dữ liệu I2C

SA0 Bit địa chỉ

Bảng 1. Các chân dùng trong truyền thông I2C của cảm biến MMA8452Q

Hai chân tín hiệu liên quan đến truyền thông I 2C, đường tín hiệu xung tuần tự
SCL và đường dữ liệu tuần tự SDA. SDA là đường truyền hai chiều dùng cho việc
truyền và nhận tín hiệu. Yêu cầu vật lý của các đường tín hiệu này là có điện trở kéo
lên nối với VDDIO.
1.1 Hoạt động I2C
Việc thực thi truyền thông trên đường truyền bắt đầu bằng tín hiệu START.
Điều kiện START được định nghĩa bằng việc chuyển mức tín hiệu từ cao xuống thấp
trên đường SDA trong khi đường SCL được giữ ở mức cao. Sau khi tín hiệu START
được truyền bởi vi điều khiển chủ, đường truyền ở trạng thái bận. Byte kế tiếp được
truyền sau lệnh START sẽ bao gồm địa chỉ của cảm biến MMA8452Q trong 7 bít đầu
tiên và bít thứ 8 xác định vi điều khiển sẽ truyền hay nhận dữ liệu từ cảm biến
MMA8452Q. Khi một địa chỉ được truyền đi, mỗi thiết bị trong hệ thống sẽ so sánh
3
LÊ DUY MINH – 090 4011 740

địa chỉ trên đường truyền với địa chỉ của mình. Nếu địa chỉ phù hợp, thiết bị sẽ xác
nhận lại với vi điều khiển chủ. Xung nhịp thứ 9 sẽ là tín hiệu ACK (acknowledge).
Thiết bị truyền sẽ bỏ đường SDA trong suốt chu kỳ ACK, thiết bị nhận sẽ kéo đường
SDA xuống mức thấp trong chu kỳ này.
Sự chuyển mức tín hiệu từ thấp lên cao trên đường SDA trong khi đường SCL
ở mức cao xác định điều kiện STOP. Sự truyền nhận tín hiệu kết thúc bằng STOP.
Một thiết bị chủ có thể lặp lại tín hiệu START trong khi truyền.
Địa chỉ của cảm biến gia tốc MMA8452Q được lựa chọn là 0011100 hoặc
0011101 bằng cách thiết lập chân SA0 ở mức cao hay thấp.
1.1.1 Đọc một byte
Cảm biến gia tốc MMA8452Q có một bộ chuyển đổi ADC có thể lấy mẫu,
chuyển đổi và trả về dữ liệu khi được yêu cầu. Sự truyền 8 bít lệnh được bắt đầu bằng
sườn xuống của xung SCL. Lưu ý rằng dữ liệu truyền về theo trình tự MSB đầu tiên.

Hình 3. Biểu đồ đọc 1 byte từ cảm biến gia tốc MMA8452Q.

Hình trên trình bày biểu đồ thời gian cho việc đọc 1 byte từ cảm biến. Vi điều
khiển truyền tín hiệu START (ST) đến cảm biến MMA8452Q, địa chỉ cảm biến
MMA8452Q (0x1D) với bít R/W ở giá trị “0” (ghi) và cảm biến gửi lại tín hiệu AK.
Sau đó vi điều khiển sẽ truyền địa chỉ thanh ghi cần đọc, cảm biến MMA8452Q sẽ gửi
tiếp tín hiệu AK. Vi điều khiển sẽ lặp lại tín hiệu START (SR) và địa chỉ của cảm
biến gia tốc (1x0D) với bít R/W mang giá trị “1” để đọc giá trị từ thanh ghi đã được
thiết lập trước đó. Cảm biến gia tốc MMA8452Q sẽ gửi tín hiệu AK và truyền dữ liệu
từ thanh ghi xác định lên đường truyền.

4
LÊ DUY MINH – 090 4011 740

1.1.2 Ghi một byte


Để bắt đầu lệnh ghi, Vi điều khiển gửi tín hiệu START (ST) đến cảm biến
MMA8452Q, tiếp đó là địa chỉ (0x1D) với bít R/W = 0. Cảm biến MMA8452Q sẽ gửi
lại tín hiệu AK. Sau đó vi điều khiển sẽ gửi đến cảm biến MMA8452Q địa chỉ của
thanh ghi cần ghi. Cảm biến MMA8452Q sẽ gửi lại tín hiệu AK, vi điều khiển sẽ tiếp
tục gửi xuống 8 bít dữ liệu cần ghi lên thanh ghi đã được chọn trước đó.

Hình 4. Sơ đồ ghi 1 byte tín hiệu từ vi điều khiển chủ lên cảm biến MMA8452Q.

5
LÊ DUY MINH – 090 4011 740

1.2 Lưu đồ thuật toán giao tiếp giữa vi điều khiển STM32F103 và cảm biến gia
tốc MMA8452Q

Hình 5. Lưu đồ thuật toán giao tiếp giữa vi điều khiển và cảm biến.

6
LÊ DUY MINH – 090 4011 740

1.3 Lập trình giao tiếp giữa cảm biến MMA8452Q và vi điều khiển STM32F103
1.3.1 Đọc một byte từ cảm biến gia tốc MMA8452Q
Chương trình con đọc một byte từ cảm biến gia tốc MMA8452Q viết bằng
ANSI C với trình biên dịch MirkoC. Chương trình trả về một byte dữ liệu từ cảm biến
gia tốc MMA8452Q với regIndex là địa chỉ thanh ghi cần đọc của MMA8452Q.
unsigned char read_mma(unsigned char regIndex)
{
unsigned char regValue;
Soft_I2C_Start();
Soft_I2C_Write(ACC_ADDRESS_W);
Soft_I2C_Write(regIndex);
Soft_I2C_Start();
Soft_I2C_Write(ACC_ADDRESS_R);
regValue = Soft_I2C_Read(0);
Soft_I2C_Stop();
return regValue;
}

1.3.2 Ghi một byte lên cảm biến gia tốc MMA8452Q
Chương trình con ghi một byte xuống cảm biến gia tốc MMA8452 viết bằng
ANSI C với trình biên dịch MirkoC. Tham số regIndex là địa chỉ thanh ghi cần đọc
của MMA8452Q và regData là giá trị dữ liệu cần ghi.
void write_mma(unsigned char regIndex,unsigned char regData)
{
Soft_I2C_Start();
Soft_I2C_Write(ACC_ADDRESS_W);
Soft_I2C_Write(regIndex);
Soft_I2C_Write(regData);
Soft_I2C_Stop();
}
1.3.3 Thiết lập chế độ hoạt động của cảm biến MMA8452Q
Cảm biến MMA8452Q có các chế độ Standby và Active. Các thiết lập chỉ có
thể tiến hành ở chế độ Standby ngoại trừ việc lấy mẫu tín hiệu. Người dùng cũng có

7
LÊ DUY MINH – 090 4011 740

thể thiết lập dải tín hiệu đo cho cảm biến (2g, 4g và 8g). Dải tín hiệu đo chỉ có thể
thiết lập ở chế độ Standby bằng cách thay đổi bít FS0 và FS1 của thanh ghi 0x0E.
Chuyển chế độ từ Standby sang Active bằng cách ghi giá trị 0 vào bít 0 của thanh ghi
0x2A.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

ASLP_RATE1 ASLP_RATE0 DR2 DR1 DR0 LNOISE FREAD ACTIVE

Bảng 2. Thanh ghi 0x2A

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

- 00 0 HPF_Out 0 0 FS1 FS2

Bảng 3. Thanh ghi XYZ_DATA_CFG (địa chỉ 0x0E).

FS1 FS0 Dải đo

0 0 ±2g

0 1 ±4g

1 0 ±8g

1 1 --

Bảng 4. Thiết lập dải đo với các giá trị FS0 và 1.

Chương trình con thiết lập chế độ Standby, Active và dải đo cho cảm biến
MMA8452Q
void MMA845x_Standby (void)
{
unsigned char n;
n = read_mma(CTRL_REG1);
write_mma(CTRL_REG1, n & ~ACTIVE_MASK);
}
void MMA845x_Active ()

8
LÊ DUY MINH – 090 4011 740

{
write_mma(CTRL_REG1, (read_mma(CTRL_REG1) | ACTIVE_MASK));
}
void MMA845x_SetRange(unsigned char fsRange)
{
unsigned char rgTemp;
MMA845x_Standby();
rgTemp = read_mma(XYZ_DATA_CFG_REG);
rgTemp &= FS_MASK;
rgTemp |= fsRange;
write_mma(XYZ_DATA_CFG_REG, rgTemp);
MMA845x_Active();
}
1.3.4 Thiết lập tần số lấy mẫu
Tần số lấy mẫu (ODR – Output Data Rate) ở chế độ Active và Sleep Mode
Data Rate được lập trình thông qua các bít DR của thanh ghi CTRL_REG1.

DR2 DR1 DR0 Tần số lấy mâu Chu kỳ lấy mẫu


0 0 0 800 Hz 1,25 ms
0 0 1 400 Hz 2,5ms
0 1 0 200 Hz 5 ms
0 1 1 100 Hz 10 ms
1 0 0 50 Hz 20 ms
1 0 1 12,5 Hz 80 ms
1 1 0 6,25 Hz 160 ms
1 1 1 1,563 Hz 640 ms

Bảng 5. Thiết lập tần số lấy mẫu với các giá trị DR.

9
LÊ DUY MINH – 090 4011 740

Chương trình con thiết lập tần số lấy mẫu

void MMA845x_SampleRate(unsigned char SampleRate)


{
unsigned char srTemp;
MMA845x_Standby();
srTemp = read_mma(CTRL_REG1);
srTemp &= OUTPUT_DATA_RATE_MASK;
srTemp |= SampleRate;
write_mma(CTRL_REG1, srTemp);
MMA845x_Active();

1.4 Dòng dữ liệu 12 bít và chuyển đổi dữ liệu


Tín hiệu dao động của cảm biến MMA8452Q là dữ liệu 12 bít. Dữ liệu này có
định dạng khác với dữ liệu của vi điều khiển do đó cần phải lập trình để chuyển đổi
kiểu dữ liệu này sang dạng dữ liệu phù hợp với vi điều khiển.
Cờ sự kiện có thể được theo dõi bằng việc đọc thanh ghi trạng thái (0x00).

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

ZYXOW ZOW YOW XOW ZYXDR ZDR YDR XDR

Bảng 6. Thanh ghi trạng thái (chỉ đọc).

Cờ ZYXDR được đặt bằng 1 khi có dữ liệu gia tốc của bất kỳ trục nào. Khi dữ
liệu được đọc, cờ được xóa về 0.

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

XD11 XD10 XD9 XD8 XD7 XD6 XD5 XD4

Bảng 7. Thanh ghi dữ liệu X_MSB (0x00).

10
LÊ DUY MINH – 090 4011 740

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

XD3 XD2 XD1 XD0 0 0 0 0

Bảng 8. Thanh ghi dữ liệu X_LSB (0x01).

1.4.1 Chuyển đổi dữ liệu đo 12 bít sang số nguyên có dấu


Dấu của dữ liệu có thể dễ dàng xác nhận bằng cách so sánh byte MSB với giá
trị 0x7F. Nếu lớn hơn có nghĩa đây là một giá trị âm

char MMA845x_GetXYZData()
{
status = MMA845x_Read(STATUS_REG);
if((status & 0x0F) == 0x0F)
{
XYZbyte[0] = MMA845x_Read(OUT_X_MSB);
XYZbyte[1] = MMA845x_Read(OUT_X_LSB);
XYZbyte[2] = MMA845x_Read(OUT_Y_MSB);
XYZbyte[3] = MMA845x_Read(OUT_Y_LSB);
XYZbyte[4] = MMA845x_Read(OUT_Z_MSB);
XYZbyte[5] = MMA845x_Read(OUT_Z_LSB);

for(i=0;i<3;i++)
{
XYZAcc[i] = 0x00;
index = 2*i;
XYZAcc[i] = XYZbyte[index];
XYZAcc[i] = XYZAcc[i]<<8;
XYZAcc[i] += XYZbyte[index + 1];
XYZAcc[i] = XYZAcc[i]>>4;
if(XYZbyte[index] > 0x7F)
{
XYZAcc[i] = ~XYZAcc[i] + 1;
}
}
return 0;
}
else
{
return 1;
}

11
LÊ DUY MINH – 090 4011 740

1.5 Định nghĩa các thanh ghi của cảm biến gia tốc MMA8452Q
Việc giao tiếp giữa vi điều khiển STM32F103 và cảm biến gia tốc
MMA8452Q hoàn toàn thông qua việc đọc ghi các giá trị thanh ghi được định nghĩa
trong tài liệu kỹ thuật của cảm biến. Nhằm dễ dàng trong việc lập trình, tên và giá trị
của các thanh ghi được định nghĩa như sau:

#define STATUS_REG 0x00


#define OUT_X_MSB 0x01
#define OUT_X_LSB 0x02
#define OUT_Y_MSB 0x03
#define OUT_Y_LSB 0x04
#define OUT_Z_MSB 0x05
#define OUT_Z_LSB 0x06
#define ACC_ADD 0x1D
#define ACC_ADDRESS_W 0x3A
#define ACC_ADDRESS_R 0x3B
#define CTRL_REG1 0x2A
#define ASLP_MASK 0x3F
#define ASLP_RATE_50Hz 0x00
#define ASLP_RATE_12p5Hz 0x40
#define ASLP_RATE_6p25Hz 0x80
#define ASLP_RATE_1p56Hz 0xC0
#define OUTPUT_DATA_RATE_MASK 0xC7
#define OUTPUT_DATA_RATE_800Hz 0x00
#define OUTPUT_DATA_RATE_400Hz 0x08
#define OUTPUT_DATA_RATE_200Hz 0x10
#define OUTPUT_DATA_RATE_100Hz 0x18
#define OUTPUT_DATA_RATE_50Hz 0x20
#define OUTPUT_DATA_RATE_12p5Hz 0x28
#define OUTPUT_DATA_RATE_6p25Hz 0x30
#define OUTPUT_DATA_RATE_1p56Hz 0x38
#define LNOISE 0x04
#define F_READ 0x02
#define ACTIVE 0x01
#define CTRL_REG2 0x2B
#define ST 0x80
#define RST 0x40
#define SMOD_NOMAL 0x00
#define SMOD_LOW_NOISE_LOW_POWER 0x08
#define CTRL_REG3 0x2C
#define WAKE_TRANS 0x40
#define WAKE_LNDPRT 0x20
#define WAKE_PULSE 0x10
#define WAKE_FF_MT 0x08
12
LÊ DUY MINH – 090 4011 740

#define IPOL 0x02


#define PP_OD 0x01
#define CTRL_REG4 0x2D
#define INT_EN_ASLP 0x80
#define INT_EN_TRANS 0x20
#define INT_EN_LNDPRT 0x10
#define INT_EN_PULSE 0x08
#define INT_EN_FF_MT 0x04
#define INT_EN_DRDY 0x01
#define CTRL_REG5 0x2E
#define INT_CFG_ASLP 0x80
#define INT_CFG_TRANS 0x20
#define INT_CFG_LNDPRT 0x10
#define INT_CFG_PULSE 0x08
#define INT_CFG_FF_MT 0x04
#define INT_CFG_DRDY 0x01
#define ACTIVE_MASK 0x01
#define XYZ_DATA_CFG_REG 0x0E
#define FS_MASK 0xFC
#define FS_2G 0x00
#define FS_4G 0x01
#define FS_8G 0x02
#define HPF_OUT_BIT 0x10
#define WHO_AM_I 0x0D
#define I_AM_MMA 0x2A
#define MODS_MASK 0x01
#define HP_FILTER_CUTOFF 0x0F
#define Pulse_HPF_BYP 0x20
#define Pulse_LPF_EN 0x10
#define OFF_X_REG 0x2F
#define OFF_Y_REG 0x30
#define OFF_Z_REG 0x31

13
LÊ DUY MINH – 090 4011 740

Mô đun cảm biến gia tốc MMA8452Q

Hình 6. Mô đun cảm biến gia tốc MMA 8452Q

Hình 7. Sơ đồ mạch nguyên lý mô đun cảm biến gia tốc MMA8452Q.

Cảm biến gia tốc MMA8452Q có kích thước rất nhỏ (3mm x 3mm x1mm). Để
dễ dàng cho việc kết nối giữa cảm biến và mô đun vi điều khiển STM32F103 và gắn
cảm biến lên đối tượng đo nhóm thực hiện đề tài thiết kế mô đun gắn cảm biến như
hình trên, trong đó:
- 3.3V: chân cấp nguồn 3,3 VDC cho cảm biến. Nguồn này được lấy từ mô đun
vi điều khiển.
- SDA: chân tín hiệu trong truyền thông I2C. Chân này được nối với chân SDA
của vi điều khiển STM32F103 (chân PB7).
- SCL: chân xung nhịp đồng hồ trong truyền thông I 2C. Chân này được nối với
chân SCL của vi điều khiển STM32F103 (chân PB6). Cả hai chân SCL và
SDA đều được nối với nguồn 3,3 VDC bằng điện trở 10K.
14
LÊ DUY MINH – 090 4011 740

- INT1, INT2 các chân ngắt của cảm biến gia tốc MMA8452Q.
- SA0: chân chọn địa chỉ của cảm biến. Chân này được nối với nguồn 3,3 VDC
thông qua điện trở 10K thiết lập địa chỉ 0x1D cho cảm biến. Nếu nối chân này
xuống đất cảm biến sẽ được đặt địa chỉ 0x1C. Trường hợp sử dụng 02 cảm biến
trên một đường truyền I2C ta cần nối chân này của 1 trong 2 cảm biến xuống
đất để tránh trường hợp 2 cảm biến có cùng một địa chỉ gây nhiễu loạn đường
truyền.
- GND: chân đất của nguồn.

15
LÊ DUY MINH – 090 4011 740

16

You might also like