Tác giả: TAHMID MAHBUB
Khi tạo ra sóng sin bằng kỹ thuật số, mình làm như vậy bằng cách sử dụng một số xung sóng vuông cố định. Con số này càng lớn thì sóng hình sin càng sạch.
Dạng sine y=sin(x) (x thay đổi giá trị từ 0-360 độ)
VD ta sử dụng 10 bước/bán kỳ. Một nửa bán kỳ sau mình sẽ đảo lại
Vì mình có 10 bước/bán kỳ, nên mình chia nửa dương của sóng sin thành 10 phần. Phần đầu tiên là 0-18 độ, xung tiếp theo ở 36 độ, sau đó là 54 độ, v.v.
Vì vậy, các giá trị mình cần là:
- 1. Sin(0) = 0
- 2. Sin(18)= 0.31
- 3. Sin(36)= 0.59
- 4. Sin(54) = 0.81
- 5. Sin(72)= 0.95
- 6. Sin(90) = 1
- 7. Sin(108) = 0.95
- 8. Sin(126) = 0.81
- 9. Sin(144) = 0.59
- 10. Sin(162) = 0.31
Ta không lấy giá trị điện áp tại sin(180) vì giá trị này sẽ được gọi tiếp khi thực hiện sine(0)=0. Sau khi biết cách tìm các giá trị tại mỗi bước. Bây giờ, làm thế nào để thực hiện điều này bằng PWM?. 1 nghĩa là chu kỳ nhiệm vụ 100%, 0 nghĩa là 0% và 0,5 nghĩa là 50%. Vì vậy, từ bảng trên, mình biết rằng: - 1. Sin(0) = 0%
- 2. Sin(18)= 31%
- 3. Sin(36)= 59%
- 4. Sin(54) = 81%
- 5. Sin(72)= 95%
- 6. Sin(90) = 100%
- 7. Sin(108) = 95%
- 8. Sin(126) = 81%
- Sin(144) = 59%
- 10. Sin(162) = 31%
Bây giờ, mình cần đặt các giá trị này vào một bảng sin thích hợp. Để làm được điều đó, mình cần biết giá trị của PR2. Khoảng thời gian PWM = [(PR2) 1] * 4 * TOSC * (TMR2 Giá trị đặt trước) mình biết, khoảng thời gian PWM, TOSC và giá trị đặt trước, vì vậy đặt giá trị này và sắp xếp lại cho mình, PR2 1 = Khoảng thời gian PWM / (4 * TOSC * {TMR2 Prescale Value}) Do đó, PR2 = [PWM Period / (4 * TOSC * [TMR2 Presca le Value})] – 1 * Công thức bắt nguồn từ đó được đưa ra trong biểu dữ liệu.
Bây giờ, mình cần quyết định xem mình sẽ thực hiện PWM (tần số sóng mang) ở tần số nào. Giả sử, mình có một bộ dao động 16MHz và mình quyết định sử dụng tần số sóng mang là 16kHz. Sau đó, nếu bạn đặt các giá trị vào công thức trên, mình có:
PR2 = [(1 / 16.000) / (4 * [1 / 16.000.000]. * 1] – 1 Cho mình, PR2 = 249
Vì vậy, mình gán 249 cho PR2. Thanh ghi chu kỳ nhiệm vụ là CCPR1L. Khi CCPR1L = 0, chu kỳ nhiệm vụ = 0, khi CCPR1L = (PR2 1), chu kỳ nhiệm vụ = 100%. Điều này là do (PR2 1) =
Chu kỳ
Vì vậy, CCPR1L / (PR2 1) = Chu kỳ hoạt động Vì vậy, bảng:
- 1. Sin(0) = 0%
- 2. Sin(18) = 31%
- 3. Sin(36) = 59%
- 4. Sin(54) = 81%
- 5. Sin(72) = 95%
- 6. Sin(90) = 100%
- 7. Sin(108) = 95%
- 8. Sin(126) = 81%
- 9. Sin(144) = 59%
- 10. Sin(162) = 31%
Có thể được sắp xếp lại như sau:
- 1. Sin(0) = 0* 250
- 2. Sin(18) = 0.31 * 250
- 3. Sin(36) = 0.59 * 250
- 4. Sin(54) = 0.81 * 250
- 5. Sin(72) = 0.95 * 250
- 6. Sin(90) = 1 * 250
- 7. Sin(108) = 0.95 * 250
- 8. Sin(126) = 0.81 * 250
- 9. Sin(144) = 0.59 * 250
- 10. Sin(162) = 0.31 * 250
Ở đây mình nhân với 250 vì 250 là đỉnh của sóng sin [y = sin (x) * 250] với 250 là chu kỳ.
Vì vậy mình có:
- 1. Sin(0) = 0
- 2. Sin(18) = 77.5, take as 77
- 3. Sin(36) = 147.5, take as 147
- 4. Sin(54) = 202.5, take as 202
- 5. Sin(72) = 237.5, take as 237
- 6. Sin(90) = 250
- 7. Sin(108) = 237.5, take as 237
- 8. Sin(126) = 202.5, take as 202
- 9. Sin(144) = 147.5, take as 147
- 10. Sin(162) = 77.5, take as 77
Ở đó, bây giờ mình đã tìm ra bảng sin: [0,77,147,202,237,250,237,202,147,77] Đó là 10 giá trị. Bạn có thể lặp lại quy trình cho bao nhiêu giá trị tùy ý. Bây giờ, làm thế nào để sử dụng điều này để thực hiện sóng sin: PR2 = 249 Ban đầu, CCPR1L = 0
mình cho phép ngắt CCP1, bằng cách ghi một ngắt vào CCP1IE và GIE và PEIE. Ngắt xảy ra vào cuối mỗi chu kỳ, tức là khi TMR2 = PR2, tức là khi TMR2 đếm được 250 bước, tức là 6,25us, tức là ở tần số 16kHz – tần số sóng mang của mình.
mình đặt bảng sin dưới dạng một mảng. Hãy lấy biến là “sinval”.
Vì vậy,
sinval = [0,77,147,202,237,250,237,202,147,77] mình sẽ lấy một biến để hoạt động như chỉ số mảng. Hãy coi đó là “ind”. Ban đầu, ind = 0. mình cũng sẽ sử dụng một biến khác báo hiệu sự kết thúc của chỉ mục. Hãy coi đó là “endi”. mình biết có 10 giá trị, sinval [0] thành sinval [9], vì vậy mình sẽ gán endi 10. Vì vậy, ban đầu, endi = 10
Trong ISR, trước tiên mình sử dụng ind để xác định vị trí hiện tại của mảng. Vì vậy, lúc đầu bao gồm. °. mình gọi sinval với chỉ số là ind. Vì vậy, khi bao gồm cả °, mình gọi sinval [0], là 0. mình chuyển giá trị này cho CCPR1L. Sau đó, mình tăng biến chỉ mục “ind” và so sánh biến này với “endi”. Ind không bằng endi, vì vậy mình tiếp tục. Lặp lại quy trình cho đến khi tất cả được thực hiện.
Vì vậy, khi ind = 9, sinval [9] được gọi. mình đã truy xuất giá trị 77. mình chuyển giá trị này tới CCPR1L. Sau đó, sau khi tăng dần, ind = 10. mình luôn so sánh giá trị với endi. Vì vậy, ind = endi, vì vậy, mình đảo ngược hướng của cầu đầy đủ bằng cách chuyển đổi bit 7 của ECCP1CON, là P1M1 hoặc EPWM1M1.
mình tiếp tục một lần nữa, lần này xóa ind, để mình có lại ind = 0 và khi ind = endi, mình đảo ngược hướng một lần nữa.


Vì vậy, những gì mình đã đạt được là, lúc đầu QA và QD đang bật, mình điều chỉnh theo một hướng, sau đó tắt QA và QD và QB và QC theo hướng khác. Nếu mình sử dụng bộ lọc LC, mình sẽ đạt được sóng hình sin. Nhưng…. Có một điều còn lại. Tần số không phải là 50Hz. Tại sao?
Tần số sóng mang của mình là 16kHz và trong một sóng tổng, mình có 20 mẫu. Vì vậy, tần số là 16/20 = 0,8 kHz = 800Hz.
800Hz là tần số. Vì vậy, chu kỳ là 1,25ms. Đối với 50Hz, mình cần khoảng thời gian là 2Oms. Vì vậy, mình phải kéo dài thời gian của mình (20 / 1,25) = 16 lần. Điều này có thể được thực hiện, bằng cách gửi mỗi mẫu 16 lần, do đó kéo dài khoảng thời gian và do đó, mình có tần số 50Hz.
Điều này có nghĩa là gửi mỗi giá trị của sinval 16 lần trong ISR và sau đó tăng thanh ghi chỉ mục
Vì vậy sinval [0] sẽ được gửi 16 lần, sinval [1] sẽ được gửi 16 lần, sinval [2] 16 lần, v.v. Điều này có nghĩa là, đối với 16 ngắt, cùng một giá trị sẽ được chuyển đến CCPR1L và sau đó “ind” sẽ được tăng lên.
Để làm cho quá trình lấy bảng sin dễ dàng, mình đã viết một phần mềm trong VB có tên là “Sine Wave”. Điều này yêu cầu bạn phải cài đặt .NET framework. Đã cài đặt phiên bản .NET 3 mới nhất. Và bạn có thể dễ dàng có được một bảng sin. Mình sẽ upload phần mềm này miễn phí cho những ai muốn làm bàn sóng sin sử dụng.
Đây là ảnh chụp màn hình:





