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

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

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

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

Частота мигания светодиодов и клапана от 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 Гц что ли прмерно и мне надо менять частоту, а не заполнение.
Спойлер

Код: Выделить всё

void loop() { 
  int adcValue;

  adcValue = analogRead(A0); 
  analogWrite(ledPinR, map(adcValue, 0, 1023, 0, 255));

  adcValue = analogRead(A1); 
  analogWrite(ledPinG, map(adcValue, 0, 1023, 0, 255)); 

  adcValue = analogRead(A2); 
  analogWrite(ledPinB, map(adcValue, 0, 1023, 0, 255)); 
} 

А, ну да, для мотора могу так использовать.
Станислав
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Библиотека Тimer1. Все уже сделано, легко используется.
Timer1 based PWM in Arduino Uno
Последний раз редактировалось veso74 Вт окт 25, 2022 11:17:08, всего редактировалось 2 раза.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

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

Сообщение Мурик »

Я бы посоветовал бы STM32.
Таймеров побольше и они 16/32 разрядные с нормальным предделителем. Меньше возни с настройками выходного сигнала и стабильнее параметры.
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1627
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

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

Сообщение VNS »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=4309461#p4309461"]Есть у меня Ардуино НАНО.
Необходимо арудиновскими методами создать фигню с тремя потенциомметрами:[/uquote]
Это принципиально "арудиновскими методами"? Или можно хоть на чём написать? Если не принципиально, то вот прошивка выполняет данную задачу… входа для потенциометров задействованы LED – РС0; MAGNET – РС1; MOTOR – РС2… выхода соответственно: РВ0; РВ1; РВ2… Входа и выхода особо не привязаны… можно при желании и изменить… шильд ардуины нано на базе мега328Р
Test.hex
(1.39 КБ) 96 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Спасибо! Но мне не надо готовое решение. Хочу, чтобы только ткнули носом внужном направлении. А дальше я сам.
Станислав
Реклама
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1627
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

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

Сообщение VNS »

Я далёк от совершенства написания алгоритмов, но если данный вариант работает как нужно то я могу на словах рассказать что я там сделал… не Си, не тем более ардуиновский язык я не знаю, так что код писал на другом языке… если не сложно то проверьте, так ли я понял вашу задачу… :dont_know:
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=4309608#p4309608"]Спасибо! Но мне не надо готовое решение. Хочу, чтобы только ткнули носом внужном направлении. А дальше я сам.[/uquote]
ШИМ мотора это analogWrite() - PWM.
Частота для светиков... допустим на основе tone() + прерывание на INT0(D2)/INT1(D3) от штатного attachInterrupt() и последующего обработчика. Дополнительно можно еще устроить один канал таймер-сетки от Т0 без каких-либо помех для функционала "референса"... Но то уже чуток от того "референса" отход...
8)
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

Если это более менее учебная задача, то можно вообще конечный автомат по мотивам "blink без delay", полезно будет.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

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

Код: Выделить всё


//ВЫХОДЫ
#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);


  

}

Станислав
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

Типа того. Не увидел сброс _Timer2, т.е. оно там по counter работает, возможно что то лишнее.
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
veso74
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

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

На мой взгляд, неправильный способ с состоянием пина в loop(), но для началной способ, на низкой частоте и с пропущены некоторые события - начин работает. Было бы хорошо, если бы отчет о времени был только по таймеру, а, возможно, реакция (включение/выключение, изменение значения напр. по флагу) - в цикле.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Хотелось как можно быстрее. ) Да, таймер2 Надо сбросЕть. .
Станислав
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15589
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

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

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

Сообщение Ariadna-on-Line »

[uquote="Мурик",url="/forum/viewtopic.php?p=4309564#p4309564"]Я бы посоветовал бы STM32.
Таймеров побольше и они 16/32 разрядные с нормальным предделителем. Меньше возни с настройками выходного сигнала и стабильнее параметры.[/uquote]Ну и зачем непрошенные советы ? Естественно что ТС их проигнорирует. Это называется "растекаться мыслью по древу", а не решать конкретный вопрос.

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

В результате все это уменьшает токопотребление, нагрев и радиошум.
Morroc
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

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

Сообщение Morroc »

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

Вернуться в «Arduino»