Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

jokeer
Вчора 09:01:12

Рядків не сильно більше ніж при чесному вимірюванні довжини імпульсів wink А такти проца - хто їх рахує wink

dimich
Вчора 08:12:49
jokeer пише:

Та в принципі такий спосіб усереднення pwm має право на існування. analogread іноді читає 0, іноді 1023, в середньому виходить 22 wink

Та десь так, але ж аліасінг. Дивне ускладнення рішення для простої задачі.

jokeer
Вчора 07:32:41

Та в принципі такий спосіб усереднення pwm має право на існування. analogread іноді читає 0, іноді 1023, в середньому виходить 22 wink
Стабільність під великим сумнівом, але якщо ця штука не літає і не впаде нікому на голову то можливо і ок.

dimich
Вчора 05:06:53
jokeer пише:

Наскільки я бачу, при вказаній умові воно повинно клацати з інтервалом в 1 секунду.

Хе, там дійсно осцилятор smile

dimich
Вчора 01:58:02
Kvins пише:

Інший пристрій це STM32F103 яка управляє сервомоторами зі зворотнім зв'язком у виді микроперемекача.

Як саме пін з STM32 підключений до входу ардуіни? Між ними є якісь компоненти?
Яка напруга живлення у вашого Nano?

Kvins пише:

Я вимикаю конектор мотора та туди ціпляюсь портом D2 (два пина: сигнал та GND)

Так D2 чи A0?

Kvins пише:

sum += analogRead(A0);

Якщо це PWM, то амплітуда нас не має цікавити, тільки логічний рівень. Якщо там аналоговий сигнал, то це не PWM.

Kvins пише:

Хлопці все запрацювало cool

Це вам поки що повезло. При зміні зовнішніх факторів може перестати.

Kvins пише:
  average = sum / NUM_READINGS;                  // знаходимо середнє арифметичне, поділивши суму на число вимірів
...
  if (average < 22 ... 

Замість того щоб ділити на константу і потім порівнювати з константою, можна просто порівнювати з константою:

  if (sum < 22 * NUM_READINGS ... 
Kvins пише:
... && digitalRead(outPin) == LOW)

digitalRead() читає з регістра PINn, і при деяких умовах там може бути не те значення, що digitalWrite() записало в регістр PORTn. Краще зберігайте внутрішній стан в окремій змінній.

jokeer
2025-06-08 17:24:57

Наскільки я бачу, при вказаній умові воно повинно клацати з інтервалом в 1 секунду.

Kvins
2025-06-08 17:05:08

Усім дякую за допомогу!

Kvins
2025-06-08 16:56:07

Хлопці все запрацювало cool

ось...

#define NUM_READINGS 600
int average;
int outPin = 13;
int inPWM = A0;

void setup() {
  digitalWrite(outPin, LOW);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}


void loop() {
  long sum = 0;  // локальна змінна sum
  for (int i = 0; i < NUM_READINGS; i++) {      // згідно з кількістю усереднень
    sum += analogRead(A0);                        // сумуємо значення з датчика змінної sum
  }
  average = sum / NUM_READINGS;                  // знаходимо середнє арифметичне, поділивши суму на число вимірів
  Serial.println(average);                       // для прикладу виводимо в порт
  delay(1000);
 
  if (average < 22 && digitalRead(outPin) == LOW)  // умова на потрібний імпульс (шим)
   {                             
    digitalWrite(outPin, HIGH);                // робимо високий рівень
   }
   else if (average < 22 && digitalRead(outPin) == HIGH) // і якщо імпульс був раніше
   {
    digitalWrite(outPin, LOW);                  // вимикаємо 
   }
            

}
jokeer
2025-06-08 14:56:11

Ну, покрутіть той stm32. Якщо з нього в іншому положенні вдасться отримати імпульси 1 мс - можна просто ігнорувати імпульси з неправильним періодом.

Kvins
2025-06-08 14:38:32
jokeer пише:

Ви там серву не від USB живите?

Ні, окреме живлення.

jokeer
2025-06-08 14:31:05

Ну, що ми тут бачимо? Коли вимірюється період 20 мс - довжина імпульсу 2 мс. Схоже на правду. А інше якесь дивне. Ви там серву не від USB живите?

Kvins
2025-06-08 14:30:17
jokeer пише:

Можливо. Дивіться попередження компіляції.
Але спочатку розберіться що у вас там за сигнал. Не схоже це на pwm. .

>> сигнал PWM йде приблизно зі значеннями 69-74,

що це за значення, звідки ви його взяли?

Я дивився у мониторі порта зміни при натисканні команди серво
Znmok-ekrana-2025-06-08-142635.png

Kvins
2025-06-08 14:20:51
jokeR пише:

Трохи дивно виходить.  Ну давайте поміряємо період імпульсів.


Znmok-ekrana-2025-06-08-141812.png

jokeer
2025-06-08 14:18:12

Можливо. Дивіться попередження компіляції.
Але спочатку розберіться що у вас там за сигнал. Не схоже це на pwm. .

>> сигнал PWM йде приблизно зі значеннями 69-74,

що це за значення, звідки ви його взяли?

Kvins
2025-06-08 14:08:09
if (average < 20)                                  // умова на потрібний імпульс (шим)
   {                             
    digitalWrite(outPin, HIGH);                // робимо високий рівень
 
    } else  if  digitalRead(outPin,HIGH) { // i якщо імпульс був знов через деякий час , де був HIGH
  
    digitalWrite(outPin, LOW);                // вимикаємо 

Наразі не компілюється, щось с синтаксисом..

Підвал форуму