F 2014 ~ ĐIỆN TỬ BẮC KẠN

Thứ Năm, 8 tháng 5, 2014

Tính toán giá trị bảng Sin trong điều chế sóng Sin (AC)

Như chúng ta đã biết thì trong phần nghịch lưu phải có điều chế PWM khi đó dạng sóng đầu sau nghịch lưu nó là dạng sin như thế thì mới chạy được cả tải cảm , tải dung, tải thuần trở. Sin này được ông Furie nói vậy. Còn dạng sóng đầu ra chỉ là xung vuông đối xứng thì chỉ chạy được tải thuần trở như bóng đèn, nóng lạnh...Còn động cơ thì không chạy được! Đóng mở nghịch lưu chỉ đóng mở bằng các tín hiệu on - off ( Mosfet, IGBT, GTO, Thyristor). Các tín hiệu đóng mở nghịch lưu phải theo một quy luật nào đó để thu được dạng điện áp đầu ra nó phải là dạng hình sin. Trong con vi xử lý nó cũng chỉ xuất ra tín hiệu on - off bằng các bộ PWM nhưng thời gian on hay off điều chình được hay người ta gọi là PWM. Thực ra con vi điều khiển nó cũng tạo được tín hiệu hình sin đầu ra tại 1 chân của nó bằng các bộ biến đổi DAC ( số - tương tự) cái này cũng cần phải tính giá trị bảng sin. Ở đây biendt đang nói về giá trị trong nghịch lưu điều chế sóng Sin nên nó có sự khác biệt. Hiểu qua thế này các giá trị trong bảng Sin nó làm thay đổi thời gian on hay off. Tức là nó làm thay đổi giá trị của thanh ghi điều chế thời gian on - off trong vi điều khiển. Giá trị thanh ghi này được thay đổi theo bảng Sin. 1) Tại sao ta phải dùng bảng sin? Như chúng ta đã biết thì điện áp hình sin nó có dạng như sau : Bấm xem ảnh ở cửa sổ mới Qua hình vẽ trên ta thấy sóng sin đối xứng qua gốc tọa độ. Các điểm trên hình vẽ thể hiện các giá trị điện áp tại các điểm đó! + Tại điểm 0 thì điện áp bằng 0V + Tại điểm 1 điện áp dương > tại điểm 0 mang một giá trị nào đó + Tại điểm 2 tức là điện áp dương lớn nhất > tại điểm 1 và mang giá trị là A + Tại điểm 3 điện áp dương < tại điểm 2 mang một giá trị điện áp nào đó + Tại điểm 4 điện áp =0 V + Tại điểm 5 điện áp âm < tại điểm 0 và mang giá trị đối xứng với 3 + Tại điểm 6 điện áp âm nhỏ nhất có giá trị = -A + Tại điểm 7 điện áp âm mang 1 giá trị nào đó > điểm 6 + Tại điểm 8 thì điện áp trở về 0V Do có sự thay đổi điện áp theo thời gian nên điện áp ở các thời gian là khác nhau . Điện áp lớn nhất tức là 2 đỉnh sin mang giá trị A và -A. Tại đỉnh sin này thì điện áp là lớn nhất sau đó giảm dần và tăng dần. Đến đây các bạn đã hiểu phần nào? Điều đặt ra ở đây là cái gì có thể thay đổi điện áp hình sin theo thời gian? Hiện nay có 1 cái thay đổi được đó là PWM tức là điều khiển điện áp ra tải. Nhắc qua tí về PWM PWM thực chất là nó làm thay đổi điện áp ra tải. Cái này nó phụ thuộc vào thời gian on và thời gian off ( T = on + off). Nhìn dưới đây! Bấm xem ảnh ở cửa sổ mới Sơ đồ trên là dạng xung điều chế trong 1 chu kì thì thời gian xung lên (Sườn dương) nó thay đổi dãn ra hoặc co vào. Và độ rộng của nó được tính bằng phần trăm tức là độ rộng của nó được tính như sau : Độ rộng = (t1/T).100 (%) Uo = Uv.t1/T (Điện áp đầu ra) Như vậy thời gian xung lên càng lớn trong 1 chu kì thì điện áp đầu ra sẽ càng lớn. Nhìn trên hình vẽ trên thì ta tính được điện áp ra tải sẽ là : + Đối với PWM = 25% ==> Ut = Umax.(t1/T) = Umax.25% (V) + Đối với PWM = 50% ==> Ut = Umax.50% (V) + Đối với PWM = 75% ==> Ut = Umax.75% (V) Cứ như thế ta tính được điện áp đầu ra tải với bất kì độ rộng xung nào. Kết Luận : Như vậy thì các giá trị trong bảng sin làm thay đổi PWM từ đó thay đổi điện áp ra tải. Tại mỗi giá trị trong bảng sin ứng với PWM khác nhau. Mỗi điểm trên hình sin mang một giá trị ứng với mỗi điện áp khác nhau. ==> Bảng Sin thay đổi được độ rộng xung (PWM) 2) Xây dựng công thức tính giá trị Sin Như trên biendt đã trình bày thì giá trị trong bảng sin làm thay đổi PWM nên công thức của nó phải liên quan đến giá trị trong thanh ghi điều khiển độ rộng xung của vi xử lý! Như chúng ta đã biết thì sóng dạng sin có phương trình x = Asin(wt) + A là biên độ của sóng sin sin + wt là góc pha ( từ 0 đến 360 độ) Giá trị của sin được chạy từ [-1;1]. Vậy khi sin = 1 thì x = A tức khi sin đi qua góc 90 độ và sinx =-1 thì x = -A khi sin đi qua góc 270. Dựa vào công thức của Sin trên ta tính toán ra công thức cho bảng Sin. Một điều mà tôi nhắc đi nhắc lại là các giá trị bảng sin nó phải liên quan đến thanh ghi điều chế độ rộng xung. Ở đây A là biên độ và là giá trị lớn nhất cho vào thanh ghi điều khiển độ rộng xung của vi xử lý để PWM = 100 như vậy các giá trị còn lại sẽ nhỏ hơn A vì Sin = [-1,1]. Ta đi phân tích hình vẽ sau : Bấm xem ảnh ở cửa sổ mới Do các giá trị đặt vào thanh ghi điều chế độ rộng xung của vi xử lý là các giá trị dương nên ta sẽ có công thức tổng quát như sau: sin_table = A/2Sin(2*3.14*i/n) + A/2 + A là biên độ của sóng sin tức là giá trị lớn nhất đặt vào thanh ghi PWM để cho PWM = 100% + n là số bước của sóng sin hay nó tương đương với 1 chu kì. Tức là số điểm cần lấy trên điểm sin. Ở đây tôi lấy 8 điểm tức với n = 8 + i là một điểm bất kỳ trên Sin. giá trị của i nằm trong khoảng từ [0 - n]. Tại giá trị i = 2 thì biến độ A là lớn nhất và i =6 là nhỏ nhất ứng với lần lượt sin_table = A và sin_table = 0. Số bước sin các pác có thể lấy nhiều hay ít thì tùy nếu mà nhiều thì dạng sóng sin đầu ra sẽ chuẩn mà ít khi có tải nó sẽ méo! Tới đây các pác đã hình dung được phần nào được tại sao lại có công thức sin như thế! Nó dựa vào đưa giá trị vào thanh ghi PWM của vi điều khiển. Tại i = 0 tức là sin_table = A/2 cứ như vậy cho đến hết i =n; Nếu mà không hiểu chỗ này các pác hãy ngồi nghĩ một tí là ra! Thôi biendt sẽ chuyển sang các tính trong excell để cho nhanh và thuận tiện không cần phải tính bằng tay. 3) Tính bảng sin trong Excell Tôi tính luôn cái giá trị n =8 và biến độ A = 100 a) Nhập cột A của Excell là các giá trị của i ở đây i chạy từ [0 8] Bấm xem ảnh ở cửa sổ mới b) Tiếp theo dùng công thức trên tính các giá trị tương ứng ở cột B Ta nhấn vào cột B và hàng 1 sau đó ở trên chỗ fx ta đánh công thức vào như hình dưới đây! Bấm xem ảnh ở cửa sổ mới Enter cái là được 1 giá trị khi i = 0 và giá trị đó là 50. Tiếp theo ta tính các giá trị khác bằng cách từ cái đầu tiên ta kéo xuống tới giá trị i =8 như hình dưới đây! Bấm xem ảnh ở cửa sổ mới Kéo xuống là ok rất nhanh và tiện lợi. Thế này có hàng trăm bước sin cũng tính trong vòng có mấy phút c) Giá trị bảng sin thu được sin_table = 50, 85 , 100, 85, 50, 15, 0 , 15, 50 ( Nên lấy các giá trị nguyên vì vi điều khiển tính toán được số nguyên nhanh hơn số thực) 4) Giá trị bảng sin trong vi điều khiển Như trên ta tính giá trị bảng sin việc còn lại ta làm thế nào để đưa các giá trị trên vào thanh ghi PWM của vi xử lý. Thông thường được làm như sau : + Lưu giá trị bảng sin đó vào 1 mảng : ví dụ như : const char sin_table[]= {50,85,100,15,0,15,50}; + Sau đó thanh ghi PWM truy xuất bảng sin đó. Thời gian truy xuất hết các giá trị sin sẽ là tần số đầu ra của sóng Sin. Đến đây các bạnc đã hình dung được phần nào về cách chuyển đổi DC sang AC. Trong lập trình thì mỗi người có những thuật toán khác nhau. Bảng sin có thể thay đổi tùy theo người lập trình. nguồn từ : http://hoiquandientu.com/read.php?579

