Генератор меандра на 2 канала.

сдохля
Offline
Зарегистрирован: 06.11.2016

Здравствуйте.

Я совсем новичек в ардуино конструкциях и программировании. Возможно ни когда не взялся за этот контроллер если бы не нужда. На базе любой из плат: Мега, уно, микро, нужно создать генератор прямоугольных импульсов на 2 канала, с частотой до 2-4 МГЦ по каждому. Это еще не все. Требуется возможность регулировки скважности по обоим каналам. Програмно, или переменными резисторами.. Удобство одного метода относительно второго еще не знаю.  И это еще не все. Нужно запрограммировать возможность сдвига по времени открывания одного сигнала относительно второго. По умолчанию оба канала выхода открываются одновременно, секунда в секунду. Выходы ардуино будут управлять мосфет транзисторами. Спасибо.

ssss
Offline
Зарегистрирован: 01.07.2016

"Миссия невыполнима!"(с).

сдохля
Offline
Зарегистрирован: 06.11.2016

Понятно. Спасибо большое. Значит и вопросов больше не имеется. Всего доброго.

nik182
Offline
Зарегистрирован: 04.05.2015

Почему не выполнима? Если включить PPL то такт таймра 64 МГц. Поделить на 16 вот и 4 МГц И даже скважность можно поменять. Правда шагов будет только 15 . При меньшей частоте соответственно и шагов больше. Таймер справится.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

сдохля. мне вот интересно, ну а если бы это было возможно, то что? Вы бы попросили написать для Вас такую программу, или стали бы учить СИ, что б через пару-тройку лет написать самому? ))

сдохля
Offline
Зарегистрирован: 06.11.2016

Здравствуйте dimax.

Попросил бы естественно помощи в написании такой программы.Частоту можно опустить до 1 МГЦа. Я занимаюсь саморазвитием. Приобрел литературу по программированию ардуино. Мой проект не коммерчесский, для личного пользования.

nik182
Offline
Зарегистрирован: 04.05.2015

Програмирование Ардуино не поможет в решении данной задачи. Учить надо програмирование микроконтроллера и таймеров в часности.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

сдохля, помочь начинающему написать программу -это всё равно что помочь одеться годовалому малышу. Мало того, что сделаешь всё сам, так он ещё и мешать тебе будет )) И потом то, про что вы говорите - это серьёзная работа, которая стоит  денег. Посмотрите в теме проектов -там мой одноканальный генератор с аналогичными характеристиками , даже на первую версию я убил порядка 5 дней рабочего  времени, т.к. писал с чистого листа, без каких-либо шаблонов и наработок.  Сколько стоит пять дней программиста? ))

сдохля
Offline
Зарегистрирован: 06.11.2016

Я без малейшего понятия сколько может стоить 5 дней программиста! Ответы в моей теме столь противоречивы, что даже и не знаю - стоит ли продолжать сию ветку!?

nik182
Offline
Зарегистрирован: 04.05.2015

Почему противоречивы? Их все можно свести и простому - сделать можно, но для того что бы сделать самостоятельно надо иметь определённый опыт, который можно приобрести за какое то конечное время, учась на более простых задачах. Если нужно срочно можно сходить в тему Ищу исполнителя.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

сдохля пишет:

Генератор меандра на 2 канала.

...

Требуется возможность регулировки скважности ...

Скважность меандра не может регулипроваться, она всегда равна 2 и другой не бывает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

nik182 пишет:
Почему не выполнима?

Потому и невыполнима, см. мой пост №10.

сдохля
Offline
Зарегистрирован: 06.11.2016

Спасибо за ответ nik182. Вы дали ответ на один из имеющихся у меня вопросов - на базе ардуино это возможно! Что уже хорошо. Над вопросом в тему "Ищу исполнителя" я задумаюсь.

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

сдохля пишет:

Я без малейшего понятия сколько может стоить 5 дней программиста!

"без малейшего понятия" означает "не знаю" или "не знаю и знать не хочу"?

Если первое - простейшие оценки сделать довольно просто:

1. Нужно знать среднюю зарплату по стране - можно воспользоваться доступными стстистическими данными.

2. Учитывая, что профессия программиста требует квалификации и, кроме того, востребована в настоящее время, можно предположить, что она выше средней. Т.е. нужно ввести коэффициент заметно больше единицы.

