Ви не увійшли.
Дійсно, в режимах, де ICRn використовується як TOP, він не оновлюється автоматично. Тоді так, на одному 16-бітному таймері можна зробити два канала з довільною частотою. Для FastPWM це режим 14.
GmmC пише:можливо одночасно буде реалізувати також шім по двух чи одному каналу?
На одному таймері з довільною частотою два канала не вийде: у таймера два регістра-компаратора, і один із них використовується або як один із каналів ШІМ, або для керування частотою.
Подивіться режими, коли верхня межа лічильника задається регістром ICR, тоді обидва регістри-компаратори доступні для ШІМ.
можливо одночасно буде реалізувати також шім по двух чи одному каналу?
На одному таймері з довільною частотою два канала не вийде: у таймера два регістра-компаратора, і один із них використовується або як один із каналів ШІМ, або для керування частотою.
Є наступні варіанти:
1) Один таймер, два канала, фіксований набір частот. Для 16-бітного таймера максимальна частота 16 МГц / 65536 ≈ 244 Гц, решта нижчі. Для 8-бітного 62500 Гц, 7812.5 Гц і т.д, тобто 16 МГц / 256 і дільниками 1, 8, 64, 256, 1024 для TC0. Для TC2 також доступні дільники 32 і 128.
2) Два таймера, по одному на кожний канал. Для точного налаштування фази їх потрібно буде синхронізувати, наприклад, задаючи різні початкові значення TCCNT.
3) Таймер в режимі лічильника, з вимкненим Compare Output. Програмно опитувати TCCNT в циклі і відповідно смикати GPIO. Звернути увагу на можливі ґлітчі при взаємодії з UI та зміні параметрів.
4) Взагалі без таймерів, генерувати затримки програмно, смикати GPIO. Для досягнення хорошої точності прийдеться вираховувати час виконання окремих інструкцій. Сумістити це з UI - той ще челендж.
Частота 32 кГц при тактовій 16 МГц доступна точно: це рівно 500 тіків. Наступна досяжна нижча частота буде при дільнику 501: [16e3/501] = 31936 Гц. Якщо округлювати задану користувачем частоту до найближчої досяжної, то відносна похибка виходить ≈ 0.1%. У китайських модулів заявлено 2%
Якщо така точність задовільняє, то можна обійтись FastPWM режимом 16-бітного таймера.
Дякую, всё чітко і доступно. Я через FastPWM і вирішив питання, похибка дійсно мінімальна як показав ,,ослик,,
Такі показники мене ідеально влаштовують.
А ще не підкажете, потрібно буде двух канальний генератор з можливість здвиг фаз, скетч знайшов займуся. А питання, чи можливо одночасно буде реалізувати також шім по двух чи одному каналу?
Частота 32 кГц при тактовій 16 МГц доступна точно: це рівно 500 тіків. Наступна досяжна нижча частота буде при дільнику 501: [16e3/501] = 31936 Гц. Якщо округлювати задану користувачем частоту до найближчої досяжної, то відносна похибка виходить ≈ 0.1%. У китайських модулів заявлено 2%
Якщо така точність задовільняє, то можна обійтись FastPWM режимом 16-бітного таймера.
Для нижчих частот вмикати апаратний дільник таймера (prescaler), щоб не переповнювався 16-бітний лічильник. Розрахувати діапазони для зміни дільника, щоб зберегти баланс між похибкою по частоті і по коефіцієнту заповнення.
Також для 100% заповнення (або для 0% в інверсному режимі) вимикати керування піном по таймеру і виставляти відповідне значення через GPIO.
Доречі, на деяких платах ардуіно зустрічаються Atmega328PB (хоча марковані як 328P). У них є два додаткових 16-бітних таймера з окремим прескалером (а також додаткові UART, SPI, I2C).
Honey пише:Частоту і коефіцієнт заповнення ШІМ на AVR не вийде встановлювати абсолютно довільно
Для невиликих частот можна генерувати ШІМ програмно з раціональним дільником, в певних межах точності.
Питання в тому, чи хоче ТС розібратись сам, чи чекає на готове рішення.
Ні в якому разі я не хотів, щоб за мене писали, я хочу сам розібратися. Так, після перечитаної інформації є результат, як раз і невеликі частоти і точність можлива з відхиленням, звісно, що такі питання для точних значень контролери не вирішують. Допишу в код екран і готово. Дякую
Частоту і коефіцієнт заповнення ШІМ на AVR не вийде встановлювати абсолютно довільно
Для невиликих частот можна генерувати ШІМ програмно з раціональним дільником, в певних межах точності.
Питання в тому, чи хоче ТС розібратись сам, чи чекає на готове рішення.
Частоту і коефіцієнт заповнення ШІМ на AVR не вийде встановлювати абсолютно довільно, лише ось такі дискретні значення:
Частота: f=16MHz/N, де N=1..65536
Коеф.заповнення: d=n/N, де N - те ж саме, яке використано для підбору частоти, n=0..N
Доброго дня шановні.
Багато хто в курсі про китайський модуль pwm-generator-150khz
Дуже потрібна допомога з кодом для atmega 328 (аналог роботи цього модуля)щоб не використовувати модуль, і навіть не потрібна максимальна частота вистачить 32кГц, але потрібно можливість регулювання частоти і шім.
Буду вдячний любій інформації. Дякую