Thứ Ba, 29 tháng 4, 2014

mạch điện chuyển đổi 12vdc lên 220v

các bạn xem sơ đồ rồi mắc theo hình bên dưới nhé 1 http://dientubackan.blogspot.com/

Thứ Bảy, 26 tháng 4, 2014

Kỹ Thuật Quét Led

// KỸ THUẬT QUÉT LED 7 ĐOẠN.
Nói có sách , mách có hình ảnh
Đầu tiên đây sẽ là hình của led 7 đoạn Anode và Ktode chung mà anh em đã biết :

Về cấu tạo :
Như các bạn đã thấy trên hình vẽ ,Led 7 thanh được cấu tạo từ 7 diode ghép theo dạng thanh(nôm na là thế đã ).
-Nếu nối các cực Anode vói nhau gọi là Anode chung
và với Ktot cũng tương tự.

//----------------sử dụng như thế nào -------------------------
Cái này thì các bạn hầu như ai cũng biết mình sẽ nói qua thôi.
Nếu là Anode chung , có nghĩa là chân Anode nối lên nguồn (mức 1) thì dữ liệu đưa vào 7 chân dữ liệu A B C D E F G sẽ là mức thấp (0) thì led 7 đoạn sẽ tích cực (sẽ sáng) tùy vào dữ liệu các bạn đưa vào.
Với led 7 thanh ktot chung cũng ngược lại , dữ liệu vào các chân A B C D E F G LÀ Mức cao (mức 1) mới tích cực.
// --------------Cách dùng trong ngôn ngữ C---------------------
Sau đây là bảng mã led dùng :