3. Квалификация у программистов тоже бывает разная. В данном конкретном случае пллучаем еще один коэффициент существенно больше единицы.

4. Ну и dimax скромно умолчал, что первая версия его генератора не умела изменять скважность. Так что потребовалась переделка, на что было затрачено дополнительное время. Т.е. имеем третий коэффициент больше 1.

5. Ну а теперь нужно вспомнить, чему учили в начальной школе, и перемножить среднюю зарплату за указанный промежуток времени на 3 коэффициена, каждый из которых больше 1.

Цитата:

Ответы в моей теме столь противоречивы, что даже и не знаю - стоит ли продолжать сию ветку!?

Отнюдь.

Все ответы сводились к одной мысли: Вам эта задача не по зубам. И еще долге будет не по зубам.

От себя добавлю: IMHO можно написать программу, которая будет формально удовлетворять всем перечисленным Вами условиям*. Но вполне вероятно, что когда начнутся уточнения, касающиеся шага перестройки частоты или скважности, задача может выйти за пределы возможностей указанных контроллеров.

PS. Особенно умилило то, что для мегагерцовых генераторов требуется задать синхронность с точностью до секунды.

* Примечание: разумеется, кроме "меандра переменной скважности".

nik182
Offline
Зарегистрирован: 04.05.2015

Евгений! Вы формально правы. У меандра скважность всегда двойка. Если изменить скважность это будет уже не меандр. Но всё же импульс останется прямоугольным импульсом как и меандр. Тем более, что в описании задачи слово меандр не фигирирует, фигурирует именно прямоугольный импульс. Т.е. название темы не соответствует Т.З. Но если разделить название от ТЗ, то и первую и вторую задачу решить можно. Можно сделать меандр. Можно сделать прямоугольный импульс с регулируемой скважностью, частным случаем мы получим меандр.     

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Почитал тему и прошу разрешения принять участие.

Я бы на таких частотах решал задачу комбинированно.

То есть задаюший генератор - на контроллере, на таймере.

А вот задержки и скважность - всю целиком на компараторах и RC, а вот задаюшие смещения для всех задержек на RC - формировал бы цифровым образом на контроллере.

Так можно глубину регулирования сделать такой, какую позволит ЦАП, если это ШИМ и фильтр от Ардуино - то 256 шагов, если это и2с ЦАП внешний - то еще точнее.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

добавлю - AD8611  компаратор фронты даст в 2-4 нс и зареджку срабатывания в 4 нс, что на частоте 1-2 МГц - вполне приемлемо (1-2% от периода).

Для формирования задержки и длительности импульса нужно просто взять хорошие прецизионники для R и C. И, конечно, откалиброваться по осцилографу, при настройке.

---------------------------------

вообще готов собрать полностью рабочий макет... на в другой теме на этом форуме. И "это обойдется папаше Дорсету...." далее по тексту ;). (с) -О.Генри, если что, а то современная молодежь уже классику не читает....

гость
Offline
Зарегистрирован: 14.11.2016
void setup() {
 // подпрограмма инициализации
// Serial.begin(9600);  //для наладки
 pinMode(2,OUTPUT);   //ножка порта фазы A
 pinMode(3,OUTPUT);   //ножка порта фазы B
 pinMode(4,OUTPUT);   //ножка порта фазы C

 digitalWrite(2,LOW); //снять сигнал с порта
 digitalWrite(3,LOW);
 digitalWrite(4,LOW);

 //Serial.println("Start");
}

void loop() {
 // подпрограмма основного цикла
  long PhA = 0;     //счетчик-таймер фазы A 
  long PhB = 0;     //счетчик-таймер фазы B
  long PhC = 0;     //счетчик-таймер фазы C
  long TAU = 180*3;   //полупериод меандра (уменьшать для увеличения частоты)   
  char GoA = 1;     //флаг разрешение работы фазы A
  char GoB = 0;     //флаг разрешение работы фазы B
  char GoC = 0;     //флаг разрешение работы фазы C

  //long TestTime = 0;  //для наладки
  
  while(1){
  //TestTime += 1;
  //delay(100);       //задержка для последовательного порта и ограничения кол-ва данных в маткад
  //Serial.print(digitalRead(2));Serial.print(",");
  //Serial.print(digitalRead(3));Serial.print(",");
  //Serial.print(digitalRead(4));Serial.print(",");
  //Serial.println(TestTime);                //строка в мониторе имеет вид A,B,C,time, где А, B, C - состояние ножки порта
  
  if(GoA) PhA += 1;   //начать отсчет по фазе
  if(GoB) PhB += 1;
  if(GoC) PhC += 1;

  if(PhA == 1) {digitalWrite(2,HIGH);}    //установить импульс в фазе A
  if(PhB == 1) {digitalWrite(3,HIGH);}    //установить импульс в фазе B
  if(PhC == 1) {digitalWrite(4,HIGH);}    //установить импульс в фазе C

  if(PhA == TAU) {digitalWrite(2,LOW);}   //снять импульс в фазе A (вот здесь изменять длину импульса - число вместо TAU)
  if(PhB == TAU) {digitalWrite(3,LOW);}   //снять импульс в фазе B
  if(PhC == TAU) {digitalWrite(4,LOW);}   //снять импульс в фазе C

  if(PhA == 2*TAU) PhA = 0;               //период фазы = начало нового цикла (360 градусов)
  if(PhB == 2*TAU) PhB = 0;
  if(PhC == 2*TAU) PhC = 0;

  if((PhA > 0.667 * TAU) && (GoB == 0)) GoB = 1;   //фазовый сдвиг задавать множителем (например 0.167 ~= 30 градусов)
  if((PhB > 0.667 * TAU) && (GoC == 0)) GoC = 1;
  
  }

}

Приветствую. Ниже, рабочий скетч генератора на 3 сигнала с регулировкой сдвига фаз, регулировкой частоты, регулировкой скважности. Благодарностей не надо! Люди должны помогать друг другу. Не все в этой жизни должно быть построено на денежных отношениях! Скетч:

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

гость пишет:

рабочий скетч генератора на 3 сигнала с регулировкой сдвига фаз, регулировкой частоты, регулировкой скважности. 

2-4 МГц, как ТС просил, тянет, чи що?

гость пишет:

Люди должны помогать друг другу. Не все в этой жизни должно быть построено на денежных отношениях! 

Так выпьем же за взаимопомощь!

 

гость
Offline
Зарегистрирован: 14.11.2016

Нет, 2-4 МГЦ не тянет. Достаточно корректно ведет себя до 1500 герц. Человек попросил скетч, рабочую сборку я выложил. При соответствующей доработке имеется возможность довести эту программу до необходимых частот. Вы же тут специалисты!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

гость, а вы знаете толк в юморе.  "При соответсвующей доработке" конечно можно. Делов то всего ничего - МК взять побыстрее, из 32-битных, да и программу под него  совсем другую написать. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

гость пишет:

При соответствующей доработке имеется возможность довести эту программу до необходимых частот. 

Ну-ну, как Высоцкий писал: "Жаль, сады стерегут ..."

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimax пишет:

 Делов то всего ничего

Дык, известно ж: "В кедах можно даже по небу летать, если к ним ещё приделать вертолёт".

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

ssss пишет:

"Миссия невыполнима!"(с).

ну почему? у ардуино DUO тактовая позволяет

гость
Offline
Зарегистрирован: 14.11.2016

Dimax.  Судя по ответам человеку в этой ветке, у вас даже это просто так невозможно получить! Надеюсь, что автору создавшему первый пост моя информация окажется полезной. Удачи вам - специалисты...

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Можно сделать генератор с частотами до 8 МГц для прямоугольного сигнала (меандра). Пример реализации есть в проекте AVR DDS2 (искать в сети). Правда там один канал. Для двух и боллее каналов нужно будет изменить ассемблерный код.

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

П.С. Прочитал про регулировку скважности. Это будет сделать сложнее.

П.С2. Ассемблерный код - это для сигнала произвольной формы. Простой меандр генерируется таймером.

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

гость пишет:

Dimax.  Судя по ответам человеку в этой ветке, у вас даже это просто так невозможно получить! Надеюсь, что автору создавшему первый пост моя информация окажется полезной. Удачи вам - специалисты...

Не поможет! Для этого процессор должен иметь тактовую частоту в 2000 раз больше

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Вот код формирования меандра из проекта AVR DDS2:

