Генератор сигналов
- Войдите на сайт для отправки комментариев
Вс, 08/03/2020 - 17:58
Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.
Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.
инвертировать надо в МК.
инвертировать надо в МК.
инвертировать надо в МК.
ага, похоже.
И в чем проблема? Настраиваете таймер в СТС режиме на нужную частоту, а в прерывании инвертите нужные выходы, один или 2 канала или 8 -какая разница?
честно.. знаний не хватает
Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.
с каким шагом частоты?
Про СТС в даташите что-то было написано насчёт того, что обработчик не вызывается при каких-то событиях. А в принципе там любой режим потянет.
Господа, помогите с решением вопроса. Кодов Генераторов разных много, но у меня задача немного сложнее чем снять меандр с платы. Нужно с двух выводов получать меандр с другого инвертированный сигнал (в противофазе). диапазон частот 20-60 кГц. Заранее спасибо за помощь.
с каким шагом частоты?
перестройка желательна с шагом не более 1кГц (это по возможности)
При делителе 8 в районе 60 кгц шаг будет порядка 1.5 кгц, чем ниже частота, тем шаг мельче и частота точнее
Найдите в Проектах скетч генератора и разберите первые версии в качестве примера, там ранние версии были попроще и основывались на МК серий АВР
Всё даже ещё проще! Там есть аппаратное инвертирование ШИМа. на один выход подаёшь нормальный ШИМ, на другой инвертированный и все дела - всё аппаратно, никаких программных действий, кроме конфигурации ШИМа
Уважаемый, ЕвгенийП можно попросить пример как это реализуется?
Уважаемый, ЕвгенийП можно попросить пример как это реализуется?
Да, мог бы я, конечно, мог. Вы не поверите, но даже настроение есть это сделать.
Но, Вы ж блин, уже три года на форуме и ... ну как Вы задаёте вопрос? Вы ведь даже не сказали какая ардуина у Вас! Я сейчас буду корячиться Вам пример писать, потрачу час на пример для уно, а Вы мне скажете - гуляй, Вася, у меня дуе или там леонардо.
Это уже блин утановившая традиция на этом на этом форуме, человек ленится написать лишние несколько букв и внятно сформулировать вопрос, а потом обижается, когда ему на это указывают и всех мудаками называет.
ЕвгенийП, не нужно негатив переносить из ветки в ветку ;) я в проектах использую МК ATmega168, можно на ардуино мини ориентироваться. Если не затруднит и в загашнике есть написанный кусочек кода который можно использовать как пример, то поделитесь пожалуйста.
Всем добра!
ЕвгенийП, не нужно негатив переносить из ветки в ветку ;) я в проектах использую МК ATmega168, можно на ардуино мини ориентироваться.
ничего не меняется от ветки к ветке ! :)))
тактирование, напряжение питания ... ?
Всё даже ещё проще! Там есть аппаратное инвертирование ШИМа. на один выход подаёшь нормальный ШИМ, на другой инвертированный и все дела - всё аппаратно, никаких программных действий, кроме конфигурации ШИМа
думаю. что для случая "ШИм с изменяемой частотой" этот варинт не подходит, ведь инвертирование ШИМа работает только на 5 фиксированных частотах, задаваемых прескалером и максимальной размерностью таймера...
думаю. что для случая "ШИм с изменяемой частотой" этот варинт не подходит, ведь инвертирование ШИМа работает только на 5 фиксированных частотах, задаваемых прескалером и максимальной размерностью таймера...
Нет, это не так. На 16-битном таймере (первом) можно включить ШИМ так, чтобы он работал не до максимального значения таймера, а до нами заданного (там есть такой ICR1 - вот в него и пихаем свое максимальное значение). Тогда всё тип-топ - устанавливайте любую частоту в пределах разумного, т.к. в Вашем распоряжении и делитель частоты и полный 16-битный регистр. Ниже я приведу пример для 328 в её самом аккуратном режиме "Phase and Frequency Correct PWM".
На восьмибитных таймерах такое теоретически тоже можно, но там головной боли гораздо больше. Там нет специального регистра ICR0 / ICR2 и это делается через OCR2A, ... в общем я как-то полез, сходу не разобрался, а трахаться не захотел - не так уж и нужно было. При случае можно будет у Димакса спросить, он наверняка знает.
Другое дело, что я тут подумал - так как Вы предлагали - лучше. А лучше тем, что можно использовать любые пины, а с PWM - только специальные.
Вот пример, с ШИМ-ом произвольной частоты на первом таймере 328-ой.
Частота задаётся делителем (prescaler) (это единичка в строке №7, можете там свой делитель поставить, какой нужен) и значением регистра ICR1
Коэффициент заполнения задаётся в строке №9 от 0 до ICR1-1, т.е. если хотите меандр, то там должно быть ровно половина от значения ICR1.
P.S. Может, стоило бы ещё TCNT1 чё-нить присвоить, типа 0.
Картинко с осциллографа:
О! а я по наивности считал, что достаточно этого, ан нет оказывается...
ЕвгенийП, нашел вашу статью 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В при совпадении
но все равно не понятно как же сделать два сигнал в противофазе.
Ничего не понял, а Вы мой пример из #18 запускали? Разве там не "два сигнала в противофазе" на 9-м и 10-м пинах? Что ещё делать-то надо?
ссорян. я просто сразу не понял что там реализован сдвиг по фазе. сейчас попробую. Спасибо, ЕвгенийП.
П.С. на 10 пине сигнал 20 кГц скважность 50
на 11 пине сигнал есть но очень маленький по амплитуде - 100 мВ
на 9 тишина
С частотой, да, это была глубокая ночь и я ошибся в два раза (уже поменял в том посте, теперь 40кГц, как планировалось).
А с остальным, не знаю, я сейчас не дома, потому моделировал в протеусе. Там всё нормально. На реальном железе могу посмотреть, когда домой вернусь, если у Вас до этого проблема не снимется.
Кстати, это для 328! Вы заметили?
Вот скриншот из протеуса. Вроде, всё как и должно быть.
mrWang,
всё, разобрались. Добрался до ардуины и осциллографа и всё проверил.
Действительно, в протеусе кривая модель. Я поправил код в посте #18, теперь там всё правильно. Работает хорошо и в железе, и в протеусе.
Я добавил туда ещё и картинку с осциллографа.
отлично! вот с реального железа. работает как надо.
Спасибо!!!
отлично! вот с реального железа. работает как надо.
Ещё раз возьмите код, я там второпях намудрил. Сейчас всё проще и короче. С приезда сразу, что-то засуетился
да, действительно локоничнее код получился. я так понимаю пересчет частоты идет с значения переменной ICR1
Частота задаётся делителем (prescaler) (это единичка в строке №7, можете там свой делитель поставить, какой нужен) и значением регистра ICR1
ЕвгенийП, а зачем Вы туда FOC1A засунули? Следы путаете? ))
значение регистра ICR1=(8000000/нужная частота)-1 примерно так выходит при прискалере1
ЕвгенийП, а зачем Вы туда FOC1A засунули? Следы путаете? ))
Так, убрал же ж уже! Обновите страницу! Засуетился малёх с приезда, задёргался. Кривая протеусная модель напугала.
значение регистра ICR1=(8000000/нужная частота)-1 примерно так выходит при прискалере1
Не, ну Вы считайте по-человечески. Чего Вы эмпирически дёргаетесь.
Период равен значению ICR1, умноженному на два и на на длительность тика таймера. Длительность тика равна периоду тактовой частоты МК, умноженному на значение делителя частоты. Делитель может быть один из пяти: 1, 8, 64, 256 и 1024. В строке №7 надо соответственно писать номер делителя - цифирьки от 1 до 5.
Вот и всё, а когда Вы точно знаете период, частоту, надеюсь посчитаете.
ЕвгенийП, а зачем Вы туда FOC1A засунули? Следы путаете? ))
Так, убрал же ж уже! Обновите страницу! Засуетился малёх с приезда, задёргался. Кривая протеусная модель напугала.
Боюсь, что не до конца. ^F5 не помогает даже.
Я, канеш, понимаю, что там COM1A1 должен быть... и всё сработает даже с FOC1A, но вдруг Вы красиво таки любите. Опять же - собираюсь утащить этот случай в тему про PWM, сложить в кучку к другим.
Боюсь, что не до конца.
Тваю ж дивизию, как выражается Ворота, и правда! Спасибо! Поправил ещё раз.
До чего ж не счастливый код - пятый раз меняю. Нельзя делать второпях.
а что могло повлиять на скважность,такая картинка появилась после добавления
если в loop(void) задать ICR1 = 200; то все нормально
До чего ж не счастливый код - пятый раз меняю. Нельзя делать второпях.
я бы еще строчку 7 записал бы канонически :)
я бы еще строчку 7 записал бы канонически :)
Ну, Вы же понимаете, что в реальном коде у меня не число, а вызов constexpr функции из воротной библиотеки, которая сама всё считает. А для выкладывания сюда, чтобы библиотеку не тащить, а просто напечатал значения.
Да, на самом деле канонически тут не так писать, а определить константы DIV8, DIV64 и т.п. - так намного нагляднее, чем CSx
Дальнейшие эксперименты показали что скважность 50% только на частоте 40 кГц, если уходить от нее в сторону то скавжность изменяется.
а что могло повлиять на скважность
Скважность задаётся в строке №9 и если хотите меандр, то там должно быть ровно половина от значения ICR1.
Вы, это, даташит-то читайте, а то мать-терезистость уже заканчивается.
Дальнейшие эксперименты показали что скважность 50% только на частоте 40 кГц, если уходить от нее в сторону то скавжность изменяется.
Вот и я ж про то говорю. Если менять ICR1 не меняя значения скважности, то оно так и получается.
Вы бы не методом тыка меняли, а постарайтесь понять как оно работает. В 9-ой строке можно задавать число от 0 до значения ICR1 - оно и определяет скважность.