AVR-da nol ishlaydigan PWM-ni guruchsiz qanday qilib olish mumkin?

Tez PWM rejimida TC0 (8-bit taymer) dan foydalanib, ATmega2560 qurilmasidagi PWM apparatidan foydalanishga harakat qilaman. Ish burchini dinamik ravishda o'zgartirish kerak, bu esa nol ishlaydigan davrni o'z ichiga oladi. Biroq, bu oson yoki hatto mumkin emas. Ma'lumot sahifasini quydagicha qo'yish:

OCR0A Register uchun haddan tashqari qiymatlar maxsus holatlardir   tez PWM rejimida PWM to'lqinlari chiqishi hosil qilganda. Agar   OCR0A BOTTOM ga teng bo'lib, chiqishi uchun tor oshish bo'ladi   har bir MAX + 1 taymer vaqti aylanishi. OCR0A-ni MAXga teng darajada sozlash   doimiy ravishda yuqori yoki past chiqishga olib keladi (polariteye qarab   (COM0A1: 0 bit) tomonidan o'rnatilgan chiqdi.

Shunday qilib, OCR0A-ni 0 (= BOTTOM) -ga sozlash aslida nolinchi ish aylanishiga olib kelmaydi va testim buni tasdiqlaydi. Boshqa ba'zi yondashuvlar kerak.

Birinchidan, yuqoridagi taklifda aytib o'tilgan OCR0A = MAX maxsus ishni ishlatish haqida o'qidim. Vaqtincha teskari tartibga o'tish bilan birlashtirilib, bu nol ishlaydigan davriy tartibga keltiradi. Biroq, COM0A1: 0 bit juft tamponlanmagan (va OCR0A bilan sinxronlashtirilmagan) bo'lgani uchun, bu chiqish chiqishi yuqori bo'lsa, (agar u keyingi toshib ketmaguncha yuqori bo'ladi) ). OCR0A o'zgarishi va tartibni o'zgartirish qanday amalga oshirilishi ahamiyatga ega emas.

Men COM0A1: 0 = 0 ni o'rnatib, PWMni o'chirish uchun yana bir yechimni ko'rib chiqdim. Bu darhol chiqishni PORT registrga kiritadi, bu esa nolga teng bo'ladi. Ammo noldan chiqadigan nolga ishlov berish aylanishiga qaytib ketish muammosi hali ham mavjud. Ma'lumotlar sahifasida o'qiganimdan boshlab, PWMni qayta yoqish uchun COM0A1: 0 sozlamasi darhol chiqish pinini PWM ning chiqishiga o'tkaziladi va bu keyingi taqqoslash yoki taymerni to'ldirishga qadar noto'g'ri qiymat bo'lishi mumkin. Shuning uchun, bir glitch.

PWMning umumiy qiymatini o'zgartirishga to'g'ri kelishi mumkin, ammo keyinchalik nosimmetrik masalalar bilan to'la vazifa aylanishiga erishiladi.

Ma'lumotlar sahifasida qayd etilganidek, pin orqali chiqish pinini majburan chiqarishda PWM to'lqin shaklini yoqish mumkin emas:

solishtirish Chiqish tartibi (COM0x1: 0) bitlari ikkita funktsiyaga ega. Ushbu   Waveform Generator Chiqishni aniqlash uchun COM0x1: 0 bitidan foydalanadi   Keyingi solishtirishda (OC0x) holatini solishtiring. Bundan tashqari, COM0x1: 0   bitlar OC0x pin chiqish manbasini nazorat qiladi.

PWM-ning aylanish jarayoniga ruxsat berishning imkoni yo'q va u tayyor bo'lgach, unga o'tish - PWM ni pinli chiqishni darhol kuchaytirishi mumkin.

UPDATE. The phase-correct (center-aligned) PWM mode does not have this issue, and in my case is acceptable. I have tried it and confirmed that it works for both zero and full duty cycle.

