Использование мультиплексора 4x1 для управления сервоприводом

Я должен был сначала создать MUX 4x1, используя И и НЕ ворота. 4 входные линии данных (io,i1,i2,i3) были 4 ШИМ-выводами от arduino (3,5,6,9), со значениями analogWrite() как 100,150,200,250 соответственно, а линии выбора были взяты из двух ползунковых переключателей.

int i0=100;
int i1=150;
int i2=200;
int i3=250;

void setup()
{
  pinMode(5, OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(3,OUTPUT);
  
  analogWrite(3,i0);
  analogWrite(5,i1);
  analogWrite(6,i2);
  analogWrite(9,i3);

  Serial.begin(9600);
}

void loop()
{
 


}

Ссылка моделирования: https://www.tinkercad.com/things/cRZNvuwhZYV

Вольтметр + подключен к выходу MUX. Обе линии выбора ВЫСОКИ, поэтому выход i3 имеет значение ШИМ 250. Таким образом, напряжение должно быть (250/255)*5, то есть около 4,9 В, что и показывает счетчик. (Сервопривод присутствует, но не подключен.)

Значения вольтметра соответствуют всем 4 возможным комбинациям. Короче говоря, 4x1 MUX работает отлично.

(для меня было важно прояснить это , так как в противном случае люди могли бы подумать о реализации мультиплексора как о проблеме с моей схемой lsubsequent, а из-за грязной проводки было бы невозможно подтвердить, так ли это на самом деле. Однако, как я четко показал, проблема НЕ в MUX).

Затем я попытался управлять сервомотором с помощью этого MUX. Я подсоединил вывод сервоуправления к мультиплексному выходу:

#include<Servo.h>
Servo s1;
Servo s2;
Servo s3;
Servo s4;

int i0=100;
int i1=150;
int i2=200;
int i3=250;

void setup()
{
  pinMode(3,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(9,OUTPUT);
  
  analogWrite(3,i0);
  analogWrite(5,i1);
  analogWrite(6,i2);
  analogWrite(9,i3);

  s1.attach(3);
  s2.attach(5);
  s3.attach(6);
  s4.attach(9);
  
  
  Serial.begin(9600);
}

void loop()
{
  
    
 s1.write((i0*180)/255);
 s2.write((i1*180)/255);
 s3.write((i2*180)/255);
 s4.write((i3*180)/255);
}

Например, я думал, что если оба переключателя включены, то выход будет i3(который идет от контакта 9), так что будут работать только s4.attach(9); и s4.write((i3*180)/255);. (Поскольку очевидно, что управляющий штифт в данном случае соединен с штифтом 9).

Сервопривод действительно перемещается, когда я меняю переключатели на комбинации включения-выключения,однако со значениями вольтметра происходит что-то радикальное, что говорит мне о том, что мой код возится с выходом мультиплексора. Выходное напряжение быстро колеблется между 97 и 180 мВ.

Что именно я сделал не так, и как именно я должен управлять Сервомотором?

, 👍1

Обсуждение

Честно говоря, я бы подумал, что ни один из кодов на самом деле не работает, по крайней мере, на реальном Arduino (не знаю, как tinkercad справляется с этим). Вызов analogWrite() или "Servo.write() многократно в" цикле() без каких-либо замедляющих действий приведет к повторному запуску волны PWM снова и снова. Пожалуйста, попробуйте вместо этого поместить эти строки в " setup ()". Возможно, tinkercad обрабатывает " analogWrite()` и библиотеку сервоприводов по-разному., @chrisl

одна из главных вещей, которые вы делаете неправильно, - это использование вольтметра для измерения последовательности импульсов ... осциллограф-подходящий инструмент для этого, @jsotola

@chrisl Я изменил коды, проблема все еще сохраняется. Есть идеи, почему? и есть какие-нибудь идеи, что именно я могу сделать, чтобы правильно управлять сервоприводом?, @satan 29

@jsotola какое это будет иметь значение? (Я, конечно, вежливо спрашиваю об этом) Вольтметр показывает правильные значения для MUX, что означает, что мой MUX работает правильно, это все, что я хотел подтвердить. Когда я добавляю сервопривод, это когда вольтметр отключается, так что, вероятно, что-то не так с управлением моим сервоприводом... Я не уверен, почему использование осциллографа исправит это, @satan 29

можно ли управлять сервоприводом только одним сервообъектом?, @satan 29

Какова цель как " analogWrite ()", так и "Servo::write ()" с использованием одного и того же контакта? Вам вообще нужно первое?, @the busybee

хорошо, что функция analogWrite() служит в качестве входных данных для MUX... Возможно, вы правы в том, что использование одного и того же контакта может вызвать проблемы.. Но тогда какой код вы рекомендуете?, @satan 29