Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Частота 20-100 Гц, и отдельно ШИМ на мотор

Пн окт 24, 2022 19:46:50

Привет знатоки. )))

Есть у меня Ардуино НАНО.
Необходимо арудиновскими методами создать фигню с тремя потенциомметрами: частота мигания ленты светодиодов, частота щелкания электромагнитным клапаном, скорость вращения насоса.
Ну и выходы, которые регулируются: лента светодиодов, электромагнитный клапан, насос.

Частота мигания светодиодов и клапана от 20 до 100 Гц, каждому отдельно настраивается. Частота ШИМ для мотора насоса пофигу.

На обычном бы МК настроил таймеры, прерывания. Здесь надо максимально просто сделать. Делаи не подходят естественно. ШИМ для светодиодов тоже, хотелось бы чтобы просто частота менялась, причем вот так меделено.

На данный момент настроил порты и читаю значения с потенциомметров так:
Код:
LED = map((analogRead(PIN_POTLED)), 0, 1024, 0, 255);
MAGNET = map((analogRead(PIN_POTMAGNET)), 0, 1024, 0, 255);
MOTOR = map((analogRead(PIN_POTMOTOR)), 0, 1024, 0, 255);



Вот есть пример для ШИМ, но это не то, что нужно. Т.к. ШИМ здесь 200 Гц что ли прмерно и мне надо менять частоту, а не заполнение.


А, ну да, для мотора могу так использовать.

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Пн окт 24, 2022 20:08:44

Библиотека Тimer1. Все уже сделано, легко используется.
Timer1 based PWM in Arduino Uno
Последний раз редактировалось veso74 Вт окт 25, 2022 11:17:08, всего редактировалось 2 раз(а).

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт окт 25, 2022 00:37:43

Я бы посоветовал бы STM32.
Таймеров побольше и они 16/32 разрядные с нормальным предделителем. Меньше возни с настройками выходного сигнала и стабильнее параметры.

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт окт 25, 2022 05:00:35

Есть у меня Ардуино НАНО.
Необходимо арудиновскими методами создать фигню с тремя потенциомметрами:

Это принципиально "арудиновскими методами"? Или можно хоть на чём написать? Если не принципиально, то вот прошивка выполняет данную задачу… входа для потенциометров задействованы LED – РС0; MAGNET – РС1; MOTOR – РС2… выхода соответственно: РВ0; РВ1; РВ2… Входа и выхода особо не привязаны… можно при желании и изменить… шильд ардуины нано на базе мега328Р
Test.hex
(1.39 KiB) Скачиваний: 63

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт окт 25, 2022 07:31:19

Спасибо! Но мне не надо готовое решение. Хочу, чтобы только ткнули носом внужном направлении. А дальше я сам.

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт окт 25, 2022 07:48:42

Я далёк от совершенства написания алгоритмов, но если данный вариант работает как нужно то я могу на словах рассказать что я там сделал… не Си, не тем более ардуиновский язык я не знаю, так что код писал на другом языке… если не сложно то проверьте, так ли я понял вашу задачу… :dont_know:

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт окт 25, 2022 09:03:32

Спасибо! Но мне не надо готовое решение. Хочу, чтобы только ткнули носом внужном направлении. А дальше я сам.

ШИМ мотора это analogWrite() - PWM.
Частота для светиков... допустим на основе tone() + прерывание на INT0(D2)/INT1(D3) от штатного attachInterrupt() и последующего обработчика. Дополнительно можно еще устроить один канал таймер-сетки от Т0 без каких-либо помех для функционала "референса"... Но то уже чуток от того "референса" отход...
8)

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Пн ноя 07, 2022 12:34:03

Если это более менее учебная задача, то можно вообще конечный автомат по мотивам "blink без delay", полезно будет.

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Пн ноя 07, 2022 15:41:31

вот так я сделал. )
Код:

//ВЫХОДЫ
#define PIN_LED     11
#define PIN_MAGNET     2
#define PIN_MOTOR     9
//ВХОДЫ
#define PIN_POTLED     A0
#define PIN_POTMAGNET     A1
#define PIN_POTMOTOR     A2

uint16_t _LED, MAGNET, MOTOR, counter;
uint32_t _Timer, _Timer1, _Timer2;
uint16_t ledStateON = HIGH;
uint16_t ledStateOFF = LOW;
uint16_t MAGNETState = LOW;