6
Men ushbu qurilma haqida xabardor emasman, shuning uchun bu umumiy taklifdir, lekin COM0A1: 0 = 0 sozlash va POP o'zgarishlarini o'chirishda apparat almashinuvi mavjudmi? Agar shunday bo'lsa, siz PWM yoqilganligini qoldirib ketishingiz mumkinmi, ammo chiqdi kam bo'lsa, intervalni o'chirib qo'yishingiz mumkinmi, vaqtni to'xtatish qayta yoqilguncha ko'rinmay qoladigan vazifa aylanishini o'zgartira olasizmi?
qo'shib qo'ydi muallif Ed King, manba
FVMga o'zgarishlar to'g'riligini sinab ko'rdingizmi? Bo'shashish muammosi yo'q. Ma'lumotlar sahifasida bir oz ko'proq tasvirlangan.
qo'shib qo'ydi muallif UncleO, manba
FVMga o'zgarishlar to'g'riligini sinab ko'rdingizmi? Bo'shashish muammosi yo'q. Ma'lumotlar sahifasida bir oz ko'proq tasvirlangan.
qo'shib qo'ydi muallif UncleO, manba
@EdKing Timer intervaltsiga aloqador emas, bu PWM apparatining butun fikri. Uskuna o'zi pinli chiqishni yangilaydi, dasturiy ta'minot faqat vazifa aylanishini o'zgartiradi. So'rovnomadagi so'nggi yangilanishni ko'ring.
qo'shib qo'ydi muallif Ambroz Bizjak, manba
Bundan tashqari, bu, ehtimol, faqat 2560 emas, balki ko'p ATmega chiplari uchun ham amal qiladi.
qo'shib qo'ydi muallif Ambroz Bizjak, manba
Bundan tashqari, bu, ehtimol, faqat 2560 emas, balki ko'p ATmega chiplari uchun ham amal qiladi.
qo'shib qo'ydi muallif Ambroz Bizjak, manba
@UncleO Ha, bosqichma-bosqich to'g'ri ishlaydi, minnatdorchilik bilan.
qo'shib qo'ydi muallif Ambroz Bizjak, manba
@UncleO Ha, bosqichma-bosqich to'g'ri ishlaydi, minnatdorchilik bilan.
qo'shib qo'ydi muallif Ambroz Bizjak, manba

11 javoblar

ikkita variant bor:

  1. Agar tez pwm dan foydalansangiz: teskari pwm dan foydalanishingiz mumkin. Barcha qilishingiz kerak, OC Pins-ni teskari tartibga solish va pwm solishtirish qiymatlarini o'zgartirish. ammo siz endi 100% vazifa aylanishiga ega bo'lgan glitchesingiz bor.

  2. fazani to'g'ri pwm dan foydalaning. eng ko'p chastota ikki barobarga qisqaradi.

2
qo'shib qo'ydi

ikkita variant bor:

  1. Agar tez pwm dan foydalansangiz: teskari pwm dan foydalanishingiz mumkin. Barcha qilishingiz kerak, OC Pins-ni teskari tartibga solish va pwm solishtirish qiymatlarini o'zgartirish. ammo siz endi 100% vazifa aylanishiga ega bo'lgan glitchesingiz bor.

  2. fazani to'g'ri pwm dan foydalaning. eng ko'p chastota ikki barobarga qisqaradi.

2
qo'shib qo'ydi

ikkita variant bor:

  1. Agar tez pwm dan foydalansangiz: teskari pwm dan foydalanishingiz mumkin. Barcha qilishingiz kerak, OC Pins-ni teskari tartibga solish va pwm solishtirish qiymatlarini o'zgartirish. ammo siz endi 100% vazifa aylanishiga ega bo'lgan glitchesingiz bor.

  2. fazani to'g'ri pwm dan foydalaning. eng ko'p chastota ikki barobarga qisqaradi.

2
qo'shib qo'ydi

Men faqat shu masala bo'yicha kelgan edim, ammo atmega2560da tez PWM sozlamalari bilan yopishim kerak edi.

