Генератор сигналов

mrWang
Offline
Зарегистрирован: 19.03.2017

Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.

SLKH
Offline
Зарегистрирован: 17.08.2015

mrWang пишет:

Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.

1 транзистор с парой резисторов.

mrWang
Offline
Зарегистрирован: 19.03.2017

инвертировать надо в МК.

SLKH
Offline
Зарегистрирован: 17.08.2015

mrWang пишет:

инвертировать надо в МК.

т.е нужны "шашечки"? 

mrWang
Offline
Зарегистрирован: 19.03.2017

SLKH пишет:

mrWang пишет:

инвертировать надо в МК.

т.е нужны "шашечки"? 

ага, похоже.

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

И в чем проблема? Настраиваете таймер в СТС режиме на нужную частоту, а в прерывании инвертите нужные выходы, один или 2 канала или 8 -какая разница?

mrWang
Offline
Зарегистрирован: 19.03.2017

честно.. знаний не хватает

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

mrWang пишет:

Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.

с каким шагом частоты?

sadman41
Offline
Зарегистрирован: 19.10.2016

Про СТС в даташите что-то было написано насчёт того, что обработчик не вызывается при каких-то событиях. А в принципе там любой режим потянет.

mrWang
Offline
Зарегистрирован: 19.03.2017

ua6em пишет:

mrWang пишет:

Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.

с каким шагом частоты?

перестройка желательна с шагом не более 1кГц (это по возможности)

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

При делителе 8 в районе 60 кгц шаг будет порядка 1.5 кгц, чем ниже частота, тем шаг мельче и частота точнее

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

Найдите в Проектах скетч генератора и разберите первые версии в качестве примера, там ранние версии были попроще и основывались на МК серий АВР

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

b707 пишет:
а в прерывании инвертите нужные выходы

Всё даже ещё проще! Там есть аппаратное инвертирование ШИМа. на один выход подаёшь нормальный ШИМ, на другой инвертированный и все дела - всё аппаратно, никаких программных действий, кроме конфигурации ШИМа

mrWang
Offline
Зарегистрирован: 19.03.2017

Уважаемый, ЕвгенийП можно попросить пример как это реализуется?

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

mrWang пишет:

Уважаемый, ЕвгенийП можно попросить пример как это реализуется?

Да, мог бы я, конечно, мог. Вы не поверите, но даже настроение есть это сделать.

Но, Вы ж блин, уже три года на форуме и ... ну как Вы задаёте вопрос? Вы ведь даже не сказали какая ардуина у Вас! Я сейчас буду корячиться Вам пример писать, потрачу час на пример для уно, а Вы мне скажете - гуляй, Вася, у меня дуе или там леонардо.

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

mrWang
Offline
Зарегистрирован: 19.03.2017

ЕвгенийП, не нужно негатив переносить из ветки в ветку ;) я в проектах использую МК ATmega168, можно на ардуино мини ориентироваться. Если не затруднит и в загашнике есть написанный кусочек кода который можно использовать как пример, то поделитесь пожалуйста.

Всем добра!

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

mrWang пишет:

ЕвгенийП, не нужно негатив переносить из ветки в ветку ;) я в проектах использую МК ATmega168, можно на ардуино мини ориентироваться. 

ничего не меняется от ветки к ветке ! :))) 

тактирование, напряжение питания ... ?

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

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

b707 пишет:
а в прерывании инвертите нужные выходы

Всё даже ещё проще! Там есть аппаратное инвертирование ШИМа. на один выход подаёшь нормальный ШИМ, на другой инвертированный и все дела - всё аппаратно, никаких программных действий, кроме конфигурации ШИМа

думаю. что для случая "ШИм с изменяемой частотой" этот варинт не подходит,  ведь инвертирование ШИМа работает только на 5 фиксированных частотах, задаваемых прескалером и максимальной размерностью таймера...

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

b707 пишет:

думаю. что для случая "ШИм с изменяемой частотой" этот варинт не подходит,  ведь инвертирование ШИМа работает только на 5 фиксированных частотах, задаваемых прескалером и максимальной размерностью таймера...

