Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Синусоида  (Прочитано 28596 раз)
0 Пользователей и 1 Гость смотрят эту тему.
goodking
Постоялец

ua
Offline Offline
Пол: Мужской

« Ответ #30 : 30-05-2011 14:46 » 

30кГц, это частота основной гармоники ШИМ ?


да
Записан
Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #31 : 30-05-2011 19:43 » 

тогда делите частоту вашего процессора частоту дискретизации, которая должна быть в несколько раз выше 30кГц, и получите несколько десятков тактов на отсчет. и одна итерация вашего кода должна в это число тактов уложится.
я так понимаю их будет всего что то около нескольких десятков.

1. использовать  генерацию в цикле... ну это некий секс на самом деле. это вы нормально только ассемблером сможете сделать, потому что иначе придется считать число тактов на цикл, а си-ший компилятор с этим довольно непредсказуемо обходится. придется проверять что он "наварил" после каждой компиляции.
2. посмотрите в сторону таймера и прерываний. это сделает генерацию стабильной, но тут многое зависит от того уложится ваша процедура вместе с обработчиком прерывания в требуемое число тактов или нет. и возможно ли на таймере вашего процессора такое разрешение.
3. вариант - считать не через синус, а фронт/спад этого ШИМа. свободных тактов будет много больше, но это тоже лучше в асемблере делать. собственно вам синус как таковой не нужен. он же у вас только период задает, а это можно пересчитать.
 это если выходной сигнал все таки ШИМ а не смесь прямоугольных импульсов с кусками синусоиды по амплитуде как у вас в первоначальном коде написано.

но вам еще как-то надо исходные данные получать?


Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #32 : 31-05-2011 15:50 » new

4.9 МГц (кстати, по-английски будет MHz, а не MGz) - это, как я вижу, внутренний генератор 24.5 МГц, деленный на пять. Почему именно на пять? Задает эту частоту таймер 0?

Добавлено через 13 минут и 55 секунд:
Судя по мануалу, требующаяся функция timer capture на типовых счетчиках не реализована. Вместо это используется "Programmable Counter Array" (PCA): еще один 16 битный счетчик и 5 модулей сравнения к нему.

Цитата
The Programmable Counter Array (PCA0) provides enhanced timer functionality while requiring less CPU intervention than the standard 8051 counter/timers. The PCA consists of a dedicated 16-bit counter/timer and five 16-bit capture/compare modules. Each capture/compare module has its own associated I/O line (CEXn) which is routed through the Crossbar to Port I/O when enabled.

Я так понимаю, что счет PCA должен задавать период, а модуль захвата задает ширину.
В общем теперь понятно, зачем делить на пять - для использования режима PWM 8 bit. Режим с буферизацией значения ШИМ. Прерывание по переполнению PCA есть.

В чем, собственно, возникла сложность?


Добавлено через 15 минут и 51 секунду:
В обработчике прерывания вычисляем новое значение и загружаем в регистр PCA0CPHn. Вычисление должно быть достаточно быстрое, т.к. период между прерываниями составляет 816-817 тактов (машинный цикл данного чипа - 1 такт). Т.е. тысяч тактов на использование плавающих значений, а уж тем более функций синусов нет. Самым оптимальным будет использование табличных преобразований. Не помешает подсчет погрешности преобразования, иначе будет низкочастотный дрейф.

Считаю, что для данного чипа риалтайм-процедуры нужно писать на ассемблере. На Си можно писать только некритичную ко времени исполнения логику.
« Последнее редактирование: 31-05-2011 16:30 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines