arduino mega 2560 + uart + xy-pwm
- Войдите на сайт для отправки комментариев
День Добрый!
Суть вопроса такова: нужно сгенерировать 4 разных динамически меняющихся сигнала, 2 канала с переменной частотой (18 - 270 ГЦ / 11 - 140 Гц), 2 канала 25Гц с заполнением от 20 до 85 %.
Первые 2 сигнала генерируются через DDS AD9833, 2-е 2 сигнала по плану сгенерировать на xy-pwm, т.к. AD9833 не умеет менять скважность.
Пробую передать по uart через пины (mega) ТХ1 (18), RX1 (19) отправить команду:
1. S1F25T или S1F025T
2. S1D85T или S1D085T
3. S2F25T или S2F025T
4. S2D85T или S2D085T
следующим образом:
Serial1.begin(9600); Serial1.write("S1F25T"); delay(5000); if (Serial1.available() > 0) { Serial.println(Serial1.readString()); } Serial1.print("S1D085T"); delay(5000); if (Serial1.available() > 0) { Serial.println(Serial1.readString()); } /*****************************/ if (data.startsWith("g1", 0)) { Serial.println("S1D"+data.substring(3)+"T"); Serial1.print("S1D"+data.substring(3)+"T"); delay(5000); if (Serial1.available() > 0) { Serial.println(Serial1.readString()); } }
В любом из вариантов получаю в ответ: "Err" и на экране генератора сбивается отображение цифр, при этом частоты на выходе генератора остаются прежними
Что может быть не так ? Мануала по работе с этим генером вменяемого не нашел.
Документация
https://www.analog.com/media/en/technical-documentation/data-sheets/ad9833.pdf
А вот код ваш я вообще не понял. Что у вас подключено с портам Serial и Serial1? Кому вы эти строчки пытаетесь отсылать? Уж не AD9833 ?
С AD все понятно и сигнал с нее я получил как надо, Serial - по usb комп на arduino ide с монитора порта я кидаю ардуине команду на изменение частоты.
Serial1 это генератор частоты XY-PWM такой :
вот он и не хочет принимать команды. В целом:
а на Меге pWM нельзя генерить разве?
насколько я понял, так как мне надо нет, ибо у нее улетят такты, мне надо в реальном времени получать 4 разных сигнала, 2 аналоговых по напряжению, 2 импульса, конвертить их с коеффициентом и потом выдавать нужные частоты в виде PWM
насколько я понял, так как мне надо нет, ибо у нее улетят такты, мне надо в реальном времени получать 4 разных сигнала, 2 аналоговых по напряжению, 2 импульса, конвертить их с коеффициентом и потом выдавать нужные частоты в виде PWM
для генерации двух PWM c частотой 25 Гц даже ШИМ не нужен, это легко делается программно
а как при этом задать скважность от 20 до 85% динамически, т.е. сейчас 20% через минуту 60% и т.д. и это должно на 2-х каналах быть одновременно с разной скважностью
а как при этом задать скважность от 20 до 85% динамически, т.е. сейчас 20% через минуту 60% и т.д. и это должно на 2-х каналах быть одновременно с разной скважностью
а как вы это "динамически" на внешнем модуле задаете? - наверняка сначала подаете команду 25%, а через минуту 80%. так?
Что мешает своему генератору менять скважность тогда, когда надо?
В общем, и тот и другой способ имеет право на жизнь. Но для вашего способа нужен а) внешний модуль и б) четкая документация.
с компа и говорю изменить частоту с указанием этой частоты, для ad9833 работает, динамически пока не задаю, пока решаю вопрос с нужной частотой, на данном этапе тестирую подачу частоты, ибо пока этот вопрос не решится смысла нет делать опрос датчиков.
Ну насколько я понял, если менять частоту и скважность программно, то она будет на всех каналах идентична. делай тормозит луп и все ждут.
Если есть возможность отдельно в рельном времени менять частоту и скважность на 2-х каналах и чтобы все четыре не страдали от этого, то где увидеть пример рабочего кода, я пока не нашел.
Ну насколько я понял, если менять частоту и скважность программно, то она будет на всех каналах идентична. делай тормозит луп и все ждут.
Если мы говорим о "программном ШИМ" - то есть не на таймерах МК, а с помощью кода - то там, собственно, никаких "каналов" нет. На двух выходах сделать разную частоту не проблема и скважность тоже. delay() тут вовсе не причем, его использовать нельзя, это пишется на миллис.
Какие частоты ШИМ нужны, уточните. А то сначала пишете, что 25Гц на обоих каналах, а теперь вот менять надо?
допустим на одном канале 25Гц 20%, на втором 25Гц 60%, остальные два будут через ад управляться.
допустим на одном канале 25Гц 20%, на втором 25Гц 60%, остальные два будут через ад управляться.
те что через AD - оставим, речь не о них.
А вот эти два - подробнее. Не надо писать "допустим", обозначте точно, в каких пределах должна менятся частота. От этого будет зависеть, как этот ШИМ формировать.
на обоих каналах частота 25Гц , а заполнение от 20 до 85 %, т.е. в любой промежуток времени скважность должна иметь возможность изменяться в этом приделе, т.е. на старте 85%, в следующую секунду/минуту может быть любой в диапазоне
на обоих каналах частота 25Гц , а заполнение от 20 до 85 %, т.е. в любой промежуток времени скважность должна иметь возможность изменяться в этом приделе, т.е. на старте 85%, в следующую секунду/минуту может быть любой в диапазоне
если частота обоих каналов всегда одинакова, то можно сделать как аппаратно (ШИМ на таймере1), так и программно.
Программный ШИМ 25 Гц 20% - это просто, делаете на пине в течении 8 мс HIGH, а 32мс - LOW
у тебя куча таймеров, чего их экономить, сделай на таймерах, примеров тут тьма
так я задолбусь логику делать для всего диапозона 65 вариантов временных интервалов, ... прожка в страницы превратится.
пробовал на ISR из какого-то примера - не работало. Примеров может тьма, но о чем именно речь. я пока не видел, того, что мне надо, если есть, дайте ссыль.
в один регистр загоняется значение частоты, в другой дути, пример для PWM режима на таймерах, там кода пять строк, для 2560 всё аналогично...
Два таймера на 2560 можно глянуть тут
Калькулятор показывает как-то так, может даже правильно )))
Results for frequency: 25.00Hz
(1,3) Prescaler: 64; MaxValue: 4999; Frequency: 25.00Hz; Diff: 0.00Hz
(1,3) Prescaler: 8; MaxValue: 39999; Frequency: 25.00Hz; Diff: 0.00Hz
(1,3) Prescaler: 256; MaxValue: 1249; Frequency: 25.00Hz; Diff: 0.00Hz
(1,3) Prescaler: 1024; MaxValue: 312; Frequency: 24.96Hz; Diff: 0.04Hz
так я задолбусь логику делать для всего диапозона 65 вариантов временных интервалов, ... прожка в страницы превратится.
Правильно ли я понимаю: если Вам понадобиться выдать 1000 импульсов, то менее чем в 2000 строк кода (одна строка - установить в 0, вторая - установить в 1) это сделать принципиально невозможно?
roitmanv, не страдайте ерундой: у Меги2560 четыре 16-разрядных таймера. Если Вам нужны два сигнала с разными частотами и разной скважностью, это делается на двух разных таймерах. Если допустимо, чтобы частота была одна (а разные только скважности) - это делается на двух каналах одного таймера.
По поводу "в реальном времени": при наличии в коде delay(5000) - о каком реальном времени вообще может идти речь!
А вот перестраивать частоту и скважность таймеров можно хоть 10 раз в секунду, хоть 100 раз в секунду, хоть 1000 раз в секунду (можно и 10000 раз в секунду).