Ви не увійшли.
Рядків не сильно більше ніж при чесному вимірюванні довжини імпульсів А такти проца - хто їх рахує
Та в принципі такий спосіб усереднення pwm має право на існування. analogread іноді читає 0, іноді 1023, в середньому виходить 22
Та десь так, але ж аліасінг. Дивне ускладнення рішення для простої задачі.
Та в принципі такий спосіб усереднення pwm має право на існування. analogread іноді читає 0, іноді 1023, в середньому виходить 22
Стабільність під великим сумнівом, але якщо ця штука не літає і не впаде нікому на голову то можливо і ок.
Наскільки я бачу, при вказаній умові воно повинно клацати з інтервалом в 1 секунду.
Хе, там дійсно осцилятор
Інший пристрій це STM32F103 яка управляє сервомоторами зі зворотнім зв'язком у виді микроперемекача.
Як саме пін з STM32 підключений до входу ардуіни? Між ними є якісь компоненти?
Яка напруга живлення у вашого Nano?
Я вимикаю конектор мотора та туди ціпляюсь портом D2 (два пина: сигнал та GND)
Так D2 чи A0?
sum += analogRead(A0);
Якщо це PWM, то амплітуда нас не має цікавити, тільки логічний рівень. Якщо там аналоговий сигнал, то це не PWM.
Хлопці все запрацювало
Це вам поки що повезло. При зміні зовнішніх факторів може перестати.
average = sum / NUM_READINGS; // знаходимо середнє арифметичне, поділивши суму на число вимірів ... if (average < 22 ...
Замість того щоб ділити на константу і потім порівнювати з константою, можна просто порівнювати з константою:
if (sum < 22 * NUM_READINGS ...
... && digitalRead(outPin) == LOW)
digitalRead() читає з регістра PINn, і при деяких умовах там може бути не те значення, що digitalWrite() записало в регістр PORTn. Краще зберігайте внутрішній стан в окремій змінній.
Наскільки я бачу, при вказаній умові воно повинно клацати з інтервалом в 1 секунду.
Усім дякую за допомогу!
Хлопці все запрацювало
ось...
#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); // вимикаємо
}
}
Ну, покрутіть той stm32. Якщо з нього в іншому положенні вдасться отримати імпульси 1 мс - можна просто ігнорувати імпульси з неправильним періодом.
Ви там серву не від USB живите?
Ні, окреме живлення.
Ну, що ми тут бачимо? Коли вимірюється період 20 мс - довжина імпульсу 2 мс. Схоже на правду. А інше якесь дивне. Ви там серву не від USB живите?
Можливо. Дивіться попередження компіляції.
Але спочатку розберіться що у вас там за сигнал. Не схоже це на pwm. .>> сигнал PWM йде приблизно зі значеннями 69-74,
що це за значення, звідки ви його взяли?
Я дивився у мониторі порта зміни при натисканні команди серво
Трохи дивно виходить. Ну давайте поміряємо період імпульсів.
Можливо. Дивіться попередження компіляції.
Але спочатку розберіться що у вас там за сигнал. Не схоже це на pwm. .
>> сигнал PWM йде приблизно зі значеннями 69-74,
що це за значення, звідки ви його взяли?
if (average < 20) // умова на потрібний імпульс (шим)
{
digitalWrite(outPin, HIGH); // робимо високий рівень
} else if digitalRead(outPin,HIGH) { // i якщо імпульс був знов через деякий час , де був HIGH
digitalWrite(outPin, LOW); // вимикаємо
Наразі не компілюється, щось с синтаксисом..