ต้องการ PWM 3 channels พร้อมกัน

Started by samira, February 19, 2013, 03:15:48 AM

Previous topic - Next topic

samira

ขอถามกูรูทั้งหลายหน่อยครับ

ผมมีความจำเป็นต้องใช้  PWM 3 channels.
ไปเปิดดู ใน atmega 48 (ถูกตังหน่อย ว่าจะใช้ attiny 44/45 มีไม่พอให้ใช้ ) พบว่า มี pwm ให้ใช้ 6 channels

จะใช้ Fast PWM mode
ไปที่ Timer/counter0 มันให้ใช้
ที่ COM0A0/A1 ได้ 1 channel
ที่ COM0B0/B1 ได้อีก 1 channel

สงสัยว่า ผมจะใช้พร้อมกันได้หรือเปล่าครับ ยังไม่เคยลอง
ก่อนจะลุยเอง...... อยากจะถามผู้ที่เคยเล่นก่อนว่า

"ใช้พร้อมกันได้หรือเปล่า" โดยอาศัยจาก Timer/counter เดียวกัน
( ในที่นี้คือ Timer/Counter0 โดยจะเปิดใช้ com0a & com0b พร้อมกัน และใช้ pwm ค่าต่างกัน ) 
เคยเล่นแต่ ช่องเดียว ไม่เคยใช้ ทีละมากกว่า หนึ่งช่อง

หากได้ เหลืออีก channel คงต้องไปเอามาจาก Timer/Counter2  8 bits เช่นกัน

ขอบคุณสำหรับคำแนะนำ/ชี้แนะ
" If you're born poor, it's not your mistake. But if you die poor, it's your mistake"
Bill Gates.

firmware.c

ได้ครับครับ แต่ความถี่ต้องเหมือนกัน duty แต่ละ Chanel ปรบเปลี่ยนอิสระโดย OCxA, OCxB, OCxC
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+

crywolf

ถ้าใช้ attiny 45 สามารถใช้ Software PWM ได้ครับ ได้ถึง 6 Channel
ลองดู Application Note (AVR136) ของ ATMEL นะครับ มีตัวอย่าง Code ด้วย


JMew

ฉันเอา 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
โครงการกะเทยท่องโลก

AppleIIe

ในความเห็นผม
ถ้าความถี่สูงๆหน่อย ใช้ Hardware ที่เป็น PWM จะดีกว่าครับ (ไม่กินแรง CPU เลย เพราะให้่ Hardware ทำงานไปอย่าง อิสระ อาจต้อง Syncronize บ้างตอนเปลี่ยนค่า)
แต่ถ้าความถี่ไม่สูงนัก ใช้ Software อย่างที่ท่าน Crywolf ได้แนะนำไว้ก็ได้ครับ จะกินแรง CPU นิดหน่อย เพราะต้อง interrupt cpu เป็นระยะ แต่ได้ช่องมากแน่นอน
http://www.atmel.com/Images/doc8020.pdf
http://howaboutanorange.com/avrpwm
http://jeelabs.org/2010/10/03/software-pwm-at-1-khz

อันนี้ เขาคุยกันเรื่อง PWM HW/SW
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=107185&start=0
"Stay Hungry, Stay Foolish"
จงกระหาย และ ทำตัวโง่ให้ตลอดเวลา
"Innovation distinguishes between a leader and a follower."
นวัตกรรมแยกผู้นำกับผู้ตามออกจากกัน

คนฉลาด...ต้องโง่เป็น คนโง่ไม่เป็น...จะไม่มีทางฉลาด

AppleIIe

Quote from: samira on February 19, 2013, 03:15:48 AM
ขอถามกูรูทั้งหลายหน่อยครับ

ผมมีความจำเป็นต้องใช้  PWM 3 channels.
ไปเปิดดู ใน atmega 48 (ถูกตังหน่อย ว่าจะใช้ attiny 44/45 มีไม่พอให้ใช้ ) พบว่า มี pwm ให้ใช้ 6 channels

จะใช้ Fast PWM mode
ไปที่ Timer/counter0 มันให้ใช้
ที่ COM0A0/A1 ได้ 1 channel
ที่ COM0B0/B1 ได้อีก 1 channel

สงสัยว่า ผมจะใช้พร้อมกันได้หรือเปล่าครับ ยังไม่เคยลอง
ก่อนจะลุยเอง...... อยากจะถามผู้ที่เคยเล่นก่อนว่า

"ใช้พร้อมกันได้หรือเปล่า" โดยอาศัยจาก Timer/counter เดียวกัน
( ในที่นี้คือ Timer/Counter0 โดยจะเปิดใช้ com0a & com0b พร้อมกัน และใช้ pwm ค่าต่างกัน ) 
เคยเล่นแต่ ช่องเดียว ไม่เคยใช้ ทีละมากกว่า หนึ่งช่อง

หากได้ เหลืออีก channel คงต้องไปเอามาจาก Timer/Counter2  8 bits เช่นกัน

ขอบคุณสำหรับคำแนะนำ/ชี้แนะ

ขอตอบ สำหรับ atmega48 นะครับ

Q: "ใช้พร้อมกันได้หรือเปล่า" โดยอาศัยจาก Timer/counter เดียวกัน
( ในที่นี้คือ Timer/Counter0 โดยจะเปิดใช้ com0a & com0b พร้อมกัน และใช้ pwm ค่าต่างกัน ) 
เคยเล่นแต่ ช่องเดียว ไม่เคยใช้ ทีละมากกว่า หนึ่งช่อง


A: ใช้พร้อมกันได้ครับ ตั้งที่ OCR0A และ OCR0B ของ Timer 0 ได้เลย

Q: หากได้ เหลืออีก channel คงต้องไปเอามาจาก Timer/Counter2  8 bits เช่นกัน

A : ใช้ที่ Timer 2 ก็ได้ครับ ตั้งที่ OCR2A และ OCR2B เป็็นของ Timer 2 ครับ

"Stay Hungry, Stay Foolish"
จงกระหาย และ ทำตัวโง่ให้ตลอดเวลา
"Innovation distinguishes between a leader and a follower."
นวัตกรรมแยกผู้นำกับผู้ตามออกจากกัน

คนฉลาด...ต้องโง่เป็น คนโง่ไม่เป็น...จะไม่มีทางฉลาด

samira

ขอขอบคุณทุกท่านที่มาชี้แนะ และ อธิบายครับ

คิดว่าคงจะใช้ ความถี่เดียวกันครับ
ผมต้องการเอาไปคุม พัดลม ( เล็กๆ ) 3 ตัว ด้วยความเร็วไม่เท่ากัน 

ส่วน channel 3 คงต้องไปเอามาจาก timer/counter2

ครับ attiny45 ใช้ได้ ผมดูผิด อ่านเร็วไปเอง ขอบคุณมากครับ ท่าน crywolf

คงต้องศึกษาตัวอย่างที่ อ. Jmew เอามาแสดง น่าสนใจ ขอบคุณครับ

ต่อไปนี้ ก็ลุย................................
" If you're born poor, it's not your mistake. But if you die poor, it's your mistake"
Bill Gates.

firmware.c

Soft PWM ทำได้ครับหาก load CPU ไม่เยอะมาก avr atmega ไม่มี multiple interrupt โดย hardware
IAR Embedded Workbench for ARM
AVR-Studio + AVR-GCC
CodeBlocks + MinGw
CodeBlocks + Gtk+