Как получить скважность N=3 прерываниями с библиотекой по примеру.

Slomanaya Strela

✩✩✩✩✩✩✩
14 Авг 2020
19
0
Есть пример генерация 2х тактного меандра но там скважность 2.
https://alexgyver.ru/lessons/timer-isr/
На рисунке инвертированы первые 4, это будет сделано транзисторным ключем. Первый 90 гц, 2,3,4-10080 гц.
Я бы и на МЕГА выделил таймер 3-х канальный, и еще один под 90гц. Пока просто не понимаю как скважность 3 получить на 2-х каналах НАНО, и сдвиг на время импульса. Постоянная генерация. Пока не зависящая не от чего, и от основного кода. Спасибо!
Пауза равна два времени импульса.
C++:
// Пример генерации двухтактного меандра на таймере 2 (пины D3 и D11)
#include "GyverTimers.h"

void setup() {
  pinMode(3, OUTPUT);                           // настроить пин как выход
  pinMode(11, OUTPUT);                          // настроить пин как выход

  // из-за особенности генерации меандра таймером
  // частоту нужно указывать в два раза больше нужной!
  Timer2.setFrequency(15000 * 2);               // настроить частоту в Гц и запустить таймер. Меандр на 15 кГц
  Timer2.outputEnable(CHANNEL_A, TOGGLE_PIN);   // в момент срабатывания таймера пин будет переключаться
  Timer2.outputEnable(CHANNEL_B, TOGGLE_PIN);   // в момент срабатывания таймера пин будет переключаться
  Timer2.outputState(CHANNEL_A, HIGH);          // задаём начальное состояние пина 11
  Timer2.outputState(CHANNEL_B, LOW);           // задаём начальное состояние пина 3
}

void loop() {
}
 

Вложения

Изменено:

bort707

★★★★★★✩
21 Сен 2020
2,926
868
"скважность N=3" это что такое? Скважность измеряется в процентах и она всегда менее 1.

Что касается библиотеки - насколько я вижу из описания, она не поддерживает режим ШИМ и значит скважность на ней может быть только 50%
Пишите без библиотеки, мануалов по настройке таймеров в МК АВР - полно
 

Slomanaya Strela

✩✩✩✩✩✩✩
14 Авг 2020
19
0
Пауза равна два времени импульса. В процентах это тогда так наверное будет 1/3*100%. Или так 33,(3)% (тридцать три и три в периоде).
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
3,058
906
4 сигнала на трёх таймерах можно получить лишь используя прерывания. Т.е., если ничто больше код серьёзно не блокирует. Или внешними цепями. (ответ - с моей точки зрения)
 

Slomanaya Strela

✩✩✩✩✩✩✩
14 Авг 2020
19
0
Внешней цепью эта задачка решается двумя счетчиками делителями К155ИЕ4 по схеме, но для меня два счетчика и противофазный меандр. Точки B и C. Или по схеме, там есть третья фаза на точке Х-. И в этой схеме сигнал будет точно N=3 (1/3*100, 33,(3)) без программного округления.
 

Вложения

Изменено:

poty

★★★★★★✩
19 Фев 2020
3,058
906
@Slomanaya Strela, что будет процессор ещё делать? Если он только для генерации этих сигналов предназначен, то реально можно сделать обработку в прерываниях.
Сколько выводов есть свободных? Трёхфазный меандр можно получить на трёх выводах с помощью TOGGLE_PIN + сдвиг фазы и логикой на выходе, 90Гц - на четвёртом. Но придётся задействовать все таймеры (millis и micros работать не будут).
 

poty

★★★★★★✩
19 Фев 2020
3,058
906
@Геннадий П, если они есть. На нано 3 таймера, каждый может управлять двумя выводами. Допустим, 1-ый таймер управляет первыми двумя фазами, 2-ой - третьей фазой. Если убить третий на 90Гц, то убиваем millis.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,881
604
44
@poty, Я точно не знаю как на меге это делается. На СТМ например просто включаешь таймер на прерывание и в прерывании просто пишешь логику какой вывод включать/выключать в конкретную фазу.
 

poty

★★★★★★✩
19 Фев 2020
3,058
906
@Геннадий П, здесь на нано хотят сделать. И эта опция (с прерываниями) доступна и здесь, просто резко падает производительность.
 

Slomanaya Strela

✩✩✩✩✩✩✩
14 Авг 2020
19
0
Процессор еще будет опрашивать кнопки (минимум 3-4) считывать данные с модуля точного времени и 2х-3х датчиков. И выдавать сигналы индикации на 7 ног. Где место для шрифтов я вообще не представляю пока. А это только непрерывная система управления. Я пока такое решение нашел. С внешней цепью. Код грязный, извините, на примерах. Но решение совсем простое и схема рабочая, проверял. Там от 60до120гц можно, с шириной импульса 320-400мксек но между ними должно влетать 111 импульсов с трех линий по 37 импульсов с линии. Схемка еще позволяет синхронизировать. Пока вот с одной линии подобрал частоту 6900 так что, 37 импульсов входят.
C++:
// Пример генерации двухтактного меандра на таймере 2 (пины D3 и D11)
#include "GyverTimers.h"
#include "GyverPWM.h"

void setup() {
  pinMode(3, OUTPUT);                           // настроить пин как выход
  pinMode(11, OUTPUT);                          // настроить пин как выход
  pinMode(9, OUTPUT);                           // настроить пин как выход
  pinMode(10, OUTPUT);                          // настроить пин как выход

  // из-за особенности генерации меандра таймером
  // частоту нужно указывать в два раза больше нужной!
 
  PWM_square_D9(6900);

  PWM_mode(3, 0);       // установить режим работы таймера 1 в Fast PWM. Частота будет 15.6 кГц (см. таблицу №2 в GyverPWM.h)
  // режим автоматически будет установлен для пина D10!
  PWM_prescaler(3, 7);  // установить частоту ШИМ на пине D9 равной 7.8 кГц (см. таблицу №2 в GyverPWM.h)
  // частота автоматически будет установлена для пина D10!
 
}

void loop() {
 
  analogWrite(3, 4);
 
}
 

Вложения