Як дасягнуць нулявога працоўнага цыклу ШІМ ў AVR без глюкаў?

Я спрабую выкарыстоўваць апаратны ШІМ на ATmega2560, выкарыстоўваючы TC0 (8-бітны таймер), у рэжыме хуткай ШІМ. Мне трэба, каб дынамічна рэгуляваць цыкл, і гэта ўключае ў сябе нулявой працоўны цыкл. Аднак, гэта не здаецца, лёгка ці нават магчыма. Цытаванне тэхнічнага апісання:

<�Р> Гранічныя значэння для OCR0A рэгістра ўяўляе асаблівыя выпадкі   пры генерацыі выхаднога сігналу ШІМ-сігналу ў рэжыме хуткай ШІМ. Калі   OCR0A усталёўваецца роўным дно, выхад будзе вузкім пікам для   кожны MAX + 1 гадзіны таймер цыклу. Ўстаноўка OCR0A роўнага MAX будзе   прыводзіць да пастаянна высокім або нізкім выхадам (у залежнасці ад палярнасці   выхадны сігнал, усталяваны COM0A1: 0 біт) </р>.

Такім чынам, ўстаноўка OCR0A 0 (= BOTTOM) не будзе на самой справе прывесці да нулявога працоўнага цыклу, і мае тэсты пацвярджаюць гэта. Некаторыя іншыя падыходы павінны быць прынятыя.

Па-першае, я вучыў аб выкарыстанні OCR0A = MAX спецыяльны выпадак, як апісана ў прыведзенай вышэй цытаце. У спалучэнні з часова пераключыцца на перавернуты рэжым, гэта прывядзе да нулявога працоўнага цыклу. Аднак, так як COM0A1: 0 біт ня падвойная буферызацыя (і не сінхранізаваныя з OCR0A), гэта можа прывесці да збою ў выходным сігнале, калі рэжым перамыкаецца ў той час як выхад высокі (ён не застанецца высокім да наступнага перапаўнення ). Гэта не здаецца, усё роўна, у якім парадку змены OCR0A і змяненне рэжыму ажыццяўляецца, як можа глюк.

Я таксама разгледзеў іншае рашэнне, каб выключыць PWM шляхам ўстаноўкі COM0A1: 0 = 0. Гэта адразу ж усталяваць выхад на значэнне ў рэгістры порта, які быў бы роўны нулю. Але ёсць яшчэ праблема вяртання з нулявога выхаду да ненулявога працоўнага цыклу. З таго, што я чытаў у табліцу, усталяваўшы COM0A1: 0 для паўторнага ўключэння ШІМ будзе неадкладна пераключыць выхадны кантакт на выхадзе ШІМ, які можа быць няправільнае значэнне да наступнага параўнання супадзення ці таймера перапаўнення. Такім чынам, глюк.

Інверсія ШІМ ў агульным заліку можа быць скарыстаная, але тады праблема толькі становіцца дасягненне поўнага працоўнага цыклу, з сіметрычнымі пытанняў.

Звярніце ўвагу, што гэта не магчыма, каб пакінуць генерацыю ШІМ-сігналу уключаны, змушаючы выхад штыфта праз порт, як апісана ў спецыфікацыі:

<�Р> Параўнаць Рэжым высновы (COM0x1: 0) біты маюць дзве функцыі.   Генератар сігналаў выкарыстоўвае COM0x1: 0 біт для вызначэння выхаднога   Параўнаць (OC0x) стан на наступным Compare Match. Акрамя таго, COM0x1: 0   біты кіравання крыніцай выхадны кантактны OC0x. </р>

Там няма ніякага спосабу, каб дазволіць PWM працаваць на працягу цыкла або так і пераключыцца на яго, калі ён будзе гатовы - уключэнне PWM неадкладна прымушае выхадны кантакт.

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
Я не ведаю гэта прылада, так што гэта агульная прапанова, але ёсць розніца апаратных сродкаў у адключэнні Шэга шляху ўстаноўкі COM0A1: 0 = 0 і адключыць перапыненне таймера, якое выклікае змену ў выхадзе? Калі так, то мне цікава, ці можна пакінуць PWM уключаны, але адключыць перапынення пры нізкім выхадзе, што дазваляе змяніць працоўны цыкл, які не будзе відавочным, пакуль перапыненне таймера не будзе зноў уключаны?
дададзена аўтар Ed King, крыніца
Спрабавалі Ці вы паэтапным правільна PWM? Гэта не праблема шыпа. Ён апісваецца крыху далей у тэхнічным апісанні.
дададзена аўтар UncleO, крыніца
Спрабавалі Ці вы паэтапным правільна PWM? Гэта не праблема шыпа. Ён апісваецца крыху далей у тэхнічным апісанні.
дададзена аўтар UncleO, крыніца
перапынення @EdKing таймера не павінны быць ўцягнутыя, што ўся ідэя апаратнага ШІМ. Сам апаратнае забеспячэнне абнаўляе выхадны кантакт, праграмнае забеспячэнне толькі змяняе цыкл. Глядзіце маё абнаўленне ў пытанні аб'явы канца.
дададзена аўтар Ambroz Bizjak, крыніца
Акрамя таго, гэта, верагодна, адносіцца і да большасці ATmega фішак, а не толькі 2560.
дададзена аўтар Ambroz Bizjak, крыніца
Акрамя таго, гэта, верагодна, адносіцца і да большасці ATmega фішак, а не толькі 2560.
дададзена аўтар Ambroz Bizjak, крыніца
@UncleO Так, рэжым фазавага правільна працуе, на шчасце.
дададзена аўтар Ambroz Bizjak, крыніца
@UncleO Так, рэжым фазавага правільна працуе, на шчасце.
дададзена аўтар Ambroz Bizjak, крыніца