Нет, это не так. На 16-битном таймере (первом) можно включить ШИМ так, чтобы он работал не до максимального значения таймера, а до нами заданного (там есть такой ICR1 - вот в него и пихаем свое максимальное значение). Тогда всё тип-топ - устанавливайте любую частоту в пределах разумного, т.к. в Вашем распоряжении и делитель частоты и полный 16-битный регистр. Ниже я приведу пример для 328 в её самом аккуратном режиме "Phase and Frequency Correct PWM".

На восьмибитных таймерах такое теоретически тоже можно, но там головной боли гораздо больше. Там нет специального регистра ICR0 / ICR2 и это делается через OCR2A, ... в общем я как-то полез, сходу не разобрался, а трахаться не захотел - не так уж и нужно было. При случае можно будет у Димакса спросить, он наверняка знает.

Другое дело, что я тут подумал - так как Вы предлагали - лучше. А лучше тем, что можно использовать любые пины, а с PWM - только специальные.

Вот пример, с ШИМ-ом произвольной частоты на первом таймере 328-ой.

// 40kHz Phase and Frequency Correct PWM inverted on pins 9 and 10
void setup(void) {
	pinMode(9, OUTPUT);
	pinMode(10, OUTPUT);
	cli();
	TCCR1A = bit(COM1A0) | bit(COM1A1) | bit(COM1B1);
	TCCR1B = bit(WGM13) | 1;
	ICR1 = 200;
	OCR1A = OCR1B = 100;
	sei();
}

void loop(void) {}

Частота задаётся делителем (prescaler) (это единичка в строке №7, можете там свой делитель поставить, какой нужен) и значением регистра ICR1

Коэффициент заполнения задаётся в строке №9 от 0 до ICR1-1, т.е. если хотите меандр, то там должно быть ровно половина от значения ICR1.

P.S. Может, стоило бы ещё TCNT1 чё-нить присвоить, типа 0.

Картинко с осциллографа:

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

О! а я по наивности считал, что достаточно этого, ан нет оказывается...
 

TCCR1A = bit(COM1A0) | bit(COM1B1);

 

mrWang
Offline
Зарегистрирован: 19.03.2017

ЕвгенийП, нашел вашу статью http://arduino.ru/forum/programmirovanie/shim-proizvolnogo-razresheniya-na-unonano-328

судя по всему вопрос близкий по теме

еще интересная библиотечка нашлась у Гайвера https://github.com/AlexGyver/GyverLibs/tree/master/directTimers

в ней вроде есть PHASECORRECT PWM

в частности определены:

#define INVERT_PWM 22 // выход генерирует инвертированный шим >>> 0В при сбросе таймера, +5В при совпадении

#define NORM_PWM 21 // выход генерирует шим >>> +5В при сбросе таймера, 0В при совпадении

но все равно не понятно как же сделать два сигнал в противофазе.

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

mrWang пишет:
но все равно не понятно как же сделать два сигнал в противофазе.

Ничего не понял, а Вы мой пример из #18 запускали? Разве там не "два сигнала в противофазе" на 9-м и 10-м пинах? Что ещё делать-то надо?

mrWang
Offline
Зарегистрирован: 19.03.2017

ссорян. я просто сразу не понял что там реализован сдвиг по фазе. сейчас попробую. Спасибо, ЕвгенийП.

 

П.С. на 10 пине сигнал 20 кГц скважность 50

на 11 пине сигнал есть но очень маленький по амплитуде - 100 мВ

на 9 тишина

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

С частотой, да, это была глубокая ночь и я ошибся в два раза (уже поменял в том посте, теперь 40кГц, как планировалось).

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

Кстати, это для 328! Вы заметили?

Вот скриншот из протеуса. Вроде, всё как и должно быть.

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

mrWang,

всё, разобрались. Добрался до ардуины и осциллографа и всё проверил.

Действительно, в протеусе кривая модель. Я поправил код в посте #18, теперь там всё правильно. Работает хорошо и в железе, и в протеусе. 

Я добавил туда ещё и картинку с осциллографа.

mrWang
Offline
Зарегистрирован: 19.03.2017

отлично! вот с реального железа. работает как надо.

Спасибо!!!

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

