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
-
bởi since0501Mình đào mộ xíu, cho mình hỏi là pin của bác vẫn ok chứ? Mình vừa đóng khối pin 16 cell 40135 thì khi chạy điện áp nó sụt so với khi nghỉ như video mình dẫn link, vậy cho mình hỏi là dung lượng pin sẽ tính khi áp nghỉ hay áp đang hoạt động, và pin sụt áp như vậy là bình thường hay pin kém?
ht...-
Channel: Điện tử dành cho người mới bắt đầu
hôm nay, 17:56 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi mèomướpDạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
-
Channel: Điện tử công suất
Hôm qua, 13:11 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi tuyennhanSửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
-
Channel: Điện tử công suất
Hôm qua, 09:25 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi tuyennhanĐúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....-
Channel: Điện thanh
Hôm qua, 09:10 -
-
bởi Ng.Phuong.5Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
Mấy con...-
Channel: Cadence ORCAD
09-01-2025, 19:44 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi viettinhBác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...-
Channel: Điện thanh
09-01-2025, 18:12 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi nguyendinhvanTheo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
Cách đơn giản...-
Channel: Điện thanh
09-01-2025, 00:04 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi mèomướpDạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
-
Channel: Điện tử công suất
08-01-2025, 19:02 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi tuyennhanChủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
-
Channel: Điện tử công suất
08-01-2025, 15:43 -
-
Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.bởi tuyennhanLoa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
-
Channel: Điện thanh
08-01-2025, 15:28 -
Comment