void Timer1_Start(uint8_t FMHz)
{
switch(FMHz){
	case 1:
		//start high speed (1MHz) signal
		OCR1A=7;
		break;
	case 2:
		OCR1A=3;//2MHz
		break;
	case 4:
		OCR1A=1;//4MHz
		break;
	case 8:
		OCR1A=0;//8MHz
		break;
	default:
		OCR1A=7;//defauls 1MHz
		break;}
	//Output compare toggles OC1A pin
	TCCR1A=0x40;
	//start timer without prescaler
	TCCR1B=0b00001001;
}

П.С. Ассемблерная вставка в исходниках используется для формирования периодического сигнала произвольной формы, тут это не поможет. Как видно, для меандра используется таймер. Скважность в этом случае менять не получится, разве что в очень грубых пределах, если я правильно помню режимы работы таймеров.

Задачу вашу нужно уточнять, т.е. прямо совсем точно описать. Если вам нужны регулировки скважности или ещё что-то в таком духе на 8 МГц, то сделать это нельзя, т.к. шаг по времени в avr контроллерах измеряется тактовой частотой. Соотв-но изменения сигнала на выводах контроллера можно делать с точностью до периода тактовой частоты.

ssss
Offline
Зарегистрирован: 01.07.2016

ua6em пишет:

ssss пишет:

"Миссия невыполнима!"(с).

ну почему? у ардуино DUO тактовая позволяет

А вот сами попробуйте и потом расскажите.

ssss
Offline
Зарегистрирован: 01.07.2016

uni пишет:

Задачу вашу нужно уточнять, т.е. прямо совсем точно описать. Если вам нужны регулировки скважности или ещё что-то в таком духе на 8 МГц, то сделать это нельзя, т.к. шаг по времени в avr контроллерах измеряется тактовой частотой. Соотв-но изменения сигнала на выводах контроллера можно делать с точностью до периода тактовой частоты.

Если мерзкий джиттер в +- километр не пугает, вдобавок к мозговыносящему коду, то нет преград. Но в целом это будет выглядеть уныло.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

А откуда джиттер? Кто таймер остановит?

Ещё есть вариант использовать какой-нить настоящий DDS генератор вроде AD9850, я видел на картинках, что там есть 2 дискретных выхода (в модуле на их основе).

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

uni, к чему ваш пример? Вы читали первое сообщение ТС? Вы не видите разницы просто в генерировании высокой частоты, и регулировки скважности этой частоты?  Это огромная разница. Регулировка скважности для частоты n  эквивалентна умножению частоты n на количество градаций регулировки скважности. А в некоторых режимах ещё и дополнительно умножить на 2.  Т.е. например что бы регулировать скважность на частоте  2МГц в пределах всего 100 шагов -нужно что бы МК работал на частоте минимум  200  MГц, а лучше 400.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Где про 100 шагов в посте написано? 

Я может быть чего-то не помню, но что нам мешает выставить порог и на максимальной частоте запустить таймер-счётчик? 100 шагов мы не получим, но скважность будет регулироваться на мегагерцах (грубо, но будет). Вы уже проверили, что это не так?

Можно не использовать таймер, есть другой способ - зациклить набор команд управления выводом (почему нет?). Неужели я не смогу при этом разделить 1 мкс на 16 частей? Что мне помешает управлять уровнем на выводе на каждом из этих интервалов?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

uni,  что нужно проверять?  Я на таймерах собаку съел, мне уже ничего проверять не нужно, давно всё считаю в уме.  Количество шагов регулировки скважности  = F_CPU/ частота и  /2   Значит на 2 мегагерцах максимум 4 шага.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

uni пишет:

Можно сделать генератор с частотами до 8 МГц для прямоугольного сигнала (меандра). Пример реализации есть в проекте AVR DDS2 (искать в сети). 

Да, 8-то можно. И примеры далеко искать не надо, вон он на нашем форуме в три строчки валяется - дело-то. Беда в том, что 8 можно, а вот 6 уже проблематично. Следующий после 8 - только 4. Во как :(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

uni пишет:

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

Неправильно помните. При 8 мегагерцах ничерта Вы не поменяете, т.к. длительность высокого (и низкого) сигнала всего один такт. При 4 - длительность 2 такта, уже можете менять :))))

