повысить частоту записи analogwrite
- Войдите на сайт для отправки комментариев
Пт, 13/12/2013 - 19:49
по умолчанию пишет на 490 гц. можно ли как то повысить частоту записи?
написал код генерации синусоиды на основе предрассчитаных 256 значений. при 490 можно макчимум на 50гц вырулить с помошью задержек delay, а надо бы 400. Может по сигналу синхронизации как то завести
или как то с таймерами 0 , 1 или 2. но как их увязать?
http://arduino.ru/forum/proekty/arduinoide-i-atmega16-korrektiruem-yadro?page=1#comment-47102
http://habrahabr.ru/post/141442/
насколько я понял вписав в setup
я получу на 4 и 5 ноге 3,9кгц?
беда в том что генерится опорная синусоида, со входа берется сигнал, который влияет на амплитуду. и на выходе три синусоиды со смещением на 120 градусов. Выходит у меня без вариантов?
спасибо
видел эту статью, но не понял как это что-то изменит
форы в сетапе или лупе? что за переменная к?
могу выложить код
насколько я понял вписав в setup
я получу на 4 и 5 ноге 3,9кгц?
беда в том что генерится опорная синусоида, со входа берется сигнал, который влияет на амплитуду. и на выходе три синусоиды со смещением на 120 градусов. Выходит у меня без вариантов?
Не понял вообще ничего. Сколько Вам нужно PWM выходов? Я правильно понял, что три? Если так, то нужно сделать аналогично для еще одного таймера и будет нормально.
С какого входа берется сигнал? ПРи чем тут амплитуда? На каком выходе три синусоиды?
Опять же ни слова, какой у Вас МК или Ардуино. Я не телепат.
Если хотите адекватного ответа, задайте вопрос еще раз, объяснив задачу.
UPD: Вы думаете, что на 4,5 выходах буду синусоиды? А частота - это частота синуса? Частота - это частота PWM, боюсь, что мы друг друга не понимаем.
UPD2: http://arduino.ru/Reference/AnalogWrite
моя задача. Сделать устройство которое генерировало бы 3 фазы. тоесть 3 синусоиды со сдвигом на 120. Синусоиду я реализовал с помощью массива из 256 значений, в которых прорисован весь период. смещаю "х" и вывожу в analogwrite
а смещение на 120 градусов
такого типа. и теперь когда все работает я столкнулся с проблемой, что нужна частота самой синусоиды - 400гц. осциллографом проверял, шим сжимается разжимается синхронно, все красиво
а что такое "x"? то ли индекс элемента массива, то ли угол сдвига фазы....
Индекс элемента. Ноль синусоиды 127, единица 255, минус единица 0. сдвиг фазы реализован сдвигом элемента массива.
В такой постановке, нужно скорей всего делать на прерываниях, использовать для этого 0 таймер (не знаю какая у Вас Ардуино) и в обработчике прерывания выводить все три значения, т.е. программировать сразу порты PWM таймера (т.е. 1 и 2 таймеры). Частоту прерываний рассчитать в зависимости от частоты синусоиды. Возможно получится то, что нужно. Правда при этом нельзя будет пользоваться функциями millis, micros и т.п. Возможно проблемой будет то, что частота 400Гц точно не получится, нужно считать. А если Вам нужно менять частоту, тогда этот способ может не подойти совсем.
А где по таймерам можно найти примеры и толковые обяснения? Пытался разобраться но регистры так и не осилил...
http://chipenable.ru/index.php/programming-avr/item/171-avr-timer-t0-ch1...
http://chipenable.ru/index.php/programming-avr/item/187-uchebnyy-kurs-av...
http://chipenable.ru/index.php/programming-avr/item/191-uchebnyy-kurs-av...
А еще есть смысл посмотреть исходники, а именно файл wiring_analog.c, там есть исходник analogWrite. Это чтобы не использовать analogWrite, а напрямую программировать таймеры. Конечно придется покопаться, но иначе и браться не стоит, если не хочется копаться. В любом случае сначала надо рассчитать частоту вывода данных, чтобы понять, есть ли смысл браться за прерывания
а если воспользоваться таймером0 для перебора значений 0-256? ведь он генерит 256 и сбрасывается в ноль, а это то что надо. только я пока не понял как так модифицировать код. значения брать из массива[256]
В такой постановке, нужно скорей всего делать на прерываниях, использовать для этого 0 таймер (не знаю какая у Вас Ардуино) и в обработчике прерывания выводить все три значения, т.е. программировать сразу порты PWM таймера (т.е. 1 и 2 таймеры). Частоту прерываний рассчитать в зависимости от частоты синусоиды. Возможно получится то, что нужно. Правда при этом нельзя будет пользоваться функциями millis, micros и т.п. Возможно проблемой будет то, что частота 400Гц точно не получится, нужно считать. А если Вам нужно менять частоту, тогда этот способ может не подойти совсем.
написал тоже что скказали и Вы. дошло. как правильно описать таймер?
в секунду нужно выводить 400гц*256=102400 значений //256 это период синусоиды эт частота вывода значений
Период тактового сигнала таймера Т0 равен Tt0 = (1/Fcpu)/k = k/Fcpu - подберем коэффициент, допустим 64:
64/8мгц=0,000008
сравним ее с требуемым периодом:
1/102400=0,000009.
из этого следует, что коэффициент делителя нужен 64. в ту сторону мыслю?
тот код, который есть на данный момент
Да уж, что то слишком тяжелый расчет.
x, x_1, x_2 можно сделать тип - байт и не париться, поскольку больше 255 они не будут никогда и добавлять константу и не проверять. byte x_1 = x + 185; никогда не будет больше 255.
alfa_grad нигде не меняется, соответственно alfa_rad всегда одно и тоже значение.
Не помню как правильно, но строку 48 я бы записал как:
alfa_rad = (float)alfa_grad*3.14/180;
иначе может некорректно рассчитать - лучше результат вывести в монитор и проверить.
(ramX*sin(alfa_rad))*100 - аналогично, ramX - целое, умножается на float и округляется. Так что тут тоже лучше написать как
((float)ramX*sin(alfa_rad))*100.
В общем эти места лучше проверить.
На счет таймера:
1/400 = 2,5мс это один период, т.е. за это время надо вывести 256 отсчетов, т.е. если я не ошибся, это 102,4 КГц - частота прерываний. Много это или мало, не знаю, разумеется зависит от частоты МК.
А дальше сегодня уже голова не варит. Может кто из практиков подскажет, а то я в этом вопросе - теоретик.
Подозреваю, что нужно, если использовать прерывания, выкинуть все расчеты и тупо оставить таблицу и выводить из неё данные без каких либо пересчетов, иначе не успеет отработать.
И еще, не понял, зачем на синус из таблицы (Array[x]) накладывать еще один синус (sin(alfa_rad)), непонятно.
спасибо, поправил, все работает. Дело в том, что на вход будет выдаваться сигнал угла и он будет меняться.
В проекте моделируется алгоритм поворота высотомера на азимут. Дается код угла и трехфазый движок выворачивается на угол.
нашел в сети библиотеку, для первого таймера http://robocraft.ru/blog/arduino/614.html
попробую разобраться
Удачи, впрочем, думаю Вы еще не уходите :) Да и поделиться с сообществом тоже не помешает.
Если использовать таймер1, будет пересечение по прерываниям с таймером0, не забывайте про это, если увидите неравномерность на выходе.
будут успехи отпишусь, но пока что то нет идей... на осциллографе ши почемуто тоже модулирован синусоидой...
Скетч выложите, посмотрим, там есть пара подозрительных мест. Особенно сброс х в ноль, это не нужно.