Chia sẻ Tạo sóng sine dùng vi điều khiển

#1
1- Tạo sóng mô phỏng sin bằng PWM (hay dùng trong các mạch switching công suất lớn)
Nguyên lý:
sine_pwm_1.gif


Nguyên tắc tính toán giá trị:
Chu kỳ tạo xung PWM phải ngắn hơn nhiều so với chu kỳ sóng sin.
Lấy ví dụ, dùng PWM 8bit, có 256 mức và chia ra làm 36 xung PWM trong một chu kỳ sóng sin (mỗi chu kỳ PWM là 2 * pi / 36 radian hay 10 độ).

Tại mức 0, sử dụng duty là 50%. đỉnh âm là 0% và đỉnh Dương là 100%.
Với mỗi chu kỳ PWM, sử dụng bảng sin để xác định duty.
Đối với mức zero (0), PWM = 50%, số đếm = 128.
Đối với sin (2 * pi / 36), PWM = 59%, số đếm = 151,
với sin (2 * pi * 2/36), PWM = 67%, số đếm = 171, v.v.

Đầu ra sóng sin đối xứng qua mốc giá trị 128,
với mức cao = 151, suy ra mức thấp = 256-151 = 105,
với mức cao = 171, thấp = 85, v.v. trong suốt một chu kỳ của sóng sin.

Thông thường, để giảm bớt tính toán trong VÐK, người ta hay dùng bảng tính sẵn (lookup table) theo cách như trên,
có thể tính toán giá trị bảng sine online tại đây: Sin table calculator

ví dụ code PIC (C) - có chi tiết trong file kèm theo
Mã:
#pragma config
FOSC = INTOSC
unsigned char g
Dutycount =0;
const char SINETABLE[40]= { 50,55,60,65,70,75,80,85,90,95, 100,95,90,85,80,75,70,65,60,55, 50,45,40,35,30,25,20,15,10,5, 0,5,10,15,20,25,30,35,40,45 };
// FOSC configuration
OSCCON = 0x78;
// Fosc = 16 MHz with internal oscillator __delay_us(100);
// Timer2 configuration for PWM
PR2 = 99;
// PWM period register for 40 kHz
T2CON = 0x04;
// Timer2 on
// PWM 1 configuration PWM1CON = 0xC0;
// PWM1 on, PWM 1 output enable PWM1DCH = 50;
// PWM duty initialized to 50%
PWM1DCL = 0;
PIE1bits.TMR2IE =1;
// Timer2 interrupt enable
INTCON =0xC0;
// Global interrupt enable, peripheral interrupt enable
TRISC = 0x00;
// Port C as digital output port
ANSELC = 0x00;
// Port C as digital output port void interrupt
Timer2_ISR(void) { if (TMR2IF) { ++gDutycount;
// Increment the counter variable by 1
if(gDutycount == 39)
{
gDutycount = 0;
}
PWM1DCH = SINETABLE[gDutycount];
// Load the duty cycle register according to the sine table TMR2IF = 0;
}
}

2- Tạo sóng mô phỏng sin bằng DAC dùng mạng điện trở R/2R (hay dùng trong các mạch tạo tín hiệu)
Nguyên lý:
8051_8bit R-2R DAC.png


Giá trị tức thời của sóng sin được ghi ra port bất kỳ (8bit, 12bit, 16 bit v.v), ở ví dụ trên là 8bit, tại port đó ta mắc mạng điện trở,
giá trị đầu ra sẽ được "cộng" trung bình của các bit với các trọng số khác nhau. Kết quả ta được giá trị analog tương ứng.

ví dụ code 8051 (ASSEMBLER)
Mã:
ORG 0000H
CLR A
UP : MOV DPTR,#SINE    ; Trỏ đến bảng
MOV R0,#24        ; biến đếm 25 vòng
LABEL: MOVC A,@A+DPTR
MOV P2,A        ; ghi giá trị ra P2
       CLR A
  INC DPTR
  DJNZ R0,LABEL        ; chưa hết 25, biến tiếp theo
  SJMP UP        ; đã hết 25, lặp lại vòng tiếp theo
ORG 050H
SINE :
DB 127,160,191,217,237,250,255,250,237,217,191,160,127,94,63,37,17,4,0,4,17,37,63,94,127
END
Ngoài ra, một số loại DAC cao cấp hoặc IC chuyên dụng tạo sóng sin khác (không kể đến ở đây)

Một số tài liệu tham khảo kèm theo

Chúc các bạn thành công !
 

Đính kèm

nvtuan.91

Học sinh trung cấp
#2
a ơi giúp e với e đang nghiên cứu cái này nhưng mà e chưa hiểu cách tính cho lắm a có thể nói cụ thể và rõ hơn một chút được không ạ cụ thể là làm sao để sác định được đoạn này ạ?

Tại mức 0, sử dụng duty là 50%. đỉnh âm là 0% và đỉnh Dương là 100%.
Với mỗi chu kỳ PWM, sử dụng bảng sin để xác định duty.
Đối với mức zero (0), PWM = 50%, số đếm = 128.
Đối với sin (2 * pi / 36), PWM = 59%, số đếm = 151,
với sin (2 * pi * 2/36), PWM = 67%, số đếm = 171, v.v.
 
#3
Cách tính thì dài dòng lắm, Bạn nên dùng các bảng có sẵn ở các VD trên hoặc tính online

về % duty của PWM, Hiểu khái quát như hình dưới: (số không chính xác, chỉ là mô tả)

upload_2015-3-26_23-16-13.png


Bạn xem kỹ xem không hiểu chỗ nào nữa?
 

nvtuan.91

Học sinh trung cấp
#4
a cho e hỏi một chút ạ. e không hiểu cái chỗ tạo PWM ý ạ phải tạo ntn với xung bao nhiêu thì mới có thể tạo ra sóng sin. và các giá trị bảng sin kia là giá trị phần trăm PWM hay giá trị để nạp vào time tạo tần số. nếu nếu nạp vào time thì mỗi một time thì xung phát ra lại một tần số khác nhạu ạ
 
#5
Về PWM trong các VÐK : sau khi bạn khởi tạo (tần số, số bit), "nó" sẽ "tự chạy", với độ rộng xung (phần xung dương gọi là duty) sẽ do giá trị trong thanh ghi pwm quyết định, Tần số pwm cố định, chỉ có duty thay đổi.
VD thanh ghi pwm 8 bit (max=255), ghi số 127 vào, sẽ được duty 50%, ghi 64 sẽ được duty 25%.

pwm.gif


Ở VD 1 ở trên #1, Timer 2 làm nhiệm vụ thay 40 lần giá trị pwm khác nhau trong 20mS (20mS= 1 chu kỳ sóng sine 50Hz). Với duty thay đổi, giá trị trung bình của điện áp ra sẽ gần giống Sine (mô phỏng sine).

Chi tiết các thanh ghi và cách điều khiển pwm đó, Bạn xem thêm tài liệu về loại VÐK cụ thể mà bạn định sử dụng.
 

nvtuan.91

Học sinh trung cấp
#6
a cho e hỏi là giờ e tạo một xung 50HZ rồi e tạo một PWM xen lẫn vào đấy có được không a. Cụ thể là e đang làm một mạch invertor với 3 đường tín hiệu. một chân e tạo xung 50HZ một chân cũng xung 50HZ nhưng pha ngược với pha của xung kia. còn một chân là tín hiệu PWM rồi đưa qua cổng NAND để lấy hai tín hiệu ra. a cho e hỏi là caisw PWM kia nếu e tạo một xung cố định là 50KHZ rồi e điều chỉnh độ rộng xung bằng cách là nạp giá trị bảng sin vào thanh nghi tạo độ rộng xung thì có được khộng ạ. mong a tư vấn giúp e
 

nvtuan.91