Và đây nữa cho Ktot:


Như vậy là đã rõ chúng ta dùng ngôn ngữ C và dùng mã led như trên
Nếu các bạn muốn hiện một chữ hay một số khác trên led 7 thanh dễ thôi, các bạn chỉ cần nhìn vào led 7 thanh , cho giá trị A B C D E F G phù hợp là được (lưu ý : anode mức 0 tích cực , Ktot mức 1 tích cực)

// Để rõ ràng Đây là ví dụ 
// Hiển thị một số và một chữ 
Hiển thị một số thôi

// dientubackan.blogspot.com
#include<reg51.h> // thu vien dung cho 8051
#include<stdio.h> // thu vien dung cho cac cau truc dieu khien
#include<intrins.h> // chua cac ham dung cho tung bit
// luu ý do thói quen mình khai bao c? 3 thu vien mac du co the ko dung den
// cac ban neu hieu roi thi co the ko khai bao nhung theo minh nen khai bao ca 3
// cung ko ton bo nho nhieu
void main(void)
   {
 
     P2=0xF9;// so 1

   }

hình ảnh :



Tương tự với một chữ khác // chữ P
ok chỉ cần thay P2=0x8C // mã của chữ P


// Bây giờ là quét
Mình sẽ quét một led 7 đoạn các bạn để ý nhé !
// Hiển thị số từ 0-9
 

// dientubackan.blogspot.com
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
// khai bao ma led 7 doan    ktot chung
unsigned char mang[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
// chuong trinhd delay
void delay(unsigned char ms)
   {
   int i,j;
   for(i=0;i<ms;i++)
     {
    for(j=0;j<125;j++);
    }
   }
// chuong trinh chinh
void main(void)
    {
   // xuat du lieu ra cong P2
   int a;
   while(1)
   {
   for(a=0;a<10;a++)
       {
      P2=mang[a];
      delay(1000);
      }
      }
   }

Hình ảnh đây:


Lưu ý với các bạn : chỉ một số bài phức tạp một chút mình mới đưa file mô phỏng và keil C lên . Còn những bài đơn giản đã có code rồi các bạn vẽ mô phỏng cho hiểu bản chất.
// quét nhiều hơn 1 led
Chúng ta đã rõ nếu mà dùng nhiều led 7 đoạn thì có nhiều cách dùng lắm như dữ liệu của 1 led 7 đoạn nối vào một cổng.
nếu ta dùng cách trên chỉ với 4 led 7 đoạn ta đã hết chân 8051.
Như vậy thật là lãng phí.
--------------------------------------------------------------------
Để đơn giản và tiết kiệm chân cho vđk ta sẽ nối hết các chân dữ liệu của lè 7 đoạn với nhau và nối tới 1 cổng của VĐK , khi đó ta sẽ quét những chân 
chung của nó ,tại một thời điểm chỉ có một chân chung được tích cực.
Nhưng do thời gian quét nhanh(mắt người chỉ phản ứng đc với dưới 24 hình ảnh trong 1 giây) do đó ta cảm tưởng như các led sáng đồng thời.
Như vậy là tiết kiệm rồi phải ko?
Ta có thể dùng thỏa mái led 7 đoạn , nếu nhiều quá mình sẽ dùng kỹ thuật khác là ic 74ls138 (sẽ nói trong cac Seri sau).

--------------------------------------------------------------------
Chúng ta có bao giờ hỏi xem thời gian bao nhiêu là đủ và tính toán thời gian quét trong C như thế nào ko ?
Tôi tin chắc rằng rất nhiều bạn đang băn khoăn . Nhưng ko sao " Nhóm Hand in Hand sẽ đồng hành cùng với các ban.
Tôi khuyên các bạn nên dùng Timer trong 8051 , khi đó thời gian sẽ chính xác mà ko cần băn khoăn có trễ.
Nguyên lý quét như sau :
Tại một thời điểm chỉ có 1 led được tích cực (sáng).
Sơ đồ quét :
led sáng -> xuất dữ liệu -> trễ ->led tắt -> xóa dữ liệu.
Chỉ đơn giản vậy thôi ?
 
Nhưng còn một cái quan trọng lắm đấy
Đó là dùng timer và tính thời gian quét

Cụ thể nhé !
[b]Bạn muốn quét 4 led 7 đoạn phải ko ?
Đấy nè :
Thông thường nếu là 1 led 7 đoạn ta thường quét ở tần số 25hz tương ứng là 40ms.
Do đó nếu là n led thí thời gian quét mỗi led là 40:n (ms)
Do đó 4 led sẽ là 40:4 = 10ms(đã xong rồi nhé)
Cách tính giá trị thanh ghi Tmod ứng với 10ms như sau:
Bạn có 10ms , thạch anh 12Mhz ta dùng cho VĐK do đó chu kí máy là 1us
----------> khoảng giá trị trễ là :
Công thức : khoanggiatritre*1us = thoigian;
suy ra : khoảng giá trị trễ là : 10ms/1us =1000;
khi đó giá trị bắt đầu là 65536 -1000 = 64536;
Từ 64536 -65536 đúng là 1000 rồi .
ok
Ta dùng Calculator trong máy tính đổi được giá trị hexa = FC18
của 64536 đây chính là giá trị cần nạp cho timer( Thông thường ta dùng Tmer0 ,timer1 do tôi quen) còn thì dùng cái nào cũng được.
[/b]
---------------------------------------------------------------------
Cách viết chương trình timer trễ trong C
Tôi không nhầm thì có vài cách viết thì phải.
Nhưng ở đây mình chỉ giới thiệu 2 cách viết dễ hiểu và thông dụng nhất :
//cách gián tiếp đổi ra hêxa rồi nạp vào như sau :

// dientubackan.blogspot.com
void tre_timer(void)
    {
    TMOD=0x01 ; chon timer 0 che do 1 16 bit
    TH0=0xFC ; // chinh la gia tri o 2byte cao ban vua doi o tren FC18
     TL0=0x18;
    TR0=1;// khoi tao cho timer 0 chay
   while(!TF0) ; // ko lam gi cho den khi co TF0 bat len la bo dem bi tran
  TF0=0;// xoa co timer 0
  TR0=0; // xoa timer 0
    }
Cách trực tiếp bạn ko cần đổi hexa làm gì mất công

// hand in hand group
// dtvt k7a
// truong DH CNTT - TT Thai Nguyen
void tre_timer(void)
    {
    TMOD=0x01 ; chon timer 0 che do 1 16 bit
    TH0=64536/256; // doi ra hexa van la FC
     TL0=64536%256 ; // doi ra van la 18 thoi
    TR0=1;// khoi tao cho timer 0 chay
   while(!TF0) ; // ko lam gi cho den khi co TF0 bat len la bo dem bi tran
  TF0=0;// xoa co timer 0
  TR0=0; // xoa timer 0
    }
Các bạn đã rõ chưa ?
Đây là một ví dụ ứng dụng cụ thể nhé :
Xuất đồng thời ra 4 số 1234 ra 4 led :


// dientubackan.blogspot.com
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
// khai bao cac led de quet
sbit led1 = P3^0;
sbit led2 = P3^1;
sbit led3 = P3^2;
sbit led4  = P3^3;
// khai bao ma led 7 doan    ktot chung
unsigned char mang[10]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
// chuong trinhd delay
void delay(void)
    {
   TMOD=0x01;
   TH0=0xFC;
   TL0=0x18;
   TR0=1;
   while(!TF0);
   TF0=0;
   TR0=0;
   }
// chuong trinh xuat dong thoi ra 4 led cac so 1.2.3.4
void main(void)
    {
   while(1)
      {
      led1=0;
      P2=0x06;// so1
      delay();
      led1=1;
      P2=0x00;
      led2=0;
      P2=0x5B;    //so 2
      delay();
      led2=1;
      P2=0x00;
      led3=0;
      P2=0x4F;   // so3
      delay();
      led3=1;
      P2=0x00;
      led4=0;
      P2=0x66;   // so4
      delay();
      led4=1;
      P2=0x00;



      }
   }
hình ảnh :

Enlarge this image

file mô phỏng :
handinhand
// Nguyên lý này cũng áp dụng cho bai đếm sản phẩm :

// dientubackan.blogspot.com
#include<reg52.h>
#include<stdio.h>
#include<math.h>
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
unsigned char M[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
unsigned char donvi,chuc,tram,nghin ;
long num,j;
void tre(void)
   {
   TMOD=0x10;
   TH1=0xD8;
   TL1=0xEF;
   TR1=1;
   while(!TF1) ;
   TF1=0;
   TR1=0;
   }
void hienthi(void)
     {
    nghin=num/1000;
    tram=(num%1000)/100;
    chuc=((num%1000)%100)/10;
    donvi=((num%1000)%100)%10;
      led1=1;
      P2=M[donvi];
      tre();
      led1=0;
      P2=0xFF;
      led2=1;
      P2=M[chuc];
      tre();
      led2=0;
      P2=0xFF;
      led3=1;
      P2=M[tram];
      tre();
      led3=0;
      P2=0xFF;
      led4=1;
      P2=M[nghin];
      tre();
      led4=0;
      P2=0xFF;

     
    }
void main(void)
    {
   IE=0x84;
   IT1=1;// ngat theo suon am
   num=0;
   while(1)
     {
     hienthi();

     }
   }
void ngatngoai_1(void) interrupt 2
   {
   ++num;
   }
file mô phỏng:


dientubackan.blogspot.com
// Một trong những kỹ thuật quét khác cũng hay được dùng đó là sử dụng IC giải mã 74LS47
Xem datasheet của nó như sau:


Do đó dựa vào bảng chân lý của nó ta có thể vẽ hình như sau dùng Ktot chung:

Enlarge this image Click to see fullsize



#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
unsigned char mang[10]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
void delay(int t)
    { int i;
   for(i=0;i<t;i++);
   }
void main(void)
    {
   int i;
   for(i=0;i<10;i++)
      {
      P2=mang[i];
      delay(30000);
      }
   }


Phù
                   
Xong rồi

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Design Blog, Make Online Money