Kỹ thuật điều chế độ rộng xung PWM

PWM là cái gì mà sao nó được ứng dụng nhiều trong điều khiển. Lấy điển hình nhất mà chúng ta thường hay gặp là điều khiển động cơ và các bộ băm xung áp, điều áp… Sử dụng PWM điều khiển nhanh chậm của động cơ hay cao hơn nữa nó còn được dùng để điều khiển ổn định tốc độ động cơ.

Ngoài lĩnh vực điều khiển hay ổn định tải thì PWM nó còn tham gia và điều chế các mạch nguồn như là : boot, buck, nghịch lưu 1 pha và 3 pha…PWM chúng ta còn gặp nhiều trong thực tế và các mạch điện điều khiển. Điều đặc biệt là PWM chuyên dùng để điều khiển các phần tử điện tử công suất có đường đặc tính là tuyến tính khi có sẵn 1 nguồn 1 chiều cố định . Như vậy PWM nó được ứng dụng rất nhiều trong các thiết bị điện điện tử. Điều mà dân điện điện tử dễ dàng nhận ra là PWM chính nhân tố mà các đội Robocon sử dụng để điều khiển động cơ hay ổn định tốc độ động cơ. Trong bài viết này chúng ta sẽ tìm hiểu phương pháp dùng 8051 để tạo xung có độ rộng mong muốn trong điều khiển động cơ điện.

Giải thuật như sau:

– Tạo một tần số chuẩn từ 0,1 ms đến 10ms dùng các bộ timer của vi điều khiển.

– Thay đổi độ rộng xung bằng cách thay đổi tỷ số xung mức 1 và mức 0 của tần số chuẩn đó kết quả cho xung như yêu cầu .

Các bạn xem hình vẽ sau :

 

Với độ rộng xung thay đổi chúng ta có thể thay đổi độ sáng tối của đèn led , tốc độ động cơ ..

Dưới đây là một ứng dụng của PWM trong việc điều khiển động cơ điện 1 chiều

 

 

Trên mạch có 2 phím tăng giảm để điều chỉnh độ rộng xung. Xung đầu ra được khuếch đại qua tran TIP41 điều khiển động cơ.

Code lập trình :

#include <REGX52.H>

sbit    PWM = P2^3;
sbit    TANG = P1^2;
sbit    GIAM = P1^5;
unsigned char dem=0,tocdo=50;

bit TANG1=1,TANG0=1,GIAM0=1,GIAM1=1;

void timer0(void) interrupt 1
{
TR0 = 0;
TF0 = 0;
dem++;
if(dem > 100)
dem = 0;
if(dem<tocdo)
PWM = 1;
else
PWM = 0;
TR0 = 1;
}

void phimnhan()
{
//////////////////////////
TANG0=TANG1;TANG1=TANG;
if((TANG0==1)&&(TANG1==0))
tocdo=tocdo+10;
if(tocdo==110)tocdo=100;

/////////////////////////////////
GIAM0=GIAM1;GIAM1=GIAM;
if((GIAM0==1)&&(GIAM1==0))
tocdo=tocdo-10;
if(tocdo==-10)tocdo=0;
}

void main(void)
{
TMOD = 0x02;
IE = 0x82;
TH0=TL0=-100; // tao tan so 0.1 ms
TR0 = 1;
PWM=0;
while(1)
{
phimnhan();
}
}

digg delicious stumbleupon technorati Google live facebook Sphinn Mixx newsvine reddit yahoomyweb