Trích:
Nguyên văn bởi conglong
Em đã đọc datasheet dsPIC30f2010 phần PWM rồi , em hiểu là dutycycle là khoảng phần trăm thời gian HIGHT trong một chu kỳ phần đối với chân PWMxH , còn đối với PWMxL thì dutycycle lại là khoảng phần trăm thời gian LOW (với giả sử deadtime = 0), nhưng khi vào làm thực tế , cụ thể là ví dụ 5.1 của thấy :
Em dùng biến trở chỉnh điện áp tại chân RB0(AN0) là 1V thì theo lí thuyết , khi đó giá trị mình thu được tại thanh ghi ADCBUF0 là: 1x(2^10 - 1) / 5 = 204.6 hay là 11001101B sau lệnh dịch bit qua phải và gắn vào giá trị này vào PDC1 thì PDC1 = 102, mà duty_cycle = 2 * PDC1 / PTPER, mà ở đây PTPER = Fcy/Fpwm - 1 , với Fcy= 10Mhz ( do em dung thạch anh ngoài 10Mhz với PLL_4), Fpwm = 40Khz => PTPER = 249
Vậy duty_cycle = 2 * 102 / 249 = 0.8193 = 81.93 %, do đó khi dùng VOM để đo trên chân PWML ( RE0 ) thì điện áp DC phải là : (1 - 0.8193 ) * 5V = 0.9035 V.
Mà em đo thực tế lại là : 3.1 V !!!!
Em hiểu như vậy có đúng không Thầy , hay lỗi do đâu thầy ?
Em cảm ơn .
Trân trọng !.
|
Bạn hiểu nhầm về công thức tính duty cycle. Xét ví dụ 5-1 trong tutorial của tôi, tôi đã chú thích giá trị duty cycle ứng với giá trị PTPER = 199 (Fcy/Fpwm - 1 = 8000000/40000 - 1). Với chu kỳ đếm 200, giá trị 0x64 = 100 mà tôi đặt vào các thanh ghi PDCx lại chỉ cho duty cycle = 25%, không rõ bạn có chú ý điểm này hay không.
Với PWM timer chạy ở chế độ free-running (như trong ví dụ của tôi đã thiết lập), công thức tính duty cycle như sau:
duty_cycle = PDCx/((PTPER + 1)*2)
Do đó, với các thông số mà bạn đã thiết lập, bạn sẽ có duty cycle của chân PWM1H là 102/((249 + 1)*2) = 20.4 %, và duty cycle của chân PWM1L sẽ là 100 - 20.4 = 79.6 %, tương ứng với khoảng 4 V, nếu hoàn toàn không có dead time. Có lẽ kết quả chuyển đổi A/D là khác với giá trị 204 hay 205 đang dùng để tính toán ở đây.
Thân,