завязывайте. мужики, очевидно же всё ... Курам на смех. Уже авторы блинков начали сомнения высказывать, что мы с Вами на блинк способны :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

uni пишет:

Что мне помешает управлять уровнем на выводе на каждом из этих интервалов?

На мегагерцах? Что-нибудь да помешает. Если Клапауций не запретит, так Камасутра вмешается.

Вы такты на пальцах посчитайте. И скажите какова будет разрядность Вашего ШИМа. Какова на 8МГц, на 4МГц, на 2МГц, на 1МГц?  Посчитайте разряды на пальцах, а потом уж управляйте.

Ну, а про зацикленные команды, тут ещё смешнее. Просто посчитайте такты и скажите какую частоту Вы на них получите.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015
void setup() 
{
	DDRB = 0xFF;
}


void loop() 
{
	while ( true )
	{
		PORTB = ( 1 << PB4 );
		PORTB = ( 1 << PB4 );
		PORTB = ( 1 << PB4 );
		PORTB = ( 1 << PB4 );
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
	}
}

 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

сдохля пишет:

Здравствуйте dimax.

Попросил бы естественно помощи в написании такой программы.Частоту можно опустить до 1 МГЦа. Я занимаюсь саморазвитием. Приобрел литературу по программированию ардуино. Мой проект не коммерчесский, для личного пользования.

Для указанного 1 МГц мы можем выдавать на все выводы порта B прямоугольный сигнал с регулируемой скважностью. Регулировать можно программно, если принудительно переходить на setup() из какого-нибудь прерывания. Длительность импульса можно изменять от 62.5 нс до 13 * 62.5 нс с дискретом 62.5 нс (период равен 1 мкс).

Logik
Offline
Зарегистрирован: 05.08.2014

Да uni! Ногодрыгом можна сделать все, что только можна. Налепить таких фрагментиков, за 16 тактов поменять состояния на 2-х пинах 2 раза и выполнить переход на начало как раз получится. Даже с проверкой условия генерируем или уходим на код регулирования параметров. 

Так провалилась очередная рекламная акция в исполнении эсэсовца ;)  Быстрей надо было предлагать, то что обычно предлагаете ;)

сдохля, а для каких таких прикладных целей Вы решили мосфеты на 1МГц использоват?

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

В далёком прошлом, когда народ только осваивал AT90S2313 я писал только на avr ассемблере. Кое-какие знания остались (собак не ем). Может кто помнит, в AT90S1200 вообще был аппартный трёхуровневый стек. Так вот "впихивать невпихуемое" меня заставляла жизнь.

Я хотел лишь показать, что в принципе можно всякое, но всё равно нужно закладывать ресурсы под задачу.

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

Ногодрыгом можна сделать все, что только можна. Налепить таких фрагментиков, за 16 тактов поменять состояния на 2-х пинах 2 раза и выполнить переход на начало как раз получится. Даже с проверкой условия генерируем или уходим на код регулирования параметров. 

Да не вопрос! Пиши уже свой код ногодрыжный, а я поржу с тебя. ))))))))))))))

Logik
Offline
Зарегистрирован: 05.08.2014

ssss пишет:

Logik пишет:

Ногодрыгом можна сделать все, что только можна. Налепить таких фрагментиков, за 16 тактов поменять состояния на 2-х пинах 2 раза и выполнить переход на начало как раз получится. Даже с проверкой условия генерируем или уходим на код регулирования параметров. 

Да не вопрос! Пиши уже свой код ногодрыжный, а я поржу с тебя. ))))))))))))))

Ты и так ржеш по жизни, чего тебя в истерику вгонять. Усцышся еще. 

ssss
Offline
Зарегистрирован: 01.07.2016

А ты не припадай губами к фонтанчику. )))))))))))))))

Осталось реализовать всё остальное. Могёшь? Дерзай, а не дерзи! )))))))))))))))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

uni пишет:

void setup() 
{
	DDRB = 0xFF;
}


void loop() 
{
	while ( true )
	{
		PORTB = ( 1 << PB4 );
		PORTB = ( 1 << PB4 );
		PORTB = ( 1 << PB4 );
		PORTB = ( 1 << PB4 );
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
		PORTB = 0x00;
	}
}

