arduino mega 2560 + uart + xy-pwm

roitmanv
Offline
Зарегистрирован: 13.02.2022

День Добрый! 

Суть вопроса такова: нужно сгенерировать 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" и на экране генератора сбивается отображение цифр, при этом частоты на выходе генератора остаются прежними

Что может быть не так ? Мануала по работе с этим генером вменяемого не нашел.

b707
Offline
Зарегистрирован: 26.05.2017

Документация

https://www.analog.com/media/en/technical-documentation/data-sheets/ad9833.pdf

 

А вот код ваш я вообще не понял. Что у вас подключено с портам Serial и Serial1? Кому вы эти строчки пытаетесь отсылать? Уж не AD9833 ?

roitmanv
Offline
Зарегистрирован: 13.02.2022

С AD все понятно и сигнал с нее я получил как надо, Serial - по usb комп на arduino ide с монитора порта я кидаю ардуине команду на изменение частоты.

Serial1 это генератор частоты XY-PWM такой : 

вот он и не хочет принимать команды. В целом:

b707
Offline
Зарегистрирован: 26.05.2017

а на Меге pWM нельзя генерить разве?

roitmanv
Offline
Зарегистрирован: 13.02.2022

насколько я понял, так как мне надо нет, ибо у нее улетят такты, мне надо в реальном времени получать 4 разных сигнала, 2 аналоговых по напряжению, 2 импульса, конвертить их с коеффициентом и потом выдавать нужные частоты в виде PWM

b707
Offline
Зарегистрирован: 26.05.2017

roitmanv пишет:

насколько я понял, так как мне надо нет, ибо у нее улетят такты, мне надо в реальном времени получать 4 разных сигнала, 2 аналоговых по напряжению, 2 импульса, конвертить их с коеффициентом и потом выдавать нужные частоты в виде PWM

для генерации двух PWM c частотой 25 Гц даже ШИМ не нужен, это легко делается программно

roitmanv
Offline
Зарегистрирован: 13.02.2022

а как при этом задать скважность от 20 до 85% динамически, т.е. сейчас 20% через минуту 60% и т.д. и это должно на 2-х каналах быть одновременно с разной скважностью

b707
Offline
Зарегистрирован: 26.05.2017

roitmanv пишет:

а как при этом задать скважность от 20 до 85% динамически, т.е. сейчас 20% через минуту 60% и т.д. и это должно на 2-х каналах быть одновременно с разной скважностью

а как вы это "динамически" на внешнем модуле задаете? - наверняка сначала подаете команду 25%, а через минуту 80%. так?

Что мешает своему генератору менять скважность тогда, когда надо?

В общем, и тот и другой способ имеет право на жизнь. Но для вашего способа нужен а) внешний модуль и б) четкая документация.

roitmanv
Offline
Зарегистрирован: 13.02.2022

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

Ну насколько я понял, если менять частоту и скважность программно, то она будет на всех каналах идентична. делай тормозит луп и все ждут.

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

b707
Offline
Зарегистрирован: 26.05.2017

roitmanv пишет:

Ну насколько я понял, если менять частоту и скважность программно, то она будет на всех каналах идентична. делай тормозит луп и все ждут.

Если мы говорим о "программном ШИМ" - то есть не на таймерах МК, а с помощью кода - то там, собственно, никаких "каналов" нет. На двух выходах сделать разную частоту не проблема и скважность тоже. delay() тут вовсе не причем, его использовать нельзя, это пишется на миллис.

Какие частоты ШИМ нужны, уточните. А то сначала пишете, что 25Гц на обоих каналах, а теперь вот менять надо?

 

roitmanv
Offline
Зарегистрирован: 13.02.2022

допустим на одном канале 25Гц 20%, на втором 25Гц 60%, остальные два будут через ад управляться.

b707
Offline
Зарегистрирован: 26.05.2017

roitmanv пишет:

допустим на одном канале 25Гц 20%, на втором 25Гц 60%, остальные два будут через ад управляться.

те что через AD - оставим, речь не о них.

А вот эти два - подробнее. Не надо писать "допустим", обозначте точно, в каких пределах должна менятся частота. От этого будет зависеть, как этот ШИМ формировать.

roitmanv
Offline
Зарегистрирован: 13.02.2022

на обоих каналах частота 25Гц , а заполнение от 20 до 85 %, т.е. в любой промежуток времени скважность должна иметь возможность изменяться в этом приделе, т.е. на старте 85%, в следующую секунду/минуту может быть любой в диапазоне

b707
Offline
Зарегистрирован: 26.05.2017

roitmanv пишет:

на обоих каналах частота 25Гц , а заполнение от 20 до 85 %, т.е. в любой промежуток времени скважность должна иметь возможность изменяться в этом приделе, т.е. на старте 85%, в следующую секунду/минуту может быть любой в диапазоне

если частота обоих каналов всегда одинакова, то можно сделать как аппаратно (ШИМ на таймере1), так и программно.

Программный ШИМ 25 Гц 20% - это просто, делаете на пине в течении 8 мс HIGH, а 32мс - LOW

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у тебя куча таймеров, чего их экономить, сделай на таймерах, примеров тут тьма

roitmanv
Offline
Зарегистрирован: 13.02.2022

b707 пишет:
если частота обоих каналов всегда одинакова, то можно сделать как аппаратно (ШИМ на таймере1), так и программно. Программный ШИМ 25 Гц 20% - это просто, делаете на пине в течении 8 мс HIGH, а 32мс - LOW

так я задолбусь логику делать для всего диапозона 65 вариантов временных интервалов, ... прожка в страницы превратится.

roitmanv
Offline
Зарегистрирован: 13.02.2022

ua6em пишет:
у тебя куча таймеров, чего их экономить, сделай на таймерах, примеров тут тьма

пробовал на ISR из какого-то примера - не работало. Примеров может тьма, но о чем именно речь. я пока не видел, того, что мне надо, если есть, дайте ссыль.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в один регистр загоняется значение частоты, в другой дути, пример для 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

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

roitmanv пишет:

b707 пишет:
если частота обоих каналов всегда одинакова, то можно сделать как аппаратно (ШИМ на таймере1), так и программно. Программный ШИМ 25 Гц 20% - это просто, делаете на пине в течении 8 мс HIGH, а 32мс - LOW

так я задолбусь логику делать для всего диапозона 65 вариантов временных интервалов, ... прожка в страницы превратится.

Правильно ли я понимаю: если Вам понадобиться выдать 1000 импульсов, то менее чем в 2000 строк кода (одна строка - установить в 0, вторая - установить в 1) это сделать принципиально невозможно?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

roitmanv, не страдайте ерундой: у Меги2560 четыре 16-разрядных таймера. Если Вам нужны два сигнала с разными частотами и разной скважностью, это делается на двух разных таймерах. Если допустимо, чтобы частота была одна (а разные только скважности) - это делается на двух каналах одного таймера.

По поводу "в реальном времени": при наличии в коде delay(5000) - о каком реальном времени вообще может идти речь!

А вот перестраивать частоту и скважность таймеров можно хоть 10 раз в секунду, хоть 100 раз в секунду, хоть 1000 раз в секунду (можно и 10000 раз в секунду).