Học sinh trung cấp
#7
a có thể cho e xin địa chỉ Gmail. Được không ạ. mà a cho e hỏi e là giữa cái PWM và xung 50HZ thì phải kết hợp với nhau ntn thì mới cho ra được xung sin.giả sử như là khoảng time thay đổi giữa các độ rộng xung với nhau ý ạ. với tần số PWM là bao nhiêu thì ok.
 
#8
a cho e hỏi là giờ e tạo một xung 50HZ rồi e tạo một PWM xen lẫn vào đấy có được không a. Cụ thể là e đang làm một mạch invertor với 3 đường tín hiệu. một chân e tạo xung 50HZ một chân cũng xung 50HZ nhưng pha ngược với pha của xung kia. còn một chân là tín hiệu PWM rồi đưa qua cổng NAND để lấy hai tín hiệu ra. a cho e hỏi là caisw PWM kia nếu e tạo một xung cố định là 50KHZ rồi e điều chỉnh độ rộng xung bằng cách là nạp giá trị bảng sin vào thanh nghi tạo độ rộng xung thì có được khộng ạ. mong a tư vấn giúp e
Thật sự là không hiểu ý Bạn cần gì và làm cái gì?
Để tạo 50Hz, nếu pwm 50kHz, bạn có thể điều biến "mịn" đến 1000 giá trị (bảng sine 1000 giá trị). tất nhiên có thể ít hơn số đó, VD 10 xung pwm mới nạp giá trị 1 lần, thì sẽ nạp 100 lần.
 

nvtuan.91

Học sinh trung cấp
#9
Thật sự là không hiểu ý Bạn cần gì và làm cái gì?
Để tạo 50Hz, nếu pwm 50kHz, bạn có thể điều biến "mịn" đến 1000 giá trị (bảng sine 1000 giá trị). tất nhiên có thể ít hơn số đó, VD 10 xung pwm mới nạp giá trị 1 lần, thì sẽ nạp 100 lần.
thật ra là e vẫn chưa biết kệt hợp với PWM và xung 50HZ ntn. và cũng chưa biết là thuật toán để lập trình ntn, nên e vẫn đang mơ hồ quá a có thể nói rõ hơn một chút cho e hiểu được khộng ạ. cụ thể như là phải kết hợp với PWM và xung ntn. thời gian ntn thì thay đổi một độ rộng xung PWM để có được sóng sin ạ
 

nvtuan.91

Học sinh trung cấp
#10
Về PWM trong các VÐK : sau khi bạn khởi tạo (tần số, số bit), "nó" sẽ "tự chạy", với độ rộng xung (phần xung dương gọi là duty) sẽ do giá trị trong thanh ghi pwm quyết định, Tần số pwm cố định, chỉ có duty thay đổi.
VD thanh ghi pwm 8 bit (max=255), ghi số 127 vào, sẽ được duty 50%, ghi 64 sẽ được duty 25%.

Xem đính kèm 51959

Ở VD 1 ở trên #1, Timer 2 làm nhiệm vụ thay 40 lần giá trị pwm khác nhau trong 20mS (20mS= 1 chu kỳ sóng sine 50Hz). Với duty thay đổi, giá trị trung bình của điện áp ra sẽ gần giống Sine (mô phỏng sine).

Chi tiết các thanh ghi và cách điều khiển pwm đó, Bạn xem thêm tài liệu về loại VÐK cụ thể mà bạn định sử dụng.
Ở VD 1 ở trên #1, Timer 2 làm nhiệm vụ thay 40 lần giá trị pwm khác nhau trong 20mS (20mS= 1 chu kỳ sóng sine 50Hz). Với duty thay đổi, giá trị trung bình của điện áp ra sẽ gần giống Sine (mô phỏng sine).
e không hiểu chỗ này. a cho e hỏi là timer 2 thay đổi 40 giá gị cái giá trị này là giá trị về tấn số hay chỉ là giá trị độ rộng xung ạ. a có đoạn code nào về pic không cho e xin e tham khảo với ạ. hoặc a cho e xin địa chỉ Gmail. e gửi sơ đồ a có thể góp ý cho e được không ạ
 

Quảng cáo Google