Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Научите генерировать 40 кГц
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Urvin
Научите генерировать 40 кГц на пике =) Надо изменять уровень сигнала на цифровой ножке.
40 кГц - это меандр, т.е. изменять само значение, по сути, надо с частотой в два раза больше.

Дело в том, что мой счетчик для таймера может максимально выдать 23437 Гц - как-то грустно
kamil_yaminov
Подробности о том, что за счетчик и как он 23кГц выдает, в студию!
Urvin
Ну я когда-то набросал в экселе табличку для расчета количества итераций (прерываний) таймера на определенное время.
Так вот максимальное число итераций на секунду я могу добиться только с кварцем 48 МГц и делителем 2. Ну вот такую частоту он мне и предлагает.

Хотя смотрю на промышленную плату, которую мне предстоит повторить и модифицировать, где используется авр-ка с 12МГц датчиком.
_Pasha
Цитата(Urvin @ Nov 23 2009, 20:14) *
Ну я когда-то набросал в экселе табличку для расчета количества итераций (прерываний) таймера на определенное время.
Так вот максимальное число итераций на секунду я могу добиться только с кварцем 48 МГц и делителем 2. Ну вот такую частоту он мне и предлагает.

Ничего не понимаю ! cranky.gif
Urvin
В общем... специальная программа (на пк) мне сказала, что мой максимум частоты -- это если я совместно с мк буду использовать кварц 48 МГц, делитель частоты 2 (как наиболее мелкий). Частота - 23437 прерываний в секунду.

Мне надо 80000 прерываний в секунду - как это делают?
kamil_yaminov
Казалось бы берем и тактируем таймер через делитель частоты, скажем равный 8 => 6МГц. 6МГц/40кГц = 150 - это искомый период таймера. Так как нужен меандр 40кГц, то период таймера должен быть в два раза меньше - 75.
Urvin
Только вот таймер работает не так wink.gif
_Pasha
Цитата(Urvin @ Nov 23 2009, 20:45) *
В общем... специальная программа мне сказала...23437 прерываний в секунду.

Она Вас еще и обманула - 23437,5 этих самых прерываний biggrin.gif

Цитата
Мне надо 80000 прерываний в секунду - как это делают?


1. Считаете число, которое надо загрузить в 8-битный таймер, исходя из данных о тактовой частоте (до сих пор ничего не понятно - какой пик, какой кварц итд) и значении предделителя. Допустим
Код
F_CPU = 2 MHz
F_out = 80 kHz
N = F_CPU / F_out = 25 - столько машинных циклов должно прокрутиться в таймере
                                     до наступления прерывания.
N_tmr = 256 - 25 = 231 - это число надо изначально загрузить в таймер.
Кроме того, при возникновении прерывания, надо не загружать его, а прибавлять к существующему содержимому регистра таймера/счетчика, для устранения или хотя бы минимизации джиттера


2. Овнопрограмму - в корзину biggrin.gif
Urvin
Программа числа округляет и мне не хотелось пугать общественность еще и дробями.

МК будет что-то типа 18f2550. Используя внутренний PLL и биты настроек получим частоту процессора 24 МГц (судя по даташиту)
Пусть таймер выставлен в 8 бит.

Цитата
Кроме того, при возникновении прерывания, надо не загружать его, а прибавлять к существующему содержимому регистра таймера/счетчика, для устранения или хотя бы минимизации джиттера

т.е. вместо
TMR0 = 231;
в теле прерывании я должен записать
TMR0 = TMR0 + 255;
так?

В целом идея понятна)
_Pasha
Цитата(Urvin @ Nov 23 2009, 21:18) *
т.е. вместо
TMR0 = 231;
в теле прерывании я должен записать
TMR0 = TMR0 + 255;
так?
В целом идея понятна)

TMR0 = TMR0 + 231;
Код
#define TMR0_reload 231
movlw TMR0_reload
addwf TMR0,f
Urvin
Спасибо!
Буду пробовать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.