لینک دانلود دیتاشیت رجیسترهای mpu-6050
.
%Accelerometer Data Acquisition with MPU6050 and Arduino
function[] = MPU6050_i2c_Acc()
a = arduino();
pause(0.1);
finishup = onCleanup(@() exitprogram(a));
acc = i2cdev(a,'0x68'); % Create MPU6050 object
pause(0.1);
Power_ctrl = '6B'; % Power Management register
Data_Format ='1C';
XData0 = '3B'; % Accelerometer measurements
XData1 = '3C';
YData0 = '3D';
YData1 = '3E';
ZData0 = '3F';
ZData1 = '40';
% For Reading Device ID
ID = readRegister(acc,117); % Device ID register is 117 (0x75)
disp(ID);
pause(0.1);
writeRegister(acc,hex2dec(Power_ctrl),0); % For begin Measurement mode
pause(0.1);
while 1
X = read_data(acc,hex2dec(XData0));
XAcc = X/16384; % Scale factor for ±2g
Y = read_data(acc,hex2dec(YData0));
YAcc = Y/16384; % Scale factor for ±2g
Z = read_data(acc,hex2dec(ZData0));
ZAcc = Z/16384; % Scale factor for ±2g
disp(['X=',num2str(XAcc),' Y=',num2str(YAcc),' Z=',num2str(ZAcc)]);
pause(0.1);
end
end
function value = read_data(device,address)
write(device,address);
output = read(device, 2,'int16');
value = output(1,1);
end
function exitprogram(BoardName)
clc
clear;
close all
disp('program has exit');
end
.
*نکته:
سنسور MPU6050 داده ها را در مقادیر 16 بیتی ذخیره می کند، به این معنی که داده ها در دو رجیستر 8 بیتی روی دستگاه پخش می شوند. برای مثال دو رجیستری که مشاهده می کنید، XData0 و XData1، به ترتیب بایت پر ارزش و بایت کم ارزش 16 بیتی را نشان می دهند.
برای همین یک تابع به نام read_data برای خواندن یک مقدار 16 بیتی تنظیم شده است (2 بایت را می خواند و آنها را به عنوان int16 تفسیر می کند). بنابراین وقتی ;X = read_data(acc,hex2dec(XData0)) را فرا میخوانید، باید از XData0 و XData1 خوانده شود و نتایج را در یک مقدار 16 بیتی ترکیب کند.
.
.
%Gyroscope Data Acquisition with MPU6050 and Arduino
function[] = MPU6050_i2c_Gyro()
a = arduino();
pause(0.1);
finishup = onCleanup(@() exitprogram(a));
acc = i2cdev(a,'0x68'); % Create MPU6050 object
pause(0.1);
Power_ctrl = '6B'; % Power Management register
XGyroData0 = '43'; % Gyroscope measurements
XGyroData1 = '44';
YGyroData0 = '45';
YGyroData1 = '46';
ZGyroData0 = '47';
ZGyroData1 = '48';
% For Reading Device ID
ID = readRegister(acc,117); % Device ID register is 117 (0x75)
disp(ID);
pause(0.1);
writeRegister(acc,hex2dec(Power_ctrl),0); % For begin Measurement mode
pause(0.1);
while 1
XGyro = read_data(acc,hex2dec(XGyroData0))/131; % Scale factor for ±250°/s
YGyro = read_data(acc,hex2dec(YGyroData0))/131; % Scale factor for ±250°/s
ZGyro = read_data(acc,hex2dec(ZGyroData0))/131; % Scale factor for ±250°/s
disp(['XGyro=',num2str(XGyro),' YGyro=',num2str(YGyro),' ZGyro=',num2str(ZGyro)]);
pause(0.1);
end
end
function value = read_data(device,address)
write(device,address);
output = read(device, 2,'int16');
value = output(1,1);
end
function exitprogram(BoardName)
clc
clear;
close all
disp('program has exit');
end
.
.
.
%Temperature Measurement with MPU6050 and Arduino
function[] = MPU6050_i2c_Temp()
a = arduino();
pause(0.1);
finishup = onCleanup(@() exitprogram(a));
acc = i2cdev(a,'0x68'); % Create MPU6050 object
pause(0.1);
Power_ctrl = '6B'; % Power Management register
TempData0 = '41'; % Temperature measurements
TempData1 = '42';
% For Reading Device ID
ID = readRegister(acc,117); % Device ID register is 117 (0x75)
disp(ID);
pause(0.1);
writeRegister(acc,hex2dec(Power_ctrl),0); % For begin Measurement mode
pause(0.1);
while 1
Temp = read_data(acc,hex2dec(TempData0))/340 + 36.53; % Scale factor for temperature
disp(['Temp=',num2str(Temp)]);
pause(0.1);
end
end
function value = read_data(device,address)
write(device,address);
output = read(device, 2,'int16');
value = output(1,1);
end
function exitprogram(BoardName)
clc
clear;
close all
disp('program has exit');
end
.
دیدگاهها
هیچ نظری هنوز ثبت نشده است.