mình đang học vđk 8051 và đang nghiên cứu đo tốc độ động cơ. mình đọc và biết cách sử dụng couter để đếm xung ngoài. vậy làm thế nào để hiển thị nó lên led 7 thanh được với hiện thị là vòng/giây. các bạn nào biết dạy bảo mình với nhé. càng chi tiết càng tốt ạ. mình xin cảm ơn
Thông báo
Collapse
No announcement yet.
bạn nào giúp mình đo tốc độ đọng cơ có encoder hiện thị lên led 7 thanh với
Collapse
X
-
Nguyên văn bởi canhdt4 Xem bài viếtmình đang học vđk 8051 và đang nghiên cứu đo tốc độ động cơ. mình đọc và biết cách sử dụng couter để đếm xung ngoài. vậy làm thế nào để hiển thị nó lên led 7 thanh được với hiện thị là vòng/giây. các bạn nào biết dạy bảo mình với nhé. càng chi tiết càng tốt ạ. mình xin cảm ơn
-
Nguyên văn bởi caonhan_2004 Xem bài viếtBạn Dùng thêm ngắt timer nữa. để chu kỳ ngắt khoảng vài chục ms. trong chương trình con phục vụ ngắt thì tính số sung đếm được. giả sử là chu kỳ ngắt là 20ms thì số sung đó sẽ nhân với 50 để ra số sung trong một giây. đồng thời xóa bộ đếm về o. ở đây mình nói với emcoder 1 xung.Last edited by canhdt4; 18-11-2013, 09:48.
Comment
-
Nguyên văn bởi canhdt4 Xem bài viếtmình chưa làm cái này bao giờ, bạn có thể hướng dẫn mình cụ thể hơn không. encoder của mình là 100xung/vong. mình trình bày ý hiểu thế này nhé: mình dùng counter đếm số xung trong 1s. được bao nhiêu xung thì chia cho số xung trên 1 vòng. số xung đếm dc trên 1s/100xung=số vòng/s) nhưng mình không hình dung ra là làm thế nào. thế đấy
số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.Last edited by caonhan_2004; 18-11-2013, 11:38.
Comment
-
Nguyên văn bởi caonhan_2004 Xem bài viếtBạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.
số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.
Comment
-
Nguyên văn bởi tjeunjnzah Xem bài viếtbạn ấy đã nói tới thê này thì gần như là viết code cho bạn rùi mà!
Comment
-
Nguyên văn bởi canhdt4 Xem bài viếtbạn có thể hướng đẫn cho mình viết code được không. mình không hình dung ra được là phải làm thế nào để counter đếm trong 1 khoảng thời gian. bạn có thể viết cho mình đoạn code đó và chú thích vào đấy được không. mình cảm ơnLast edited by caonhan_2004; 19-11-2013, 00:06.
Comment
-
Nguyên văn bởi caonhan_2004 Xem bài viếtbạn cứ viết đi. Nếu mắc chỗ nào thì nhờ anh em trên diễn đàn giúp đỡ. Bạn đã biết dùng timer chưa, Nếu dùng được timer và Counter là làm lần lượt theo các bước mình nói ở trên là ra. ở đây giá trị của bộ đếm sẽ lưu ở thanh ghi TL và TH của bộ đếm . Việc còn lại chỉ là đọc giá trị đó .Trên diễn đàn này có rất nhiều code, nhưng chỉ nên tham khảo. Bạn tự mày mò tìm hiểu sẽ tốt hơn là xin code.void main()
{
TMOD=0x50; //0x50=0101 0000 : C/T=1, bo dem 16bit
TL1=0x00;
TH1=0x00; //xoa bo dem
P3_5=1; //set chân vào
TR1=1; //khoi dong bo dem
// P2=0;
not_enough=0;
full=1;
while(1)
{
ham();
}
}
void delay(unsigned short d)
{
while(d>0)d--;
}
void ham(void)
{
bien=TL1;
tg1=bien/100000;
tg2=bien%100000;
tg3=tg2/10000;
tg4=tg2%10000;
tg5=tg4/1000;
tg6=tg4%1000;
tg7=tg6/100;
tg8=tg6%100;
tg9=tg8/10;
tg10=tg8%10;
dk1=1;P2=M[tg10];delay(40);dk1=0; // hang don vi
dk2=1;P2=M[tg9];delay(40) ;dk2=0; // hang chuc
dk3=1;P2=M[tg7];delay(40) ;dk3=0; // hang tram
dk4=1;P2=M[tg5];delay(40) ;dk4=0; // hang nghin
dk5=1;P2=M[tg3];delay(40) ;dk5=0; // chuc nghin
dk6=1;P2=M[tg1];delay(40) ;dk6=0; // tram nghin
Last edited by canhdt4; 19-11-2013, 12:16.
Comment
-
Nguyên văn bởi canhdt4 Xem bài viếtmình viết đoạn code đếm thế này:
gái trị trong TL1 tối đa là 255 vậy làm sao để mình đếm đến 999999 hoặc hơn nữa đực nhỉ. mình cho biếm đêm=TH1 thì cứ phải TL1 tràn thì TH1 nó mới tăng thêm 1 dơn vị
Timer1 gồm 2 thanh ghi TH1,và TL1. gộp lại là 16bit. vậy giá trị của nó có thể đếm được là 2^16-1=65535. muốn đếm nhiều hơn thì bạn nên dùng ngắt ngoài (intx) , hoặc có thể dùng chế độ ngắt tràn của counter với giá trị nạp cho nó là lớn nhất (vớ timer0 nạp 0xff, với tỉmer1 nạp giá trị 0xffff, khi đó nếu giá trị trong bộ đếm vượt qua giá trị Max của bộ đếm thì xảy ra ngắt tràn bộ đếm, cũng giống như ngắt tràn timer. Điểm khác nhau là ngắt tràn timer là timer đếm xung hệ thóng, còn conter đếm xung bên ngoài. Nếu bạn muốn đếm giá trị lớn hơn 65535, phải dùng một biến có thể lưu được giá trị lớn hơn hoặc bằng số cần đếm. VD kiểu Long với giá trị có thể lưu là 32bit, ban đầu cho biến đó bằng 0, cứ mỗi khi xảy ra ngắt ngoài hoặc ngắt do tràn bộ đếm, thì tăng biến đó lên 1 đơn vị. Như vậy bạn sẽ dùng biến đó thay cho việc phải đọc giá trị của bộ đếm. Và việc còn lại tiếp tục như mình nói hôm trước.Last edited by caonhan_2004; 19-11-2013, 19:13.
Comment
-
Bạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.
số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.
#include <REGX51.H>
void delay(unsigned short );
sbit dk1=P0^5;
sbit dk2=P0^4;
sbit dk3=P0^3;
sbit dk4=P0^2;
sbit dk5=P0^1;
sbit dk6=P0^0;
unsigned char code M[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
unsigned long int tg1;
unsigned long int tg2;
unsigned long int tg3;
unsigned long int tg4;
unsigned long int tg5;
unsigned long int tg6;
unsigned long int tg7;
unsigned long int tg8;
unsigned long int tg9;
unsigned short tg10;
unsigned int i,dem=0, n=0, x=100;
void delay(unsigned short d)
{
while(d>0)d--;
}
void hienthi(){
tg1=n/100000;
tg2=n%100000;
tg3=tg2/10000;
tg4=tg2%10000;
tg5=tg4/1000;
tg6=tg4%1000;
tg7=tg6/100;
tg8=tg6%100;
tg9=tg8/10;
tg10=tg8%10;
dk1=1;P2=M[tg10];delay(40);dk1=0; // hang don vi
dk2=1;P2=M[tg9];delay(40) ;dk2=0; // hang chuc
dk3=1;P2=M[tg7];delay(40) ;dk3=0; // hang tram
dk4=1;P2=M[tg5];delay(40) ;dk4=0; // hang nghin
dk5=1;P2=M[tg3];delay(40) ;dk5=0; // chuc nghin
dk6=1;P2=M[tg1];delay(40) ;dk6=0; // tram nghin
}
void main() // chuong trinh chinh
{
while (1)
{
for(i=0;i<20;i++)
{
TMOD=0x61; //su dung conter 1 che do 8bit va timer0 che do 16bit
TH0=0xc3; //-50000 us
TL0=0x50; //
TH1=0x00; TL1=0x06; // xoa thanh ghi TH va TL
TR0=1; TR1=1; // cho phep timer0 va counter 1 chay
P3_5=1; // set chan T0 cho nhan xung ngoai
}
if(i==20)i=0; //cho timer0 tràn
{
TR0=0;TR1=0;
dem = TL1;
n = (dem/x)*(10^6/50000)*60;
hienthi();
TR0=1;TR1=1;
}
}
}
mình viết theo ý hiểu của mình với nhưng gì bạn nói, nó không chạy được. bạn xem giúp là chỗ nào chưa đúng cho mình với nhé!
Comment
-
bạn nào biết lập trình hiển thị tốc độ đông cơ cho mình hỏi code này viết chuẩn không ạ. mình test thử hình như sai ở đâu đó thì phải. mọi người xem giúp với ạ
#include <REGX51.H>
sbit A1 = P1^3;
sbit A2 = P1^4;
sbit A3 = P1^5;
sbit A4 = P1^6;
sbit TANG=P1^0;
sbit GIAM=P1^1;
unsigned char so[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
unsigned long xung,i;
unsigned int k;
unsigned char dem,tocdo;
///////////////////////////////////////
void delay(int time) // ham delay phuc vu quet led
{int n;
for(n=0;n<time;n++)
{
;
}
}
//////////////////////////////////////
void quetled7() // ham quet led 7
{ //////////////// hang nghin
A1 = 1;
P2 = so[i/1000];
delay(50);
A1 = 0;
P2=0xff;
////////////////////////// hang tram
A2=1;
P2=so[(i/100)%10];
delay(50);
A2=0;
P2=0xff;
///////////////////////////////// hang chuc
A3=1;
P2=so[(i/10)%10];
delay(50);
A3=0;
P2=0xff;
//////////////////////////////// hang don vi
A4=1;
P2=so[i%10];
delay(50);
A4=0;
P2=0xff;
}
/////////////////////////////////////
void khoitaotimer() // 0010 0001 timer2 che do 8bit. timer1 che do 16bit
{ TMOD = 0x21; // timer0 che do 1
IE = 0x8A;
TH0 = 0xC3; // tre 50us
TL0 = 0x50;
ET0 = 1;
TR0 = 1;
TH1 = -100;
TL1 = -100;
ET1 = 1;
TR1 = 1;
}
////////////////////////////
void khoitaongatngoai()
{ EA=0;
EX0=1;
IT0=1;
EA=1;
}
///////////////////////////////////////////
void isr_timer0() interrupt 1
{ TF0=0;
TR0=0;
quetled7();
k++;
TH0=0xC3; // gia tri nap lai
TL0=0x50;
if(k==20) // lay mau 1s
{
ixung*60)/100); // vong/phut encoder dung loai 32x
k=0;
xung=0;
}
TR0=1;
}
/////////////////////////////////////////
void isr_timer1() interrupt 3
{ TF1=0;
TR1=0;
dem++;
if(dem>100)
dem=0;
if(dem<tocdo)
P1_6=1;
else
P1_6=0;
TR1=1;
}
/////////////////////// phim nhan
void phimnhan()
{
//////////////////////////
if((TANG==0)&&(GIAM==1))
{
while(!TANG);
tocdo=tocdo+10;
if(tocdo==110)tocdo=100;
}
////////////////////////////////
if((GIAM==0)&&(TANG==1))
{while(!GIAM);
tocdo=tocdo-10;
if(tocdo==-10)tocdo=0;
}
}
/////////////////////////////////// ham ngat ngoai
void isr_ex0() interrupt 0
{
xung++;
}
////////////////////////////////////// ham chinh
void main()
{P1_6=1;
khoitaotimer();
khoitaongatngoai();
while(1)
{phimnhan();
}
}
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Tiếng Anh cho người Việtbởi tuyennhanCái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .-
Channel: Tâm tình dân kỹ thuật
hôm nay, 07:44 -
-
Trả lời cho Tiếng Anh cho người Việtbởi vi van phamCám ơn những lời chúc tốt đẹp của em.
Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.
Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....-
Channel: Tâm tình dân kỹ thuật
hôm nay, 02:00 -
-
Trả lời cho Tiếng Anh cho người Việtbởi nhathung1101Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.
Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.
Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 22:18 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.
Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 14:51 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.
Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 14:39 -
-
Trả lời cho Tiếng Anh cho người Việtbởi dinhthuong80Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.
Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 14:28 -
-
Trả lời cho Tiếng Anh cho người Việtbởi bqvietĐúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
-
Channel: Tâm tình dân kỹ thuật
21-02-2025, 20:26 -
-
Trả lời cho Tiếng Anh cho người Việtbởi mèomướpDạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
-
Channel: Tâm tình dân kỹ thuật
21-02-2025, 12:32 -
-
Trả lời cho Tiếng Anh cho người Việtbởi vi van phamNhững lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).
Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...-
Channel: Tâm tình dân kỹ thuật
20-02-2025, 21:31 -
-
Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )bởi bqvietThiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.20-02-2025, 17:22
Comment