Topilgan yechim, chiqish pinini an'anaviy port ishiga vaqtincha qo'yish (masalan, nol ishlaydigan davr zarur bo'lganda TCCRnA reestrining COMnX1 va COMnX1 bitlarini nolga qo'yishdir:

TCCR1A &= (0<<

2
qo'shib qo'ydi

Boshqa variant ham bor, shunda bu kabi kiritish uchun pin yo'nalishini o'zgartiring:

DDRB &= ~(1<

.. nol ishlaydigan davrga erishmoqchi bo'lsangiz. Men buni birorta xakikat deb bilaman va ba'zan bunday narsalarni bajarishni istamaysiz, lekin baribir u ishlaydi.

0
qo'shib qo'ydi
Xo'sh, siz to'g'ri deb hisoblaysiz, bu usul bilan siz pastga tushishingiz kerak
qo'shib qo'ydi muallif Adrian Adamczyk, manba
Bu bir xil emas, chunki pin keyinchalik boshqarilmayapti. O'ylaymanki, u sizni pastga tushganda ham qo'llanishi mumkin.
qo'shib qo'ydi muallif Ambroz Bizjak, manba

Boshqa variant ham bor, shunda bu kabi kiritish uchun pin yo'nalishini o'zgartiring:

DDRB &= ~(1<

.. nol ishlaydigan davrga erishmoqchi bo'lsangiz. Men buni birorta xakikat deb bilaman va ba'zan bunday narsalarni bajarishni istamaysiz, lekin baribir u ishlaydi.

0
qo'shib qo'ydi
Xo'sh, siz to'g'ri deb hisoblaysiz, bu usul bilan siz pastga tushishingiz kerak
qo'shib qo'ydi muallif Adrian Adamczyk, manba
Bu bir xil emas, chunki pin keyinchalik boshqarilmayapti. O'ylaymanki, u sizni pastga tushganda ham qo'llanishi mumkin.
qo'shib qo'ydi muallif Ambroz Bizjak, manba

Boshqa variant ham bor, shunda bu kabi kiritish uchun pin yo'nalishini o'zgartiring:

DDRB &= ~(1<

.. nol ishlaydigan davrga erishmoqchi bo'lsangiz. Men buni birorta xakikat deb bilaman va ba'zan bunday narsalarni bajarishni istamaysiz, lekin baribir u ishlaydi.

0
qo'shib qo'ydi
Xo'sh, siz to'g'ri deb hisoblaysiz, bu usul bilan siz pastga tushishingiz kerak
qo'shib qo'ydi muallif Adrian Adamczyk, manba
Bu bir xil emas, chunki pin keyinchalik boshqarilmayapti. O'ylaymanki, u sizni pastga tushganda ham qo'llanishi mumkin.
qo'shib qo'ydi muallif Ambroz Bizjak, manba

Tez pwm rejimida vazifa aylanishi quyidagilardan iborat: (OCRx + 1)/(TOP + 1) * 100% Shunday qilib, noinverting rejimida 0% va hech qachon inverting rejimida 100% ga erisha olmaysiz.

0
qo'shib qo'ydi

Tez pwm rejimida vazifa aylanishi quyidagilardan iborat: (OCRx + 1)/(TOP + 1) * 100% Shunday qilib, noinverting rejimida 0% va hech qachon inverting rejimida 100% ga erisha olmaysiz.

0
qo'shib qo'ydi

Tez pwm rejimida vazifa aylanishi quyidagilardan iborat: (OCRx + 1)/(TOP + 1) * 100% Shunday qilib, noinverting rejimida 0% va hech qachon inverting rejimida 100% ga erisha olmaysiz.

0
qo'shib qo'ydi

Tez pwm rejimida vazifa aylanishi quyidagilardan iborat: (OCRx + 1)/(TOP + 1) * 100% Shunday qilib, noinverting rejimida 0% va hech qachon inverting rejimida 100% ga erisha olmaysiz.

0
qo'shib qo'ydi