Ну, вот Вы всё и доказали. Всего-то 1.25МГц при убогих 14 градациях ШИМ и удлиннённом низком сигнале за счёт накладных расходов цикла. Да ещё и при целиком засранном порте (но от этого-то избавиться можно).

Что Вам тут и объясняли.

Ну и при каких мегагерцах Вы собрались рулить скважность? При одном с 14 градациями?

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Я тут единственный, кто смог предложить работающий код, увы.

Евгений, человек попросил 1 МГц, 2 одновременно срабатывающих вывода, управление скважностью. Если хотите смещать положение импульсов относительно друг друга, то можно выдавать в порт другие константы. Остальное уже зависит от схемы и уточнения ТЗ.

Зачем сюда ШИМ приплетать? И причём тут засранный порт? Это инженерная задача и она имеет плюсы и минусы. Плюс в том, что out в отличие от sbi/cbi работает за 1 цикл. Вроде очевидно, что я хотел получить более широкий диапазон регулирования, используя особенности системы команд. Мы жертвуем выводами порта, это минус, но зато можно регулировать относительное положение импульсов на выводах порта.

Ограничения на дискретность изменения длительности импульса заданы не были.

ssss
Offline
Зарегистрирован: 01.07.2016

ЕвгенийП пишет:

Ну, вот Вы всё и доказали. Всего-то 1.25МГц при убогих 14 градациях ШИМ и удлиннённом низком сигнале за счёт накладных расходов цикла. Да ещё и при целиком засранном порте (но от этого-то избавиться можно).

Что Вам тут и объясняли.

Вот-вот!

2Logik

А вот как примерно это будет выглядеть на СТМ32. 3 х энкодера, всё аппаратно, 3 х  таймера для двух сигналов и генерации сдвига между ними, всё аппаратно, 2 х таймера и ДМА для крупненького ТФТ для вывода всей информации, если нет ФСМЦ, по сути тоже аппаратно. Остальные хотелки по остаткам ресурсов. Ну там частотомер на несколько каналов, фоторамка, чего ТФТэшнику зря простаивать, ФМ-приёмничек можно притулить, температура и влажность по вкусу и пр. 

Работы на 2-3 вечера и неспеша, под сигарету и кофе. Дизайн и корпус могут отнять времени больше.

ssss
Offline
Зарегистрирован: 01.07.2016

uni пишет:

Мы жертвуем выводами порта, это минус, но зато можно регулировать относительное положение импульсов на выводах порта.

Вы жертвуете большим - временем и нервами. Когда начнёте это всё совмещать, путаться в тактах, тогда и поймёте.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Может покажите где я в тактах ошибся? Или расскажите что такое удлинённый низкий сигнал? :)

Попробуйте сформировать видеосигнал при помощи avr, потом будете мне советы давать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

uni пишет:

Я тут единственный, кто смог предложить работающий код, увы.

В том, что Вы тут самый умный, никто не смоневается.

uni пишет:

человек попросил 1 МГц, 2 одновременно срабатывающих вывода

А вот это некрасиво! Ну, зачем лгать коллегам, тем более, что в самом начале темы чёрным по белому написано

сдохля пишет:

нужно создать генератор прямоугольных импульсов на 2 канала, с частотой до 2-4 МГЦ по каждому. 

Нехорошо!

uni пишет:

Ограничения на дискретность изменения длительности импульса заданы не были.

Да? ну, а как инженер Вы считаете такую дискретность приемлемой? Если так, то это я принимаю Ваш аргумент.

uni пишет:

Может покажите где я в тактах ошибся? Или расскажите что такое удлинённый низкий сигнал? :)

Да, не вопрос.

1. Ваш цикл совем не занимает времени на свои накладные расходы? Или он таки сколь-то тактов кушает? Вы эти такты учли, я надеюсь?

2. Если Вы посидите возле своего творения с осциллографом, Вы обнаружите странное явление. Некоторые сигналы вдруг становятся шире остальных. Иногда это низкие сигналы, иногда высокие - как повезёт. И происходит это каждые 16 микросекунд 4 микросекунды (виноват, бес попутал). Поисследуйте, посмотрите. Найдите объяснение этому феномену.

А советов я Вам не даю, Боже упаси. Просто обсуждаю Ваше творение. Могу прекратить в любой момент, если поступит от Вас такая просьба.