ฉันเอา Timer0 มานับค่ะ ตั้งแต่ 0-255 เสร็จแล้วในรูทีน Timer ฉันเอา Array ของแต่ละขามารับเอา
สมมติจะเอาออกที่พอร์ต B จำนวน 8 Channel ก็ทำได้ (แต่ต้องที่ความถี่เดียวกัน)
ตัวอย่างเช่น อยากให้พอร์ต B0 ถึง B7 เป็น PW(0) ถึง PW(7) แล้วเอาสัญญาณออกช่องนี้ด้วยความถี่เดียวกัน แต่ duty ต่างกัน ทำแบบนี้นะคะ
Dim Pw(7) as Byte
Dim Tik as Byte
Config Timer0 = Timer, Prescale=8 '<<<< ตรงนี้เปลี่ยนความถี่ได้ค่ะ
Enable Interrupts
Enable Timer0
On Timer0 Pwms
Start Timer0
Pw(0)=1 'กำหนด Duty cycle ของแต่ละ Channel ตรงนี้นะคะ
Pw(1)=7 'กำหนด Duty cycle ตรงนี้นะคะ
Pw(2)=15 'กำหนด Duty cycle ตรงนี้นะคะ
Pw(3)=31 'กำหนด Duty cycle ตรงนี้นะคะ
Pw(4)=63 'กำหนด Duty cycle ตรงนี้นะคะ
Pw(5)=127 'กำหนด Duty cycle ตรงนี้นะคะ
Pw(6)=255 'กำหนด Duty cycle ตรงนี้นะคะ
Pw(7)=0 'กำหนด Duty cycle ตรงนี้นะคะ
Pwms:
Incr Tik
If Tik = 255 Then
Tik = 0
Portb = 0
End If
If Tik > Pw(7) Then PortB.7 = 1
If Tik > Pw(6) Then PortB.6 = 1
If Tik > Pw(5) Then PortB.5 = 1
If Tik > Pw(4) Then PortB.4 = 1
If Tik > Pw(3) Then PortB.3 = 1
If Tik > Pw(2) Then PortB.2 = 1
If Tik > Pw(1) Then PortB.1 = 1
If Tik > Pw(0) Then PortB.0 = 1
Return
แบบนี้จะได้ PWM ตั้ง 8 ช่องที่ความถี่เดียวกัน แต่ Duty ไม่ซ้ำกันเลย

ส่วนนี่ Code + HEX + Proteus DSN ค่ะ
http://cmu.mine.nu/teach/avr/pwm