Professional Documents
Culture Documents
Baocao Do An I Nguyen Hoai Nam 20202
Baocao Do An I Nguyen Hoai Nam 20202
VIỆN ĐIỆN
Đồ án I
ĐỀ TÀI:
Hà Nội, 08/2022
LỜI NÓI ĐẦU
Qua quá trình thực hiện đồ án I, em cũng đã tìm hiểu và học tập được nhiều điều .
Mặc dù đồ án được thực hiện trong thời gian khá dài, tuy nhiên do còn khá thiếu kinh
nghiệm trong việc tìm kiếm thông tin nên mong có gì sai sót mong thầy bỏ qua ạ. Em
đã cố gắng thực hiện đồ án môn học, và cũng đã tiếp thu những kiến thức, kỹ năng mới
trong kì học này.
Em xin chân thành cảm ơn.
KẾT LUẬN..............................................................................................................................14
PHỤ LỤC.................................................................................................................................16
DANH MỤC HÌNH VẼ
i
CHƯƠNG 1. ENCODER – CẢM BIẾN ĐO VỊ TRÍ GÓC, TỐC
ĐỘ ĐỘNG CƠ
Đĩa quang tròn có rảnh nhỏ quay quanh trục: Trên đĩa được đục lỗ (rãnh), khi
đĩa này quay và chiếu đèn led lên trên mặt đĩa thì sẽ có sự ngắt quãng xảy ra.
Các rãnh trên đĩa chia vòng tròn 360o thành các góc bằng nhau. Và một đĩa có
thể có nhiều dãy rãnh tính từ tâm tròn.
Tương ứng đĩa 2bit, cho ngõ ra dạng xung vuông pha AB, hoặc ABZ hoặc ABZA|
B|Z| (đọc là A đảo, B đảo, Z đảo). Loại Encoder có 2 tín hiệu xung A và B là phổ biến
nhất. Tín hiệu khe Z là tín hiệu để xác định động cơ quay được một vòng.
1
Hình 1.2 Encoder tương đối
Từ số xung, Encoder có số dây tương ứng: 6 hoặc 4 dây tùy loại. Các dây bao gồm :
2 dây nguồn, 2 dây pha A và B, 1 dây pha Z...
Tương ứng đĩa quay 8bit hay 8 dãy rãnh, cho ngõ ra dạng mã kỹ thuật số(BCD),
Binary (nhị phân), Gray code…
Ví dụ: Encoder có ngõ ra dạng bit, độ phân giải 2500. Thì 1 vòng quay của encoder
sẽ cho ra 2500 dãy nhị phân 8bit:
Absolute encoder (Tuyệt đối) có thể ghi nhớ vị trí khi bị mất nguồn do mỗi vị trí có
một mã tín hiệu riêng.
2
1.3 Thông số encoder cần quan tâm
Đường kính trục, dạng trục: Encoder có dạng trục dương hoặc âm. đường kính
trục từ 5~50mm. Thường đường kính lớn hơn 6mm sẽ là loại trục âm (trục lõm).
Độ phân giải: hay còn gọi là số xung - tương ứng số tín hiệu encoder đếm được
khi quay 1 vòng. Encoder có số xung càng cao thì giá càng cao. Thang máy thường
dùng xung 1024p/r, chế tạo máy vào khoảng 360p/r, 1000p/r. Ngoài ra còn có các
xung lên đến 6000p/r hoặc 6pr.
Điện áp: Encoder thường xuyên bị cháy do khi lắp đặt không chú ý nguồn cấp.
Nếu encoder có dãy điện áp:5~24V thì rất dễ. Tuy nhiên với một số encoder trục
lớn: 30-40mm, encoder theo máy sẽ thường gặp điện áp xác định: 5V, 12V hoặc
15V.
Ngõ ra: AB, ABZ, AB đảo, ABZ đảo.
Dạng ngõ ra: Có nhiều dạng ngõ ra, liệt kê sơ sơ gồm: Open Collector, Voltage
Output, Complemental, Totem Pole, Line Driver. Dạng ngõ ra quy định nguồn cấp,
đầu đọc thông tin ...
Dây cáp: cáp càng dài càng dễ bị nhiễu. Dây tiêu chuẩn từ 1-3m. Đôi khi lên đến
10m theo nhu cầu sử dụng.
Phụ kiện: đi kèm encoder trục dương là Coubling, encoder trục âm là
Pass. Coubling giúp nối encoder trục dương với motor trục dương, Pass giúp gắn
encoder vào máy. Một encoder trục âm có 1-2 pass tùy loại.
3
3. Tín hiệu sườn lên của xung
Sử dụng 2 ngắt ngoài: Theo dõi sự thay đổi đồng thời cả 2 kênh A và B.
Sử dụng 1 ngắt ngoài: Chọn 1 kênh làm tín hiệu ngắt, sau đó đọc tín hiệu
kênh còn lại.
+ Tốc độ:
+ Hỗ trợ 2 kênh A, B.
4
Mạch cầu H L298:
+ 12V Power, Power GND: Nối với nguồn 12V cấp cho động cơ.
+ IN1, IN2: Nhận tín hiệu điều khiển PWM đối xứng cho cầu thứ nhất.
+ IN3, IN4: Nhận tín hiệu điều khiển PWM đối xứng cho cầu thứ 2.
+ OutputA (Out1, Out2), OutputB (Out3, Out4): Nối với động cơ cần điều khiển.
5
1.5.2 Sơ đồ đấu dây
Nhận thấy rằng sơ đồ mạch cầu H rất thích hợp để điểu khiển hai động cơ cùng lúc,
ta có thể sử dụng xung vuông để điều chỉnh tốc độ động cơ, và còn có thể đảo chiều
động cơ bằng cách thay đổi các giá trị logic của vi điều khiển. Động cơ sử dụng điện
áp 12 VDC làm nguồn cấp.
6
1.5.3 Kết quả thực nghiệm
Hình 1.8 là kết quả sau khi chạy thử động cơ tích hợp encoder 334 sử dụng vi điều
khiển arduino.
Vận tốc tên tính theo vị trí của bánh xe theo công thức:
Công thức tính vận tốc tức thời thích hợp trong việc đo sự thay đổi vị trí bánh xe
nhanh, quãng đường di chuyển ngắn.
7
CHƯƠNG 2. MPU6050 – CẢM BIẾN GIA TỐC VÀ BỘ LỌC
KALMAN
Ngoài ra, MPU-6050 còn có 1 đơn vị tăng tốc phần cứng chuyên xử lý tín hiệu
(Digital Motion Processor - DSP) do cảm biến thu thập và thực hiện các tính toán cần
thiết. Điều này giúp giảm bớt đáng kể phần xử lý tính toán của vi điều khiển, cải thiện
tốc độ xử lý và cho ra phản hồi nhanh hơn. Đây chính là 1 điểm khác biệt đáng kể của
MPU-6050 so với các cảm biến gia tốc và gyro khác.
MPU-6050 có thể kết hợp với cảm biến từ trường (bên ngoài) để tạo thành bộ cảm
biến 9 góc đầy đủ thông qua giao tiếp I2C.
Các cảm biến bên trong MPU-6050 sử dụng bộ chuyển đổi tương tự - số (Anolog
to Digital Converter - ADC) 16-bit cho ra kết quả chi tiết về góc quay, tọa độ... Với
16-bit bạn sẽ có 2^16 = 65536 giá trị cho 1 cảm biến.
Tùy thuộc vào yêu cầu của bạn, cảm biến MPU-6050 có thể hoạt động ở chế độ tốc
độ xử lý cao hoặc chế độ đo góc quay chính xác (chậm hơn). MPU-6050 có khả năng
đo ở phạm vi:
Hơn nữa, MPU-6050 có sẵn bộ đệm dữ liệu 1024 byte cho phép vi điều khiển phát
lệnh cho cảm biến, và nhận về dữ liệu sau khi MPU-6050 tính toán xong.
8
Hình 2.1 MPU6050
Vậy bộ lọc Kalman, một cách khái quát là một tập hợp các phương trình toán học
mô tả một phương pháp tính toán truy hồi hiệu quả cho phép ước đoán trạng thái một
quá trình sao cho trung bình phương sai của độ lệch ( giữa giá trị thực và giá trị ước
đoán) là nhỏ nhất. Bộ lọc Kalman rất hiệu quả trong việc ước đoán các trạng thái trong
quá khứ, hiện tại và tương lai thậm chí ngay cả khi chính xác của hệ thống mô phỏng
không được khẳng định.
Để mô hình hóa hoạt động của mạch lọc Kalman, chúng ta có tín hiệu đo được, có
mô hình của tín hiệu đo được ( đòi hỏi tuyến tính) và sau đó là áp dụng vào trong hệ
thống phương trình của mạch lọc để ước lượng trạng thái quan tâm. Để có thể ứng
dụng một cách hiệu quả mạch lọc Kalman thì chúng ta phải mô hình hóa được một
cách tuyến tính sự thay đổi của trạng thái cần ước lượng (estimate) hoặc ước
đoán(predict).
9
Hình 2.2 Mô hình Kalman
Mô hình đối tượng tuyến tính rời rạc được biểu diễn thông qua hệ phương trình
trạng thái sau:
Trong đó :
Giả sử các nhiễu quá trình w(t) và nhiễu đo lường v(t) là nhiễu trắng , có phương
sai tương ứng là Q và R.
p(w) ~ N (0, Q)
p(v) ~ N (0, R)
Với hệ thống như vậy bộ lọc Kalman tuyến tính cho phép ta ước lượng một cách
tốt nhất biến trạng thái xk, kí hiệu là 𝑥̂ k , sao cho hiệp phương sai của chúng Pk đạt giá
trị nhỏ nhất.
Pk = E[ekekT]
Ek = xk - 𝑥̂ k
10
Thuật toán Kalman cho hệ rời rạc như sau:
Như vậy ta có thể thấy thuật toán gồm hai bước : bước ước lượng dự đoán ( time
update) và bước làm chính xác đự doán này ( mcasurement update ) dựa trên thông tin
đầu vào và đo được zk.
11
Với giá trị thu đươc z ∈ R
zk = Hxk + vk
= xk + vk
Với :
𝑥̂ k- = 𝑥̂ k-1
Pk- = Pk-1 + Q
Ta có Kk tỉ lệ nghịch với R, R lớn thì tốc độ ước lượng chậm, giá trị ước lượng có
vẻ ít tin tưởng hơn giá trị đo được và ngược lại. Do đó việc chọn R khá quan trọng ảnh
hưởng đến tốc độ ước lượng của hệ thống.
Chọn thông số ước lượng ban đầu : x(0) = 0, P 0- = 5. Giá trị x(0) không quan trọng
vì nó sẽ thích nghi tưng bước để đạt đến giá trị cần xác định còn P0- khác 0 là được.
12
2.4 Kết quả thực nghiệm:
Ứng dụng của bộ lọc Kalman trong việc lấy góc từ cảm biến MPU6050:
Kết quả trên là thông số lấy từ Gyroscopes X (vận tốc góc), đồ thị lọc tương đối tốt
khi ở cảm biến ở vị trí cố định hình 2.5 và khi thay đổi vị trị hình 2.6.
13
KẾT LUẬN
Trong quá trình thực hiện đồ án I, em cũng đã thấy được nhiều kiến thức mới mẻ,
chuyên sâu hơn so với việc chỉ học mỗi lý thuyết trên lớp. Những công việc này giúp
em ngày càng tiếp thu và phát triển hơn. Việc tìm hiểu lý thuyết xong từng bước mô
phỏng, thực hành, và cả việc lựa chọn thiết bị cần thiết để kiểm tra kết quả thực
nghiệm của mô hình, tuy phần nào vẫn còn sai sót, nhưng vẫn có thể phát triển và hoàn
thiện thêm. Cuối cùng em cũng xin cảm ơn thầy vì đã hướng dẫn em trong môn đồ án
này.
14
TÀI LIỆU THAM KHẢO
[1] Y. Kim and H. Bang, Introduction to Kalman Filter and Its Applications.
[3] Ming Y., Shuang W. and Jian-Zhong S. (2016). Simultaneous balancing and
trajectory tracking control for two-wheeled in- 310 verted pendulum vehicles: A
composite control approach. Neurocomputing 191, pp.44-5
[4] Kim H. W. and Jung S. (2016). Control of a two-wheel robotic vehicle for
personal transportation. Robotica, 34 (5), pp. 1186-1208.
[5] Z. Li, C. Yang, and L. Fan, Advanced Control of Wheeled Inverted Pendulum
Systems, Springer, Berlin, Germany, 2013.
[7] https://forum.machinelearningcoban.com/t/kalman-filter-va-bai-toan-chuoi-thoi-
gian/3625
15
PHỤ LỤC
/*
*/
int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
Wire.begin();
Wire.beginTransmission(MPU);
16
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
void loop(){
Wire.beginTransmission(MPU);
Wire.endTransmission(false);
(ACCEL_XOUT_L)
(ACCEL_YOUT_L)
(ACCEL_ZOUT_L)
delay(333);
//Step 1
17
rate=newRate-bias;
angle+=dt*rate;
//Step 2
P[0][0]+=dt*(dt*P[1][1]-P[1][0]-P[0][1]+Q_angle);
P[0][1]-=dt*P[1][1];
P[1][0]-=dt*P[1][1];
P[1][1]+=Q_bias*dt;
// step 3
y = newAngle-angle;
// Step 4
S= P[0][0]+R_measure;
// Step 5
K[0]=P[0][0]/S;
K[1]=P[1][0]/S;
// Step 6
angle += K[0]*y;
bias+= K[1]*y;
// Step 7
P[0][0]-= K[0]*P00_temp;
P[0][1]-=K[0]*P01_temp;
P[1][0]-=K[1]*P00_temp;
P[1][1]-=K[1]*P01_temp;
return angle;
18
Chương trình đọc dữ liệu encoder:
#include <LiquidCrystal_I2C.h>
/* encoder 334
*/
int i=0;
int chanelB = 4;
int prepulse= 0;
float velocity;
float position1;
float Time;
float Ton;
float Toff;
int count = 0;
19
int rotation = 0; // rotation =1 quay thuan, = 0 dung, = -1 quay nghich;
void encoder1(){
pulse++;
if (pulse/334==0)
count++;
else{
if (pulse/334==0)
count--;
// Ts = 1/Hz;
Ton = D*1/Hz;
Toff = (1-D)*1/Hz;
forward (rotation);
delay(Ton*1000);
forward (0);
delay(Toff*1000);
void forward(int x)
{ pinMode(motorp,OUTPUT
);
20
pinMode(motorm,OUTPUT);
21
if (x == 1){
digitalWrite(10, HIGH);
}else if (x == -1){
digitalWrite(9, HIGH);
}else if (x == 0){
digitalWrite(10, LOW);
1000*mlTime){
position1=2*3.1415*pulse/334.0;
velocity = (pulse-prepulse)/344.0*60/mlTime;
Serial.print("Phi(rad): ");
Serial.println(position1);
Serial.println(velocity); Serial.print("\
n");
prepulse = pulse;
Time = millis();
22
{ if(millis() - Time >
1000*mlTime){
23
position1=2*3.1415*pulse/334.0;
velocity = (pulse-prepulse)/344.0*60/mlTime;
lcd.setCursor(12,0); lcd.print((int)position1);
// lcd.setCursor(3,0); lcd.print(count);
lcd.setCursor(11,1); lcd.print((int)velocity);
prepulse = pulse;
Time = millis();
void setup()
lcd.init();
lcd.backlight();
lcd.setCursor(0,0); lcd.print("Phi(rad):");
lcd.setCursor(0,1); lcd.print("V(rpm):");
rotation = -1;
Serial.begin(9600);
forward(rotation);
pinMode(chanelB, INPUT_PULLUP);
pinMode(chanelA, INPUT_PULLUP);
encoder1();
void loop()
24
{
Display(1);
speedRate (1,3);
25