Обещался как-то привести пример на компаратор AVR, покапался по своему архиву и нашел генератор пилообразного напряжения. Вообще для реализации в железе этот генератор не из удачных, хотя если его доработать, то получится вполне приличный генератор. В свое время он был заброшен и, в итоге, так и остался в сыром виде. Но эта схема мне понравилась тем, что она хорошо подходит в качестве примера для работы с АЦП, Аналоговым Компаратором, SPI и внешними прерываниями в МК AVR . Вся эта периферия работает здесь самым простым образом, но при этом связана друг с другом. Программу и пример в Proteus’e можно скачать в конце статьи, поэтому не буду приводить здесь куски этой программы, а приведу только схему и кратко опишу как это все реализовано и для чего используется в схеме. Но начну с того, что опишу какие возможности закладывались в этот генератор.
- Непрерывная генерация.
- Генерация пачек импульсов. Запуск пачки по синхроимпульсу.
- Регулировка частоты выходного сигнала (напряжение 0..5В).
- Регулировка длины пачки импульсов (напряжение 0..5В).
Схема
Сам генератор представляет из себя интегратор, собранный на операционном усилителе, в котором конденсатор периодически разряжается. Микроконтроллер устанавливает частоту сброса конденсатора, а в итоге и частоту импульсов пилообразного напряжения, а также отслеживает напряжение на выходе и в случае чего подстраивает его под конкретное напряжение. Для чего это сделано? Если собрать отдельно интегратор с полевым транзистором и подавать на транзистор импульсы для разрядки конденсатора с внешнего генератора, то окажется, что при изменении частоты следования импульсов изменяется и амплитуда выходного напряжения. Оно то и правильно, мы же либо раньше разряжаем конденсатор, либо позже.
Т.о. чтобы на выходе напряжение оставалось постоянным, нужно соответствующим образом изменять напряжение на входе интегратора. И вот тут возникла задачка — сделать отслеживание напряжения на выходе и в случае надобности изменять напряжение на входе интегратора. Заодно прицепил какую-то регулировку используя для этого АЦП микроконтроллера. Итак, какая периферия для чего используется:
- Аналоговый компаратор. Используется для отслеживания выходного напряжения. В зависимости от опорного напряжения наш генератор формирует величину амплитуды выходного сигнала.
- АЦП. Используется для регулировки каких-нибудь параметров. Например, частоты выходных импульсов. А сделано это так, что мы измеряем напряжение на входе АЦП и в зависимости от него выставляем частоту выходного сигнала.
- SPI. Используется для управления ЦАПом, напряжение с которого подается на вход интегратора. Т.е. SPI используется для подстройки напряжения на входе интегратора.
- Внешние прерывания. Используется для подачи синхроимпульса.
А теперь кратко, как работает программа.
- Включаем генератор. На входе интегратора напряжение равно нулю.
- Компаратор определяет что на одном из его входов напряжение ниже опорного и дает команду SPI увеличить напряжение.
- Увеличиваем напряжение на 1 (всего напряжение питание разбито на 256 частей). SPI дает команду ЦАПу и он преобразует цифровое значение в аналоговое напряжение.
- Повторяем п.2 и п.3 пока напряжение не дойдет до нужного (в данном случае амплитуда сигнала будет равна удвоенному опорному напряжению на входе компаратора).
- Если вдруг превысили напряжение, то будет команда уменьшить напряжение. Амплитуда регулируется только при непрерывной генерации (ну это просто так сделано в этом генераторе, но при желании можно переделать). Т.е. при включении генератора он должен быть в режиме непрерывной генерации (переключатель разомкнут).
- Если мы хотим изменить частоту тогда мы изменяем напряжение на входе ADC0. Здесь подойдет обычный делитель напряжения с переменным резистором.
- Если хотим изменить длину пачки импульсов изменяем напряжение на входе ADC1.
- Если работаем в режиме генерации пачек, то на вход INT0 МК подается синхроимпульс (само собой амплитуда не больше 5В).
Вот собственно и все. Думаю, разобраться с программой не составит никакого труда.