проблема => вентилятор через шим + сервопривод

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Доброго всем времени суток!

Вы извините что обращаюся, но ибо затык... Пытаюсь подключить одновременно вентилятор (пин 9), которым надо управлять через ШИМ, и сервопривод (пин 11). Т.к. вентилятор "пищал", поставил в void setup TCCR1B = TCCR1B & 0b11111000 | 0x01 , проблема исчезла и по вентилятору претензий нет, но как только прописываю в void setup "serv1.attach(11)", вентилятор работать перестает. Комментирую serv1.attach(11) - вентилятор работает. В чем проблема может быть? Что я не так делаю?

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Servo.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(12, 8, 7, 4, 2);
Servo serv1;
int FanDevice = 9;
int motor_rpm = 70;

  void setup()
{
  TCCR1B = TCCR1B & 0b11111000 | 0x01;
  display.begin(); // инициализируем дисплей
  display.setContrast(60);  // устанавливаем контраст LCD
  display.clearDisplay();   // очищаем экран
  pinMode(FanDevice, OUTPUT);
  digitalWrite(FanDevice, 0);
//  serv1.attach(11);

}

void loop(){
if(motor_rpm<250){
  motor_rpm = motor_rpm+1;
  analogWrite(FanDevice, motor_rpm);
  }else{
    motor_rpm = 70;
    analogWrite(FanDevice, motor_rpm);
 }
 
 
  display.clearDisplay();
  display.setTextSize(1);
  display.println("  --------- ");
  display.print("RPM  ");
  display.println(motor_rpm);
  display.display();
}
void set_text(int x,int y,String text,int color){
 
  display.setTextColor(color);
  display.setCursor(x,y);
  display.println(text);
  display.display();
}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вставьте код правильно, иначе, с большой вероятностью, его и смотреть никто не будет.

А по подключению - перенесите наоборот, вентиллятор на 11-ый пин, а серву на 9-ый. Только не забудьте поменять настройки для вентиллятора о которых Вы писали.

Кстати, всё это (и вставка кода и фокусы с пинами) описано в прикреплённых темах этого раздела. Почему все новоприбывшие сразу кидаются писать, ничего не прочитав?

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Спасибо, поменял местами, изменил настройку, работает. Но при подключении дисплея nokia5510, серв начинает колбасить: он крутится, но при этом дергается туда-сюда.

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Servo.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(12, 8, 7, 4, 2);
int FanDevice = 11;

class Sweeper
{
  Servo servo; // сервопривод
  int pos; // текущее положение сервы 
  int increment; // увеличиваем перемещение на каждом шаге
  int updateInterval; // промежуток времени между обновлениями
  unsigned long lastUpdate; // последнее обновление положения 
 
  public: 
  Sweeper(int interval)
  {
    updateInterval = interval;
    increment = 1;
  }
  void Attach(int pin)
  {
    servo.attach(pin);
  }
  void Detach()
  {
    servo.detach();
  }
  void Update()
  {
    if((millis() - lastUpdate) > updateInterval) // время обновлять
    {
      lastUpdate = millis();
      pos += increment;
      servo.write(pos);
      if ((pos >= 180) || (pos <= 0)) // конец вращения
      {
        // обратное направление
        increment = -increment;
      }
    }
  }
};
Sweeper sweeper1(25);

void goMotor(int rpm){
    analogWrite(FanDevice, rpm);
}

void setup() 
{ 
  TCCR2B = TCCR2B & 0b11111000 | 0x01;
//  display.begin(); // инициализируем дисплей
  display.setContrast(60);  // устанавливаем контраст LCD
  display.clearDisplay();   // очищаем экран
  sweeper1.Attach(9);
  pinMode(FanDevice, OUTPUT);
  digitalWrite(FanDevice, 0);
} 
void loop() 
{ 
  goMotor(150);
  sweeper1.Update();
  display.clearDisplay();
  display.setTextSize(1);
  display.println("  --------- ");
  display.display();
}

с закомментированной строчкой

//  display.begin(); // инициализируем дисплей

все работат норм. Дело в библиотеке?

Как можно победить это?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для начала - загляноть в библиотеку, и понять, что она делает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А по дисплей Вроде раньше ничего не говоилось? Или это Вы уже новое добавляете? Типа то победили - следующий шаг :)

Сейчас гляну. Библиотека вот эта - https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library ???

 

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Да, спасибо за участие!))) в прошлый раз все заканчивалось при аттаче серва, сейчас все работает вроде, но такой же затык как и в прошлый раз, только на инициализации дисплея. Библиотека Adafruit_GFX.h и Adafruit_PCD8544.h

Я по-честному смотрел что в библиотеке и по-честному пытался понять...но...но я ничего там такого не нашел. Настройки и пины...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, ничего там особенного нет.

Вы точно уверены, что виновата именно функция begin а не какая-нибудь другая функция работы с дисплеем? Попробуйте раскомментировать её, а закомментировать все остальные. Что получится?

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

ЕвгенийП пишет:

Вы точно уверены, что виновата именно функция begin а не какая-нибудь другая функция работы с дисплеем? Попробуйте раскомментировать её, а закомментировать все остальные. Что получится?

Да, Вы правы, оказалось что начинает все работать "наперекосяк" при раскомментеривании display.dislplay();

  display.display();

Провода до серва шли под дисплеем, подумал что возможно это наводка, переподключил вокруг дисплея - безрезультатно.

Вот поведение серва при за/раскомментированной строке display.dislplay(), может у кого такое было и решение какое-то тривиальное?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, давайте попробуем перейти на аппаратный SPI. Ппорбуйте и скажите. что получилось.

Кстати, что у Вас за Ардуина? 

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Arduino UNO.

подключил на стандартные пины дисплей

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Servo.h>
//Adafruit_PCD8544 display = Adafruit_PCD8544(12, 8, 7, 4, 2);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
int FanDevice = 11;

все заработало как надо вроде, а так хотелось отбить у дисплея 3 пина с шим...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А на аппаратный SPI пробовали переходить? Отбили бы свои пины. Не получилось или не пробовали?

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Пробовал полдня гуглить и читать про этот SPI, но у меня в голове так и не улеглось как подключить, а тем более заставить работать этот дисплей через Serial Peripheral Interface. Подключить, как я думаю, вроде даже и понял...)))...но вот как потом его заставить еще и работать - для меня загадка. По поводу его работы, я так понимаю, Вы отправите меня к даташиту...)))

Вообще тема интересная и если Вы порекомендуете что именно дельного и понятного почитать - буду признателен.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

да, ладно, делов-то. Сейчас Вы вызываете конструктор Adafruit_PCD8544 с пятью параметрами

  Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC, int8_t CS, int8_t RST);
 
А надо вызывать с тремя (имена соответсвуют)
 // Hardware SPI based on hardware controlled SCK (SCLK) and MOSI (DIN) pins. CS is still controlled by any IO pin.
  // NOTE: MISO and SS will be set as an input and output respectively, so be careful sharing those pins!
  Adafruit_PCD8544(int8_t DC, int8_t CS, int8_t RST);
 
При этом SCK дисплея заводите на 13 пин ардуины, а DIN дисплея - на 11 пин ардуины. 12 и 10 пины ардуины пока просто не трогайте. Если всё получится, я потом объясню как можно с ними жить.
 
Попрбуйте. Отпишитесь.
 
distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Что-то каша в голове, это просто когда уже разобрался наверно...интерфейс с 4мя линиями. По даташиту с этого экрана мы считать ничего не можем, поэтому MISO нам не нужен (пин 12). Правильно?

Остается 3: SCLK, MOSI, SS.

SCK - SCLK,CLK(Serial Clock) - на 13й пин.

DIN - MOSI - 11й пин.

А 10й пин (SS) тоже не нужен чтоли? В описании как минимум он управляет окончанием передачи...

или я что-то опять не понял?)))

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

У Вас есть SS, просто он здесь CS называется. Тут небольшая путаница в терминологии. В той, что есть, считайте, что пин CS головного устройства соединяется с пином SS ведомого.

На стороне головного устройства CS - любой пин. Более того, если у нему (головному устройству) подключено несколько ведомых, то у него соответсвенно несколько CS - по количеству ведомых. На стороне ведомого устройства SS - специальный пиг (для ардуины - 10-ый) на котором оно ожидает управления от головного устройства.

СS управляет выбором устройства. Общая идея такая. Если ведомых устройств на линии много, то все они соединены с одними и теми же проводами SCC/MOSI/MISO, но у каждого свой уникальный CS (соединённый с SS соответсвующег ведомого устройства). Т.е. от мастера идёт 3(N+1) проводов, где N - количество ведомых устройств. На ведомых устройствах SS подключены "куда надо", а со стороны мастера этот провод (CS) идёт на любой пин.

Все CS находятся в неактивном состоянии (HIGH). Когда мы собираемся передавать данные на конкретное ведомое устройство, мы кладём его СS в LOW. Т.е. на пине SS ведомого устройства появляется LOW - это сигнал устройству, что передача именно для него (а остальные могут расслабиться). Когда головное устройство поднимает CS обратно в HIGH - это сигнал ведомому, что передача окончена.

ИНогда, если ведомое устройство заведомо одно, этот провод не подключают, а на ведомом просто заводят на землю. Тогда оно всегда готово к приёму. Но в этом случае распознать, что передача окончена - уже его забота.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

Т.е. от мастера идёт 3(N+1) проводов, где N - количество ведомых устройств.

3 + N

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Спасибо за разъяснения, принцип работы SPI я понял: SCLK задает такт, MOSI/MISO передача бит за такт, SS в high - конец передачи для этого устройства(сколько устройств - столько SS). У меня проблема в понимании приложения этого всего:

На дисплее CLK, DIN, DC, CE, RST

CLK - 13, DIN - 11, DC - пусто, CE - GND (чтобы всегда на приеме, как я понял), RST - пусто

тогда что указывать вот тут?

ЕвгенийП пишет:

  Adafruit_PCD8544(int8_t DC, int8_t CS, int8_t RST);

или мне надо это заводить через библиотеку SPI.h?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

ЕвгенийП пишет:

Т.е. от мастера идёт 3(N+1) проводов, где N - количество ведомых устройств.

3 + N

Точно, виноват

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

distsys пишет:

тогда что указывать вот тут?

Для начала тоже, что и раньше. Посмотрите пост 12. Там я привёл общую форму Вашего нынешнего конструктора (с 5-ю параметрами), а потом этого. Так вот укажите те же пина на те же имена параметров, что и раньше. оставшиеся два првода (которые выпали) я написал куда пихать.

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

CLK - 13, DIN - 11, DC - 5, CE - 4, RST - 3

не, компиляция не проходит:

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);


void setup() 
{ 
  display.begin(); // инициализируем дисплей
  display.setContrast(60);  // устанавливаем контраст LCD
  display.clearDisplay();   // очищаем экран
} 
void loop() 
{ 
  display.clearDisplay();
  display.setTextSize(1);
  display.println("  --------- ");
  display.print("SERV ");
  display.println("rpm");
  display.display();
}

при компиляции:

exit status 1
no matching function for call to 'Adafruit_PCD8544::Adafruit_PCD8544(int, int, int)'

пробовал в библиотеке привести к 3м значениям

  //Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC, int8_t CS, int8_t RST);
  //Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC, int8_t RST);
  Adafruit_PCD8544(int8_t DC, int8_t CS, int8_t RST);

...и т.д.

Получается:

exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Значит, у нас с Вами разные библиотеки Adafruit_PCD8544. В моей вот что:

  // Software SPI with explicit CS pin.
  Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC, int8_t CS, int8_t RST);
  // Software SPI with CS tied to ground.  Saves a pin but other pins can't be shared with other hardware.
  Adafruit_PCD8544(int8_t SCLK, int8_t DIN, int8_t DC, int8_t RST);
  // Hardware SPI based on hardware controlled SCK (SCLK) and MOSI (DIN) pins. CS is still controlled by any IO pin.
  // NOTE: MISO and SS will be set as an input and output respectively, so be careful sharing those pins!
  Adafruit_PCD8544(int8_t DC, int8_t CS, int8_t RST);

Т.е. версия с тремя параметрамиттипа int есть. А в Вашей, похоже, нету.

Давайте впредь работать внимательнее. Посмотрите посты №4 и №5. Я Вам сказал какая у меня и спросил такая ли у Вас. Вы мне про другую дали ссылку, а про эту - нет. Я думал, что у Вас таже самая.

Либо давайте мне прямую ссылку на Вашу библиотеку, либо попробуйте с моей (а лучше и то, и другое).

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Вот даже не знаю как оправдаться, спасибо))) ссылка из поста #5 - это моя библиотека, которая без 3х int. С новыми библиотеками, скетч с предыдущего поста заработал на раз-два!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С Победой!

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Спасибо! завтра подключу также как в начале вентилятор и сервопривод - отпишусь по результатам как работает. В результате: не думаю что DC - 5, CE - 4, RST - 3 необходимы пины с шим - это сразу мне высвободит необходимые 2 пина на вентиляторы, 2 на сервы и 1 на пьезо - идеальный расклад. Как бонус "познание" SPI)))...

Кстати, а вот еще вопрос, что означало высказывание?)))

ЕвгенийП пишет:

 Если всё получится, я потом объясню как можно с ними жить.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

distsys пишет:

то означало высказывание?)))

ЕвгенийП пишет:

 Если всё получится, я потом объясню как можно с ними жить.

Там есть специфика использования SPI пинов для других нужд (если они у Вас собственно для SPI не используется). Например, если Вы не используете MISO (12) для SPI, то при инициализации SPI он всё равно будет установлен в INPUT. Потом можно помеянть, но именно потом - после инициализации (в Вашем случае - после вызова конструктора). Ещё одна специфика связана с пином SS (10). Если Вы его не используете для SPI, то он у Вас обязательно должен быть либо OUTPUT (и тогда пользуйте его как хотите), либо INPUT, но в этом случае он обязан всегда быть HIGH. Если он вдруг станет INPUT и LOW - SPI перестанет работать (в смысле работать-то он будет, но так, как Вам надо, а именно - перейдёт в режим Slave и начнёт ждать, что ему что-нибудь придёт от другого мастера).

 

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Спасибо за информацию и помощь, Вы реально очень помогли!

Сегодня подключил для теста вентилятор и серв. Дислей DC, CE и RST раскидал по простым D пинам, серв - 9 пин, вентилятор сначала на 3-й пин. Работает. Мне необходимо управлять шим двумя вентиляторами, подумал что 5 и 6 пин как раз созданы для этого)))... Pins 5 and 6: controlled by Timer 0 >> TCCR0B = TCCR0B & 0b11111000 | 0x01 >> 62500 Гц - вентилятор работает норм, но серв, который на 9-м пине, начал вращаться в 2 раза быстрей. Мне это конечно не принципиально, но почему?))) Таймеру 1 я частоту не менял ведь.

На этом дело не закончилось, на диспелей выведена одна статическая строчка: "------------". Добавил туда еще статическую строчку, ради интереса:"SERV  rpm". Залил скетч и мне показалось что серв начал крутиться медленее. Добавил еще 3 такие строки и серв стал еле двигаться, по сравнению с почти чистым дисплеем. Это связано с работой SPI? Просто при стандартном подключении дисплея на пин 5-6 подключить уже ничего не получится и сравнить не с чем.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я бы не дёргал вентиллятор ШИМом. Он же идуктивный и при включении/выключении там так колбасит линию питания - мама не горюй. Я бы делал токовое управление.

Что касается задержки, не знаю - я не знаю этих библиотек, надо с ними разбираться. И та и другая работаю с прерываниями. Если при этом они надолго запрещают другие прерывания, то такая петрушка (замедление) может наблюдаться и это вряд ли связано с тем на каких пинах что сидит. Скорее наоборот, сейчас Вы работаете с аппаратной реализацией SPI, которая в разы быстрее программной, с которой работали раньше.

Сам я с такими проблемами (куча двигателей на одном контроллере) никогда не сталкиваюсь, т.к. всегда ставлю на каждый двигатель свой микроконтроллер для управления именно этим двигателем. Не ардуину (зачем?) а голую микросхему. Обычно либо atmega328, либо attiny48/85. Все заморочки управления двигателем берёт на себя эта микросхема, а главный котроллер передёт ей команды (по тому же SPI) уже не в терминах "повернуть на шаг", а в терминах сутевой задачи. Об углах и прочих там фазах пусть голова у контроллера двигателя болит. Всегда так делаю. Стоят эти микросхему у китайцев рублей по 100-120. Ставлю и не парюсь.

Вот сейчас внук делает электромобиль, довольно большой - чтобы кататься самому и сестру катать. Там у него 4 бесколлекторных двигателя (втроенные в колёса - т.н. мотор-колёса), так к каждому из них мы делаем контроллер, который управляет только одним двигателем. Главный контроллер электромобиля передаёт двигателям команды типа "Stop", "Вперёд", "Назад" и % мощности на который работать. Контроллер двигателя отвечает, сообщая текущую скорость вращения и флаг состояния (норма/перегруз по току/перегрев и т.п.). Всеми же делами с фазовым управлением, с защитой от пергруза и пергрева (вполть до экстренного отключения) занимается контроллер двигателя у которого на обслуживании всего один двигатель и никаких других забот нет.

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Спасибо! Больше не буду так шимом для вентилятора пользоваться - это действительно не правильно... не почитал, не подумал...буду искать варианты, еще раз спасибо!

С "замедлением" буду еще экспериментировать, хотя для проекта это и не критично, но самому интересно почему.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

distsys пишет:

Спасибо! Больше не буду так шимом для вентилятора пользоваться - это действительно не правильно... не почитал, не подумал...буду искать варианты, еще раз спасибо!

Можно сделать самопал, а можно использовать любой (подходящий по току и напряжению) драйвер управления двигателем с токовым управлением. например ТА7291

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Евгений, а можете посоветовть что-нибудь попроще? Я посмотрел, условно подходит ТА7291Р, но он все равно 1А и 2А в пике, у меня 1.2А вентилятор и к тому же мне управлять изменением полярности не надо - обычный вентилятор.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, а что Вы понимаете под попроще: "посоветовать микросхему на больший ток или рассказть как это сделать из нескольких деталек рассыпухи? 

distsys
distsys аватар
Offline
Зарегистрирован: 17.04.2017

Готовую микросхему на больший ток и без изменения полярности.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вообще, проблема-то свосем несложная, особенно, если Вам не надо крутить в разные стороны.

Давайте рассуждать.

Что у нас есть? У нас есть ШИМ и цифровые выходы. Аналоговых выходов у нас нет.

Что нам надо? Надо плавно управлять током нагрузки.

Значит, нам нужен источник тока. управляемый через ШИМ. Ничего другого мы тут не придумаем.

Известно как сделать источник ток, управляемый напряжением (а не ШИМ'ом). Его и делать не надо - это полевой транзистор на линейном участке, где ток стока пропорционален напряжению затвор-исток.

Задача решается в три шага.

Шаг 1: делаем из ШИМ нормальное постоянное напряжение, величиной которого мы сможем управлять, изменяя скважность ШИМ.

Шаг 2. (позже)

Шаг 3. Полученным нами напряжением управляем полевым транзистором, как источником тока.

Есть одна беда - из нашего ШИМ запросто мы можем получить постоянное напряжение от 0 до 5В, но для большиства полевых транзисторов этого может оказаться мало, поэтому, пропущенный шаг 2 звучит так

Шаг 2. Усиливаем полученное напряжение вдвое (делаем его от 0 до 10В)

Вот собственно схема, с которой я Вам предлагаю поэкспериментировать самому. Я опишу как именно. Для начала разберём схему

Все стрелочки вверх (питание) - имеется в виду 12В. Слева - Ардуина. Мы подключены к пину 3.

Наш первый шаг - это интегрирующая цепочка R1-C1. Она схгаживает ШИМ так, что напряжение в точке А постоянное (зависит от скважности ШИМ) и равно 0 при analogWrite(3, 0); и 5В при analogWrite(3, 255); В промежутке между 0 и 255 напряжение линейно изменяется при изменении скважности. 

Можете собрать только эту часть и померить - убедиться, поэкспериментировать

Т.е. первый шаг мы сделали.

Второй шаг - это усилитель на микросхеме LM358N и двух резисторах R2 и R3. Выход усилителя - точка В. Напряжение в точке B всегда будет вдвое больше, чем напряжение в точке А, т.е. будет меняться по тому же линейному закону от скважности, но не от 0 до 5В, как в А, а от 0 до 10В. 

Опять же, можете собрать эту часть схемы и попробвать - поиграться, убедиться.

Наконец, третий шаг. Транзистор (не обязательно IRFZ44N, просто он оказался у меня под рукой, но, кстати, по току, напряжению и т.п. он Вам вполне подойдёт).

В цепи затвора стоит резистор R4 1К. Можно меньше - до полукилоома - нормально. Его задача не позволить угробить усилитель током заряда ёмкости транзистора.

Параллельно мотору стоит диод для защиты от выброса в момент выключения двигателя. Это моя перестраховка. В принципе диод есть "внутри" транзистора, так что наш диод лишний. Но я ставлю от греха.

Еще бы там варистор поставить и снаббер, но это давайте отдельно, если Вам решене понравится. Вы попробуете, потом обсудим чего можно добавить.

Теперь внимание, порядок экспериментов и тюнинга:

1. Загружаете вот такой скетч

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(0xFFFFFFFF);
}

void loop() {
	static int motorPower = 0;
	analogWrite(3, motorPower);
	Serial.print("Motor power: ");
	Serial.println(motorPower);
	motorPower = Serial.parseInt();
}

2. Включаете схему. Мотор крутиться не должен, амперметр должен показывать ноль или около того.

3. Понемножку вводите в мониторе порта всё большие и большие числа, пока мотор не начнёт чуть-чуть крутиться (ШИМ-min). У меня начал при ШИМ-min = 62.

4. Следите за ампераметром и вводите все большие и большие числа, пока ток не будет максимальным (больше которого вы не хотите) - ШИМ-max. У меня это произошло при ШИМ-max = 80.

Первый этап закончен. В принципе этим добром уже можно пользоваться, просто подавать на двигатель ШИМ от ШИМ-min до ШИМ-max и всё будет тип-топ, но тут есть неприятность. У меня например диапазон управления получился уж больно маленьким от 62 до 80 - всего 18. Грубоватое управление получается.

Простейший способ решения проблемы таков. 

1. Замерять напрядение в точке B при ШИМ-max. Допустим оно получается 7В.
2. Поменять резисторы усилителя R2 и R3 так. чтобы максимальное напряжение в точке B (при analogWrite(3, 255) было именно 7В, а не 10, как мы сделали изначально.

Тогда вместо 62-80 будем иметь управление 198-255 (т.е. двигатель будет трогаться при 198, а максимальный ток набирать при 255). Т.е. у нас теперь управление 255-198 = 57 шагов, всяко лучше, чем было 80-62 = 18 шагов. Управление стало более тонким.

ЧТобы менять резистору в усилителе их надо расчитать. Примерно они должны быть 10-ки килоом. ФОрмула связывающая напряжения в точках А и В с резисторами такая:

Ну, вот, как-то так.

P.S. Транзистор нужно ставить на радиатор. Для коротких экспериментов не обязательно, а на постоянку нужно.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

distsys пишет:

Готовую микросхему на больший ток и без изменения полярности.

Во, блин, пока я писал про рассыпуху, Вы уже ответили, причём не так. Ладно, с ходу я не помню микросхемы, надо порыться в файлах.

Но, кстати, почти любой микросхеме всё равно потребуется интегрирующая цепочка и ещё какая обвязка. Вы ничего особо не выиграете по сравнению с рассыпухой, как я описал. Может из рассыпухи просто сделаете?