mrWang пишет:

отлично! вот с реального железа. работает как надо.

Ещё раз возьмите код, я там второпях намудрил. Сейчас всё проще и короче. С приезда сразу, что-то засуетился

mrWang
Offline
Зарегистрирован: 19.03.2017

да, действительно локоничнее код получился. я так понимаю пересчет частоты идет с значения переменной ICR1

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

Частота задаётся делителем (prescaler) (это единичка в строке №7, можете там свой делитель поставить, какой нужен) и значением регистра ICR1

sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП, а зачем Вы туда FOC1A засунули? Следы путаете? ))

mrWang
Offline
Зарегистрирован: 19.03.2017

значение регистра ICR1=(8000000/нужная частота)-1 примерно так выходит при прискалере1

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

sadman41 пишет:

ЕвгенийП, а зачем Вы туда FOC1A засунули? Следы путаете? ))

Так, убрал же ж уже! Обновите страницу! Засуетился малёх с приезда, задёргался. Кривая протеусная модель напугала.

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

mrWang пишет:

значение регистра ICR1=(8000000/нужная частота)-1 примерно так выходит при прискалере1

Не, ну Вы считайте по-человечески. Чего Вы эмпирически дёргаетесь.

Период равен значению ICR1, умноженному на два и на на длительность тика таймера. Длительность тика равна периоду тактовой частоты МК, умноженному на значение делителя частоты. Делитель может быть один из пяти: 1, 8, 64, 256 и 1024. В строке №7 надо соответственно писать номер делителя - цифирьки от 1 до 5.

Вот и всё, а когда Вы точно знаете период, частоту, надеюсь посчитаете.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

sadman41 пишет:

ЕвгенийП, а зачем Вы туда FOC1A засунули? Следы путаете? ))

Так, убрал же ж уже! Обновите страницу! Засуетился малёх с приезда, задёргался. Кривая протеусная модель напугала.

Боюсь, что не до конца. ^F5 не помогает даже.

Я, канеш, понимаю, что там COM1A1 должен быть... и всё сработает даже с FOC1A,  но вдруг Вы красиво таки любите. Опять же - собираюсь утащить этот случай в тему про PWM, сложить в кучку к другим.

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

sadman41 пишет:

Боюсь, что не до конца.

Тваю ж дивизию, как выражается Ворота, и правда! Спасибо! Поправил ещё раз.

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

mrWang
Offline
Зарегистрирован: 19.03.2017

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

void loop(void) {
  freq = (8000000 / 20000) - 1;
  ICR1 = freq;
}

 

если в loop(void) задать ICR1 = 200; то все нормально

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

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

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

я бы еще строчку 7 записал бы канонически :)

 TCCR1B = bit(WGM13) | bit(CS10);

 

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

b707 пишет:

я бы еще строчку 7 записал бы канонически :)

 TCCR1B = bit(WGM13) | bit(CS10);

Ну, Вы же понимаете, что в реальном коде у меня не число, а вызов constexpr функции из воротной библиотеки, которая сама всё считает. А для выкладывания сюда, чтобы библиотеку не тащить, а просто напечатал значения.

Да, на самом деле канонически тут не так писать, а определить константы DIV8, DIV64 и т.п. - так намного нагляднее, чем CSx

mrWang
Offline
Зарегистрирован: 19.03.2017

Дальнейшие эксперименты показали что скважность 50% только на частоте 40 кГц, если уходить от нее в сторону то скавжность изменяется.

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

mrWang пишет:

а что могло повлиять на скважность

Скважность задаётся в строке №9 и если хотите меандр, то там должно быть ровно половина от значения  ICR1.

Вы, это, даташит-то читайте, а то мать-терезистость уже заканчивается.

mrWang пишет:

Дальнейшие эксперименты показали что скважность 50% только на частоте 40 кГц, если уходить от нее в сторону то скавжность изменяется.

Вот и я ж про то говорю. Если менять ICR1 не меняя значения скважности, то оно так и получается.

Вы бы не методом тыка меняли, а постарайтесь понять как оно работает. В 9-ой строке можно задавать число от 0 до значения ICR1 - оно и определяет скважность.