11 адказы

у вас ёсць два варыянты:

  1. Калі вы карыстаецеся хуткі ШІМ: вы можаце выкарыстоўваць інвертаваны ШІМ. усё, што вам трэба зрабіць, гэта ўсталяваць OC Pins ў рэжым зваротнага і інвертаваць ШІМ параўнання значэнняў. Аднак - зараз у вас ёсць глюкі з 100% рабочым цыклам

  2. <�р> выкарыстоўваць фазавую правільны ШІМ. адшмаргнуць з'яўляецца тое, што ў два разы максімальная частата.
2
дададзена

у вас ёсць два варыянты:

  1. Калі вы карыстаецеся хуткі ШІМ: вы можаце выкарыстоўваць інвертаваны ШІМ. усё, што вам трэба зрабіць, гэта ўсталяваць OC Pins ў рэжым зваротнага і інвертаваць ШІМ параўнання значэнняў. Аднак - зараз у вас ёсць глюкі з 100% рабочым цыклам

  2. <�р> выкарыстоўваць фазавую правільны ШІМ. адшмаргнуць з'яўляецца тое, што ў два разы максімальная частата.
2
дададзена

у вас ёсць два варыянты:

  1. Калі вы карыстаецеся хуткі ШІМ: вы можаце выкарыстоўваць інвертаваны ШІМ. усё, што вам трэба зрабіць, гэта ўсталяваць OC Pins ў рэжым зваротнага і інвертаваць ШІМ параўнання значэнняў. Аднак - зараз у вас ёсць глюкі з 100% рабочым цыклам

  2. <�р> выкарыстоўваць фазавую правільны ШІМ. адшмаргнуць з'яўляецца тое, што ў два разы максімальная частата.
2
дададзена

Я толькі што прыйшоў праз тое ж самае пытанне, але трэба прытрымлівацца хуткай налады PWM на ATmega2560.

Рашэнне, якое я знайшоў, было часова змясціць выхадны кантакт у нармальным рэжым працы порта (гэта значыць усталяваць COMnX1 і COMnX1 біты TCCRnA рэгістр нуль, калі цыкл нулявы пошліны патрабуецца:

TCCR1A &= (0<<

2
дададзена

Існуе яшчэ адзін варыянт, проста змяніць кірунак штырьковый ўвесці наступным чынам:

DDRB &= ~(1<

..when вы хочаце дасягнуць нулявога працоўнага цыклу. Я ведаю, што гэта свайго роду хак, а часам гэта не пажадана, каб выканаць такую ​​рэч, але ў любым выпадку гэта працуе.

0
дададзена
Ну, вы маеце рацыю, з дапамогай гэтага метаду вы павінны цягнуць ўніз
дададзена аўтар Adrian Adamczyk, крыніца
Гэта не тое ж самае, таму што штыфт затым не гоняць. Я мяркую, гэта дастасавальна, калі ў вас ёсць выпадальнае меню, хоць.
дададзена аўтар Ambroz Bizjak, крыніца

Існуе яшчэ адзін варыянт, проста змяніць кірунак штырьковый ўвесці наступным чынам:

DDRB &= ~(1<

..when вы хочаце дасягнуць нулявога працоўнага цыклу. Я ведаю, што гэта свайго роду хак, а часам гэта не пажадана, каб выканаць такую ​​рэч, але ў любым выпадку гэта працуе.

0
дададзена
Ну, вы маеце рацыю, з дапамогай гэтага метаду вы павінны цягнуць ўніз
дададзена аўтар Adrian Adamczyk, крыніца
Гэта не тое ж самае, таму што штыфт затым не гоняць. Я мяркую, гэта дастасавальна, калі ў вас ёсць выпадальнае меню, хоць.
дададзена аўтар Ambroz Bizjak, крыніца

Існуе яшчэ адзін варыянт, проста змяніць кірунак штырьковый ўвесці наступным чынам:

DDRB &= ~(1<

..when вы хочаце дасягнуць нулявога працоўнага цыклу. Я ведаю, што гэта свайго роду хак, а часам гэта не пажадана, каб выканаць такую ​​рэч, але ў любым выпадку гэта працуе.

0
дададзена
Ну, вы маеце рацыю, з дапамогай гэтага метаду вы павінны цягнуць ўніз
дададзена аўтар Adrian Adamczyk, крыніца
Гэта не тое ж самае, таму што штыфт затым не гоняць. Я мяркую, гэта дастасавальна, калі ў вас ёсць выпадальнае меню, хоць.
дададзена аўтар Ambroz Bizjak, крыніца

У хуткім рэжыме ШІМ, цыкл складае: (OCRx + 1)/(TOP + 1) * 100% Такім чынам, вы ніколі не можаце атрымаць да 0% у неинвертирующий рэжыме і ніколі не 100% у рэжыме інвертавання.

0
дададзена

У хуткім рэжыме ШІМ, цыкл складае: (OCRx + 1)/(TOP + 1) * 100% Такім чынам, вы ніколі не можаце атрымаць да 0% у неинвертирующий рэжыме і ніколі не 100% у рэжыме інвертавання.

0
дададзена

У хуткім рэжыме ШІМ, цыкл складае: (OCRx + 1)/(TOP + 1) * 100% Такім чынам, вы ніколі не можаце атрымаць да 0% у неинвертирующий рэжыме і ніколі не 100% у рэжыме інвертавання.

0
дададзена

У хуткім рэжыме ШІМ, цыкл складае: (OCRx + 1)/(TOP + 1) * 100% Такім чынам, вы ніколі не можаце атрымаць да 0% у неинвертирующий рэжыме і ніколі не 100% у рэжыме інвертавання.

0
дададзена