1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 15
|
||||||
1 | ||||||
Модуль SPI не работает на высоких частотах23.12.2017, 01:17. Показов 1486. Ответов 7
Метки нет (Все метки)
Здравствуйте. У меня в процессе написания программы возник один весьма важный вопрос, который сам я решить так и не смог. Может быть, кому-нибудь приходилось сталкиваться с подобным, хотелось бы узнать решение.
Итак, в чём суть. Я писал программу на ATMega128 для внешнего ЦАП типа MCP4921. Задача -- генерировать при помощи этого ЦАП синусоидальный сигнал частотой от 100 Гц до 1кГц. Вкратце, принцип работы таков: 1) определяем, каким количеством значений будет описываться сигнал (в программе -- константа N); 2) вводим таймер-счётчик(№3), который с частотой, в N раз большей, чем желаемая частота выходного сигнала (ICR3 = F_CPU / f / N), будет обновлять (инкрементировать) значение некоторой переменной (dt); 3) в цикле while(1) происходит вычисление соответствующего значения сигнала и передача данных на ЦАП. Вот такой получился код:
В связи с этим у меня вопрос: чем обусловлена такая проблема? Полагаю, что проблема обусловлена взаимодействием модуля SPI и таймера-счётчика, так как без таймера синусоида в 1 кГц вполне себе получается. Но почему так происходит и возможно ли всё-таки совместить оба этих модуля так, чтобы они вместе работали на частоте от 10кГц и более?
0
|
23.12.2017, 01:17 | |
Ответы с готовыми решениями:
7
Процессор в простое на высоких частотах а в игре на минимальных Почему оксидные конденсаторы нельзя применять на высоких частотах? Не работает на заявленных частотах Память не работает на заявленных частотах Видеокарта работает на минимальных частотах |
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
23.12.2017, 18:18 | 2 |
SlavVlad, у вас какой-то странный подход в виде разделения отсчёта по таймеру и самой передачи. По-нормальному надо уж или всё делать (включая расчёты) по таймеру, или всё делать делать в общем бесконечном цикле с задержкой через delay (второй вариант намного хуже).
Очень много раз реализовывал то, что вы задумали. Всегда весь код лежал в обработчике таймера.
0
|
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
|
|
24.12.2017, 04:35 | 3 |
А что у вас подается на вывод Input Capture таймера 3? Ведь прерывания таймера происходят именно по нему у вас. И если туда что-то приходит слишком часто - может оказаться, что процессор непрерывно занят обработкой прерывания.
Вычисление sin занимает много времени, ни о каких десятках (и даже единицах) килогерц речи не будет. Я не возьмусь предсказать результат выражения h = l = dac_data = (sin(2*M_PI/N * x) + 1) * 2047 с учетом того, что все переменные в нем - целые (включая переменные результата). И где, кстати, объявление переменной x?
0
|
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 15
|
|
24.12.2017, 14:38 [ТС] | 4 |
Kukuxumushu, спасибо за ответ, попробую все расчёты в прерывание поместить. Через задержки, кстати, получилось, и да, действительно грубый метод, т.к. пришлось подгонять значения этих задержек.
Добавлено через 12 минут alexey6689, на сам вывод ICP3 ничего не подаётся, используется только регистр ICR3 для настройки частоты прерываний. Насчёт вычисления функции sin соглашусь, я тоже подозревал, что её не следует здесь применять. После того, как я вместо неё стал использовать массив значений, ситуация несколько улучшилась, но при 10 кГц всё равно проблема наблюдается. Что касается переменной x. Я совсем недавно переименовал эту переменную в dt, а в формуле она осталась со старым именем, так как формула давно была закомментирована, и я не обратил на это внимания.
0
|
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
|
|
24.12.2017, 14:43 | 5 |
Так тогда вроде как следует использовать прерывание по переполнению, а не по Input Capture. Поскольку я вообще не понимаю, почему оно у вас вызывается.
0
|
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 15
|
|
24.12.2017, 15:12 [ТС] | 6 |
alexey6689, У меня таймер настроен под режим CTC, при этом верхний предел счёта заложен в ICR3. При достижении этого предела и должно произойти прерывание. Идея такова. Я до сих пор думал, что для реализации такого прерывания нужно разрешить именно TICIE3, а не TOIE3. Неужели это ошибка?
0
|
210 / 163 / 36
Регистрация: 15.11.2012
Сообщений: 788
|
|
24.12.2017, 22:39 | 7 |
Да, это ошибка.
Ваш таймер, по моему опыту, вообще не должен вызывать прерываний. Добавлено через 56 секунд Я имею в виду - в вашей нынешней программе прерывания таймера вызываться не могут.
0
|
1 / 1 / 0
Регистрация: 29.10.2017
Сообщений: 15
|
|
25.12.2017, 01:45 [ТС] | 8 |
По-моему опыту, прерывания будут работать, но, похоже, неправильно :-) .
Однако... У меня около десятка программ на таком принципе построено. Надеюсь, благодаря Вашему совету я исправлю не одну ошибку. Спасибо за совет
0
|
25.12.2017, 01:45 | |
25.12.2017, 01:45 | |
Помогаю со студенческими работами здесь
8
Не работает ОЗУ на своих частотах Видеокарта работает на минимальных частотах Камень работает на минимальных частотах Видеокарта работает на 3D частотах в браузере Видеокарта 1650 работает на пониженных частотах Подскажите озу работает не на заявленных частотах Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |