Генератор сигналів змінної частоти

з кроком 5Гц цілком реально.
беремо 16F873A. осцилятор на 20МГц
налаштовуємо РСР1 на порівняння.
складаємо таблицю частот за формулою
N = 5 * 10 ^ 6 / (2 * Fвих)
ті для 1кГц N = 2500 в регістр порівняння пишемо = 2500, в лічильник переповнення TMR1 пишемо = 0
для 10Гц N = 250000 в регістр порівняння пишемо = 53392, в лічильник переповнення TMR1 пишемо = 3
по перериванню від РСР1 порівнюємо лічильник з кількістю переповнення TMR1 якщо збігається інвертуємо ПІН
по перериванню TMR1 вважаємо кількість переповнень.

а звідки взялося 53392.
Ну 2500 при 1кГц зрозуміло.

Цікавий варіант, але я вже зрозумів що 873 тут навряд чи підійде, тому як куди йому цю таблицю потім приткнути - у нього якщо по даташіту- всього 256 байт флеш пам'яті.

Це у 876, а у вісімсот сімдесят третього - наскільки я пам'ятаю 128, але це EEPROM даних, навіщо там-то зберігати таблицю ?!
А програмної флеш-пам'яті у нього 4К. Хоча навіщо потрібна таблиця для генерації меандру - не дуже зрозуміло, це для ДДС-синуса треба.

Для генерації можна PWM використовувати.
А взагалі, необхідні частоти низькі, тут і програмно на будь-якому таймері за 5 хвилин делется - таймер заряджати на підлогу періоду, в його переривання перезаписувати таймер і робиш наприклад PA0 ^ = 1; або будь-яку іншу ніжку, і отримуєш чіткий меандр з точністю до пари тактів.
Частоту міняєш, змінюючи константу перезапису таймера (і при необхідності - дільник).

як при цьому конвертувати значення частоти для виведення на індикатор.

Порахувати, це ж мікропроцессоор! Тим більше, що для індикації це можна робити не дуже швидко.
Якщо 873 на 20МГц працює, значить такт у нього 0.2мкс.
Знаючи константу перезапису таймера (К), знаєш напівперіод t = K * 0.2us.
Період T = 2t, частота F = 1 / T = 1 / (2 * K * 0.2us) = 25 * 10 ^ 4 / K - і отримуєш частоту в герцах, якщо я в ступені не наплутав.

Це у 876, а у вісімсот сімдесят третього - наскільки я пам'ятаю 128, але це EEPROM даних, навіщо там-то зберігати таблицю ?!
А програмної флеш-пам'яті у нього 4К. Хоча навіщо потрібна таблиця для генерації меандру - не дуже зрозуміло, це для ДДС-синуса треба.

Для генерації можна PWM використовувати.
А взагалі, необхідні частоти низькі, тут і програмно на будь-якому таймері за 5 хвилин делется - таймер заряджати на підлогу періоду, в його переривання перезаписувати таймер і робиш наприклад PA0 ^ = 1; або будь-яку іншу ніжку, і отримуєш чіткий меандр з точністю до пари тактів.
Частоту міняєш, змінюючи константу перезапису таймера (і при необхідності - дільник).

Порахувати, це ж мікропроцессоор! Тим більше, що для індикації це можна робити не дуже швидко.
Якщо 873 на 20МГц працює, значить такт у нього 0.2мкс.
Знаючи константу перезапису таймера (К), знаєш напівперіод t = K * 0.2us.
Період T = 2t, частота F = 1 / T = 1 / (2 * K * 0.2us) = 25 * 10 ^ 4 / K - і отримуєш частоту в герцах, якщо я в ступені не наплутав.

Фуххх. запарился я що то трохи розбиратися з цим питанням.
Ніяк не відділю мух від котлет. Короче на стандартних таймерах взагалі морок получается- якісь нелінійності, таблиці пересчета- коротше в топку схоже треба цей варіант.
На контролері з модулем NCO все начебто набагато красивіше получается- хоча теж поки не все ясно.
Ну от як то так-навскидку. В реалі такого каменю не нашел- поки тільки теоретизує.

Правда при 4МHz тактового генератора при наведеному коді виходить максимум 486 Hz. - зате крок приблизно 2 герца. щоб отримати більше-треба схоже ще Інкремент NCO1INCH програмно.

Схожі статті