void setup() {
Serial.begin(9600);
 
 pinMode(PIN_LED, OUTPUT);
 pinMode(PIN_MAGNET, OUTPUT);
 pinMode(PIN_MOTOR, OUTPUT);
   pinMode(PIN_POTLED, INPUT);
   pinMode(PIN_POTMAGNET, INPUT);
   pinMode(PIN_POTMOTOR, INPUT);
}

void loop() {

  _LED = map((analogRead(PIN_POTLED)), 0, 1024, 100, 4);
  MAGNET = map((analogRead(PIN_POTMAGNET)), 0, 1024, 50, 2);
  MOTOR = map((analogRead(PIN_POTMOTOR)), 0, 1024, 0, 255);

if (millis() - _Timer2 >= 1) // Заходим и проверяем каждую милисекунду
{                 
    counter++;
   
    if (counter <= (_LED/10))
    digitalWrite(PIN_LED, ledStateON);
    if (counter >= (_LED/10))
     digitalWrite(PIN_LED, ledStateOFF);
     if (counter >= _LED)
     counter = 0;
}
 

  if (millis() - _Timer1 >= MAGNET) {   // таймер н
    _Timer1 = millis();              // сброс таймера
    // выполнить действие 1
       if (MAGNETState == LOW)
              MAGNETState = HIGH;
            else
              MAGNETState = LOW;

       digitalWrite(PIN_MAGNET, MAGNETState);   
  }

  analogWrite(PIN_MOTOR, MOTOR);
 

//Serial.println(_LED);
//delay(100);


 

}

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт ноя 08, 2022 09:56:08

Типа того. Не увидел сброс _Timer2, т.е. оно там по counter работает, возможно что то лишнее.

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт ноя 08, 2022 11:13:01

Да, и через 4 294 967 295 ms (2^32 - 1). Или ~49,7 дней "перевернется" в 0 :).

На мой взгляд, неправильный способ с состоянием пина в loop(), но для началной способ, на низкой частоте и с пропущены некоторые события - начин работает. Было бы хорошо, если бы отчет о времени был только по таймеру, а, возможно, реакция (включение/выключение, изменение значения напр. по флагу) - в цикле.

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт ноя 08, 2022 13:39:50

Хотелось как можно быстрее. ) Да, таймер2 Надо сбросЕть. .

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Ср ноя 09, 2022 11:41:14

Максимальная частота 100Гц это 0,01 секунды.
Нанка работает на 16МГц 0,0000000625 секунды на одноцикловую команду.
Т.е. запас не менее 160000 команд между самыми короткими интервалами.
Можно сделать опорную сетку частот (помимо delay()/millis() и стандартного analogWrite() )
и по ее прерываниям проводить выполнение управляющих подпрограмм.
Си конечно не ассемблер, но и быстродействие у нанки в 16 раз выше, чем у "стандартной классики" при 0,000001 секунды на одноцикловую команду.
:roll:

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Пт ноя 11, 2022 10:23:41

Я бы посоветовал бы STM32.
Таймеров побольше и они 16/32 разрядные с нормальным предделителем. Меньше возни с настройками выходного сигнала и стабильнее параметры.
Ну и зачем непрошенные советы ? Естественно что ТС их проигнорирует. Это называется "растекаться мыслью по древу", а не решать конкретный вопрос.

ПС. Когда продумываю алгоритм для написания проги - стараюсь не делать "излишних телодвижений". Например -
1. Считали потенциометр. Если текущее положение не отличается от предыдущего более чем на заданный допуск - нет смысла выполнять процедуры управления, - пролетаем мимо. Если положение изменилось более заданного допуска - запоминаем новое положение как ПРЕДЫДУЩЕЕ, исполняем процедуры управления выходом.
2. Естественно что нет никакой необходимости каждый цикл считывать потенциометр. Его просто невозможно повернуть быстрее чем за секунду. Так что заходить в процедуру чтения потециометра чаще чем раз в 0,1 сек - бессмысленно. И тд.

В результате все это уменьшает токопотребление, нагрев и радиошум.

Re: Частота 20-100 Гц, и отдельно ШИМ на мотор

Вт ноя 15, 2022 09:11:00

Угу. Для выполняемых действий это еще важнее, к примеру если параметр не изменился - не нужно выводить его повторно на экран или запихивать лишний раз во внешние регистры, отправлять команды куда то и т.п.
Ответить