Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 11 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
11
Dung lượng
293,44 KB
Nội dung
Đếm xungđotốcđộđộngcơDCdùng Psoc
Ngu
ồ
n:biendt.biz
Phương pháp đotốcđộđộngcơ thông dụng nhất hiện nay dùng cảm biến quang
hay còn gọi là encoder. Tín hiệu từ encoder tạo ra các dạng xung vuông có tần
số thay đôi vào tốcđộđộng cơ. Dođó các xung vuông này được đưa vào bộ vi
xử lý để đếm số xung trong khoảng thời gian cho phép từ đó ta có thể tính được
giá trị vận tốc của động cơ. Đây cũng là ph
ương pháp mà người ta sử dụng để
ổn định tốcđộđộngcơ hay điều khiển nhanh chậm
Yêu cầu :
+ ĐộngcơDC 12V có bộ Encoder (Mua thì khoảng 140k có luôn encoder)
+ LCD để hiện thị giá trị mà đo được (65K)
+ 1 Chíp Psoc (Con này mua 1 làn dùng cho các bài toán vi điều khiển)
1 ) Tìm hiểu qua về cấu tạo của Encoder:
* Cấu tạo của encoder
Nhìn trên hình ta thấy encoder gồm : 1 tấm tròn có khắc lỗ, 1 Hệ thông LED
phát và thu.
* Nguyên tắc hoạt độngcơ bản:
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ỗ (rãnh). Người ta dùng một đèn led để chiếu lên mặt đĩa. Khi đĩa
quay, chỗ không có lỗ (rãnh), đèn led không chiếu xuyên qua được, chỗ có lỗ
(rãnh), đèn led sẽ chiếu xuyên qua. Khi đó, phía mặt bên kia của đĩa, người ta
đặt một con mắ
t 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.Số xungđếm được và
tăng lên nó tính bằng số lần ánh sáng bị cắt!
Như vậy là encoder sẽ tạo ra các tín hiệu xung vuông và các tín hiệu xung vuông
này được cắt từ ánh sáng xuyên qua lỗ. Nên tần số của xung đầu ra sẽ phụ
thuộc vào tốcđộ quay của tấm tròn đó. Đối với encoder mình đang dùng thì nó
có 2 tín hiệu ra lệch pha nhau 90. Hai tín hiệu này có thể xác định được chiều
quay của động cơ.
Đây là sơ đồ cấu tạo cơ bản bên trong của nó để tạo được xung vuông!
Thôi nói như thế là hiểu qua nguyên tắc hoạt động của nó rồi! Các pác nào mà
muốn tìm hiểu kỹ hơn thì vui lòng tìm trên net nó cũng có bài viết chi tiết về
encoder.
2) Sơ đồ nguyên lý của mạch đo
Sơ đồ mạch nguyên lý đotốcđộđộngcơ khá là đơn giản. Chỉ cần ta lấy tín hiệu
từ encoder của độngcơ vào là OK!
Nên nhớ trên mạch nguyên lý encoder được tích hợp sẵn và được gắn trực tiếp
vào độngcơ nên ta chỉ cần cấp điện vào cho bộ encoder và lấy 1 dấy tín hiệu ra
khi độngcơ quay là cóxung ra tại chân của encoder và điện áp cấp cho encoder
là 5V
+ Chú ý : encoder gắ
n trực tiếp trên độngcơ gồm 4 dây (Không kể hai dây
nguồn cho điện áp 12V vào độngcơ quay). Trong đó dây đỏ là dây 5V, dây xanh
là dây GND, Dây vàng và dây trắng là hai dây tín hiệu lệch pha nhau 90.
3 ) Thuật toán đotốcđộđộng cơ.
DO Psoccó đủ các module : Timer 16, couter 8, LCD nên ta chỉ cần lấy các
modul đó ra Sử dụng.
Thuật toán đơn giản mà được dùng rất phổ biến là ngắt thời gian để đếmxung
từ encoder cụ thể như sau :
+ Tạo một module thời gian ở đây là timer 16 có thời gian là 0.01s, module Cou
ter 8 đếmxung từ 0 đến 255 (Nó đếm lần lượt từ 0 đến 255 và đến 255 thì lại
trở về chu kì mới)
+ Sử dụng ngắt timer 16. (Có nghĩa là cứ 0.01s là ch
ương trình lại xẩy ra ngắt 1
lần). Trong hàm ngắt chúng ta xử lý số liệu mà số xung từ encoder được đưa về
vi điều khiển. Vì Couter nó chỉ đếm được từ 0 đến 255 để bao gồm cả trường
hợp trong 0.01s mà số xung nó lớn hơn 255 (Hay 0.01s nó được được trên 255
xung). Dođó chúng ta cần phải có 2 giá trị đếm của couter : Giá trị đếm mới
(newcount), giá trị đếm cũ (oldcount).
* Giá trị đếm cũ = Giá trị
đếm mới:
* Khởi tạo cho newcount = 255 - giá trị xungđếm
* Nếu mà giá trị oldcount > newcount thì giá trị xung cuối cùng là : count = 255
+ newcount - oldcount.
* Nếu mà giá trị oldcount < newcount thì giá trị đếm cuối cùng là :count =
newcount - oldcount
Từ giá trị đếm được số xungđó ta tính được vận tốc của động cơ. NHớ là
encoder có 100xung/vòng.
4 ) Chương trình :
Thiết lập các module sử dụng cho bài này : Các pác phải thiết lập được drrive
của Timer 16, counter 8, LCD (Có thể download chương trình về tham khảo cấu
hình phần cứng)
* Chương trình hiện thị :
#include // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "lcd.h"
void LCD_1_Clear(unsigned char x,unsigned char y)
{
char trong[]=" ";
LCD_1_Position(x,y);
LCD_1_PrString(trong);
}
void lcd1digit(int data,unsigned char x,unsigned char y)
{
LCD_1_Position(x,y);
LCD_1_WriteData('0'+data);
LCD_1_Clear(x,y+1);
}
void lcd2digit(int data,unsigned char x,unsigned char y)
{
LCD_1_Position(x,y);
LCD_1_WriteData('0'+data/10);
data=data%10;
LCD_1_Position(x,y+1);
LCD_1_WriteData('0'+data);
LCD_1_Clear(x,y+2);
}
void lcd3digit(int data,unsigned char x,unsigned char y)
{
LCD_1_Position(x,y);
LCD_1_WriteData('0'+data/100);
data=data%100;
LCD_1_Position(x,y+1);
LCD_1_WriteData('0'+data/10);
data=data%10;
LCD_1_Position(x,y+2);
LCD_1_WriteData('0'+data);
LCD_1_Clear(x,y+3);
}
void lcd4digit(int data,unsigned char x,unsigned char y)
{
LCD_1_Position(x,y);
LCD_1_WriteData('0'+data/1000);
data=data%1000;
LCD_1_Position(x,y+1);
LCD_1_WriteData('0'+data/100);
data=data%100;
LCD_1_Position(x,y+2);
LCD_1_WriteData('0'+data/10);
data=data%10;
LCD_1_Position(x,y+3);
LCD_1_WriteData('0'+data);
LCD_1_Clear(x,y+4);
}
void lcd5digit(int data,unsigned char x,unsigned char y)
{
LCD_1_Position(x,y);
LCD_1_WriteData('0'+data/10000);
data=data%10000;
LCD_1_Position(x,y+1);
LCD_1_WriteData('0'+data/1000);
data=data%1000;
LCD_1_Position(x,y+2);
LCD_1_WriteData('0'+data/100);
data=data%100;
LCD_1_Position(x,y+3);
LCD_1_WriteData('0'+data/10);
data=data%10;
LCD_1_Position(x,y+4);
LCD_1_WriteData('0'+data);
LCD_1_Clear(x,y+5);
}
void lcd_hienthi(int data,unsigned char x,unsigned char y)
{
if(data<10) lcd1digit(data,x,y);
else if(data<100) lcd2digit(data,x,y);
else if(data<1000) lcd3digit(data,x,y);
else if(data<10000) lcd4digit(data,x,y);
else lcd5digit(data,x,y);
}
* Chương trình chính :
/
// C main line
// Dotocdodongco v/s Cap cho dongco DC12V
// Viet boi : biendt - biendt.biendt@gmail.com
//website : http://biendt.biz
// Encoder : P0_2
// Timer : 0.01s
//
//
#include // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "LCD.h"
#define max 255
unsigned char count,oldcount,newcount=0;
unsigned char dem=0;
unsigned char vt=0;
void khoitaoht()
{
LCD_1_Start();
Timer16_1_WritePeriod(9); //dat thoi gian la 0.01s
T
imer16_1_WriteCompareValue(0);
Timer16_1_EnableInt();
Timer16_1_Start();
Counter8_1_WritePeriod(max); // thiet lap dem!
Counter8_1_WriteCompareValue(0);
Counter8_1_EnableInt();
Counter8_1_Start();
}
#pragma interrupt_handler Timer16_1_ISR
void Timer16_1_ISR(void)
{
dem++; // kiem tra xem nao ngat co hoat dong khong
oldcount=newcount;
newcount=max-Counter8_1_bReadCounter();
if(newcount
count=max-(oldcount-newcount);
else count=newcount-oldcount;
vt=count; // vong/s
}
void main()
{
M8C_EnableGInt;
khoitaoht();
[...]...LCD_1_Position(0,0); LCD_1_PrCString("s/x:"); LCD_1_Position(1,0); LCD_1_PrCString("v/t:"); LCD_1_Position(1,8); LCD_1_PrCString("v/s"); while(1) { lcd_hienthi(count,0,5); // hien thi xungdem lcd_hienthi(dem,0,9); // hien thi gia trri vao ngat lcd_hienthi(vt,1,5); // hien thi tocdo cua dongco } } Chương trình trên tôi đã test và ok! .
Đếm xung đo tốc độ động cơ DC dùng Psoc
Ngu
ồ
n:biendt.biz
Phương pháp đo tốc độ động cơ thông dụng nhất hiện nay dùng cảm biến quang. trị vận tốc của động cơ. Đây cũng là ph
ương pháp mà người ta sử dụng để
ổn định tốc độ động cơ hay điều khiển nhanh chậm
Yêu cầu :
+ Động cơ DC 12V