Nội Dung Bài Viết
1.GIỚI THIỆU ENCODER
1.1. Giới thiệu và phân loại
Encoder là tên gọi chung để chỉ các thiết bị mã hóa. Trong thực tế có rất nhiều loại và hình thức encoder khác nhau. Thông thường, đối với các chuyển động quay, encoder dùng để quản lý vị trí góc của một điã quay, bánh xe, hay trục động cơ, hoặc bất kì thiết bị quay nào cần xác định góc của nó.
Encoder được chia làm 2 loại: absolute encoder và incremental encoder.
Absolute encoder là encoder tuyệt đối, nghĩa là tính hiệu ta nhận được chỉ rõ ràng vị trí của encoder, không cần phải xử lý thêm.
Incremetal encoder là encoder mã hóa gia tăng (encoder tương đối), thường chỉ có tối đa là 3 vòng lỗ. Nếu encoder có càng nhiều lỗ trên đĩa thì thông tin nhận được càng chính xác. Cứ mỗi lần đi qua một lỗ, phải lập trình để thiết bị đo đếm lên 1 đơn vị, do đó loại này có tên la incremetal encoder (encoder mã hóa gia tăng).
1.2. Nguyên lý hoạt động cơ bản của encoder
Nguyên lý cơ bản của encoder là một đĩa tròn xoay quay quanh trục, trên đĩa có các lỗ (hoặc rãnh). Dùng đèn led chiếu lên mặt đĩa. Khi quay, chỗ không có lỗ (rãnh) thì đèn không thể chiếu xuyên qua được, chỗ có lỗ (rãnh) thì đèn sẽ chiếu xuyên qua. Phía mặt bên kia của đĩa được đặt một cảm biến thu. Với các tín hiệu có hoặc không có ánh sáng chiếu qua, người ta ghi nhận được đèn led có chiếu qua lỗ hay không.
Giả sử trên đĩa có n lỗ, thì mỗi lần cảm biến thu nhận được n lần tín hiệu đèn led thì có nghĩa là đĩa đã quay được một vòng.
1.3. Độ phân giải của encoder
1.3.1. Absolute encoder
Độ phân giải của encoder là một thông số rất quan trọng. Làm thế nào để biết đĩa quay được 1/2, 1/4 hay 1/n vòng chứ không phải chỉ biết đĩa đã quay được một vòng.Với một số nhị phân có 2 bit, chúng ta sẽ có 4 trạng thái. Điều đó nghĩa là với một số nhị phân 2 bit, chúng ta có thể chia đĩa thành 4 phần bằng nhau, và khi quay chúng ta sẽ xác định được độ chính xác đến ¼ vòng. Tương tự, với một số nhị phân n bít, ta sẽ xác định được độ chính xác đến 1/2n vòng.
- Cách thức để xác định 2n trạng thái của đĩa encoder:
Hình 1 . Đĩa Encoder.
Ví dụ ở đĩa encoder có 2 vòng đĩa (hình trên). Ở vòng trong cùng có một rãnh rộng bằng 1/2 đĩa, vòng phía ngoài có 2 rãnh đối diện nhau. Cần 2 led phát để phát xuyên qua 2 vòng lỗ và 2 cảm biến thu quang.
Giả sử ở vòng lỗ thứ nhất (vòng trong), cảm biến thu đang nằm ở vị trí có lỗ hở thì tín hiệu nhận được từ mắt thu sẽ là 1. ở vòng lỗ thứ hai, cảm biến thu đang nằm ở vị trí có lỗ hở thì tín hiệu nhận được sẽ là 1. Kết hợp 2 bit ta được số nhị phân 11, chúng ta sẽ xác định được đĩa quay đang nằm ở góc phần tư phía trên bên phải.
Nếu đĩa quay có 10 vòng lỗ thì ta sẽ quản lí được vị trí chính xác đến 1/210 vòng (1/1024 vòng), hay còn gọi là dộ phân giải của encoder là 1024 xung trên vòng (pulse per revolution – ppr).
1.3.2. Incremetal encoder
Lợi thế của encoder tuyệt đối thể hiễn rõ rệt trong trường hợp góc quay nhỏ và động cơ không quay nhiều vòng. Khi đó việc xử lý encoder tuyệt đối trở nên dễ dàng cho người dùng. Chỉ cần đọc giá trị là chúng ta có thể biết ngay vị trí góc của trục quay. Tuy nhiên, nếu động cơ quay nhiều vòng thì điều này không có lợi, bỏi vì khi đó ta phải xử lý đếm số vòng quay của trục.
Ngoài ra khi thiết kế encoder tuyệt đối, nếu đòi hỏi độ chính xác càng cao thì cần càng nhiều vòng lỗ, dẫn đến sự giới hạn về kích thước của encoder, bởi vì việc gia công chính xác các lỗ quá nhỏ là không thê thực hiện. Ngoài ra việc bố trí dãy đèn led và cảm biến thu cũng chiếm một diện tích rất lớn trong trường hợp này.
Tuy nhiên, điều này đã được khắc phục bằng incremetal encoder một cách khá đơn giản. Vì vậy, incremetal được sử dụng nhiều trong những ứng dụng hiện đại.
Nguyên lý hoạt động của incremetal encoder: incremetal encoder sẽ tăng một đơn vị khi có một lần lên xuống của cạnh xung, nghĩa là khi led quét qua một lỗ thì encoder sẽ tăng một đơn vị trong biến đếm.
Để đếm được số vòng động cơ đã quay và hạn chế sai số xung tích lũy (trong trường hợp có rung động không thể kiểm soát có thể gây ra sai số xung đếm được ở encoder), một lỗ định vị được thêm vào để đếm số vòng quay của encoder (hình dưới)
Hình 2 . Vòng quay Encoder với lỗ định vị.
Người ta đặt hai đèn led lệch nhau ở vòng lỗ hoặc sử dụng 2 vòng lỗ và 2 cảm
Hình 3 .Xác định chiều quay bằng cách sử dụng 2 vòng lỗ và 2 bộ cảm biến thu – phát.
biến thu phát để xác định chiều quay của động cơ.
2. CHIP DRIVER LMD18200
2.1. LMD18200
Hình 4 . Sơ đồ chân LMD18200
2.2. Sơ đồ kết nối điều khiển động cơ Servo DC với LMD18200
Hình 5 . Sơ đồ kết nối điều khiển động cơ
3. Phần Visual Basic 6.0 điều khiển động cơ servo
3.1. Giao diện VB
– Giới thiệu
– Giao diện chính
3.2. Code VB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 | Dim t As String Private Sub CmdBack_Click() Form1.Show Unload Me End Sub Private Sub CmdC_Click() If MSComm1.PortOpen = False Then With MSComm1 .CommPort = Val(Trim$(Cmb.Text)) .Settings = "9600,N,8,1" .InBufferSize = 1024 .InputLen = 0 .RThreshold = 1 .SThreshold = 1 .OutBufferSize = 512 .InputMode = comInputModeText End With MSComm1.PortOpen = True MsgBox "Da Ket Noi Cong Com", vbOKOnly + vbExclamation CmdC.Enabled = False CmdD.Enabled = True CmdRun.Enabled = True OptThuan.Enabled = True OptNghich.Enabled = True OptTocdo.Enabled = True OptVitri.Enabled = True End If End Sub Private Sub CmdD_Click() If CmdStop.Enabled = True Then MsgBox " Nhan Stop truoc khi ngat ket noi", vbOKCancel ElseIf MSComm1.PortOpen = True Then MSComm1.PortOpen = False MsgBox "Da ngat ket noi voi cong com", vbExclamation + vbOKOnly, " " Timer1.Enabled = False CmdC.Enabled = True CmdD.Enabled = False CmdRun.Enabled = False OptThuan.Enabled = False OptNghich.Enabled = False OptTocdo.Enabled = False OptVitri.Enabled = False End If End Sub Private Sub CmdExit_Click() End End Sub Private Sub CmdRun_Click() If (OptThuan.Value And OptVitri.Value) Or (OptVitri.Value And OptNghich.Value) Or (OptThuan.Value And OptTocdo.Value) Or (OptTocdo.Value And OptNghich.Value) Then If OptThuan.Value = True Then t = "T" ElseIf OptNghich.Value = True Then t = "N" End If If OptVitri.Value = True Then t = t & "X" & txtVitri.Text ElseIf OptTocdo.Value = True Then t = t & " V" & txtTocdo.Text End If t = t & " R" txtStatus.Text = t MSComm1.Output = t Timer1.Enabled = True CmdRun.Enabled = False CmdStop.Enabled = True Else MsgBox " Chua Setting", vbOKOnly, "Thong Bao" End If End Sub Private Sub CmdStop_Click() MSComm1.Output = "S" CmdRun.Enabled = True CmdStop.Enabled = False txtStatus.Text = "Stop" Timer1.Enabled = False End Sub Private Sub Form_Load() Cmb.Text = "4" Timer1.Enabled = False CmdD.Enabled = False CmdRun.Enabled = False OptThuan.Enabled = False OptNghich.Enabled = False OptTocdo.Enabled = False OptVitri.Enabled = False End Sub Private Sub Frame1_DragDrop(Source As Control, X As Single, Y As Single) End Sub Private Sub HSC_TocDo_Change() If OptTocdo.Value = True Then txtTocdo.Text = HSC_TocDo.Value ElseIf OptVitri.Value = True Then txtVitri.Text = HSC_TocDo.Value End If End Sub Private Sub Timer1_Timer() Dim InputText As String If (Me.MSComm1.CommEvent = comEvReceive) Then InputText = MSComm1.Input txtXung.Text = InputText & vbCrLf & txtXung.Text End If End Sub |
4. Code arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <TimerOne.h> #define A 2 #define B 4 #define PWM 5 #define DIR 6 #define BRE 7 String n; double T; int xung; double tocdo; double saisotr; double saiso; double isaiso; double dsaiso; double pwm_pulse; double tocdodat; double Kp;double Ki;double Kd; double Kpx;double Kix;double Kdx; void setup() { // put your setup code here, to run once: pinMode(A,INPUT_PULLUP); pinMode(B,INPUT_PULLUP); pinMode(PWM,OUTPUT); pinMode(DIR,OUTPUT); pinMode(BRE,OUTPUT); tocdo=0; saiso=0;saisotr=0;isaiso=0;dsaiso=0; T=0.01; Kp=2.7;Ki=0.015;Kd=0.03; Kpx=2;Kix=0.1;Kdx=0.0; pwm_pulse=0; Serial.begin(9600); attachInterrupt(0,Demxung,FALLING); Timer1.initialize(10000); Timer1.attachInterrupt(PID); } <i>......................................................................................................</i> |
Download code visual basic 6.0 và arduino
Bài viết các bạn có thể tham khảo: