Автор Тема: Регулиране на обороти на постояннотоков двигател  (Прочетена 51125 пъти)

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Нека да започнем с алгоритъма за управление и да разгледаме нещата така - трябва да измерим една входна величина в нашия случай скоростта на въртене на педалите и да я преобразуваме в друга изходна величина - скорост на въртене на мотора.  Предполагаме, че имаме линейна връзка между входната и изходната величина и можем да запишем нещата така: N_motor = N_pedal * K. Нека сега да видим как пратически става това. Имаме следните задачи:
1. Измерване скоростта на въртене на педалите - трябва да имаме датчик, който да ни дава импусли чиято честота пропорционална на скоростта на въртене. Тъй като честота ще е ниска, ще е по удачно да измерваме периода на постъпващите импулси и след това да изчислим честотата.
2. Изчисление на изходнта величина по формулата по горе - тук нещата са изцяло софтуерни, след като сме определили коефициента К нещата се свеждат до умоножение.
3. Задаване скоростта на мотора - ще реугулираме скоростта чрез промяна на напрежението подавано към мотора. Напрежението от своя страна ще променяме чрез PWM сигнал с помощта на описаната  преди схема.
Идеята е да реализираме горния алгоритъм с Ардуино и в следващия пост ще видим какви хардуерни ресурси ще са ни нужни за да  решим задачата.
Един уточняващ въпрос към importante: Педалите които ще задават скоростта на движение вързани ли са физически към някое колело, както е при стандартен велосипед?

Ясен Паунски,  гр.София, 39 г.

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
За да мога да предавам движението и на двете колела отзад съм усложнил малко конструкцията, но като цяло изглежда така:




Датчика, който имам е такъв, но мисля че ако закача повече магнити мога да увелича честотата на входящия импулс и да стане по фино регулирането..:



Мартин Костадинов
Skype - Optixam

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
Правя сега схемата с IR2104, имам няколко въпроса за кондензаторите C15 и C16 електролитни ли са, понеже на схемата са без поляритет и не знам какви да слагам.Мисля да тествам схемата подобно на този https://www.youtube.com/watch?v=T9Zpir5hidw , но да свързвам ли масата на Arduino с общата маса или да го захраня от същото захранване на драйвера?
« Последна редакция: Март 08, 2015, 12:10:19 am от importante »
Мартин Костадинов
Skype - Optixam

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
В мойто изпълнение на въпросната схема ползвам керамични (SMD) кондензатори,  тъй като те са с нисък ESR, но може да ползваш и електролитни. Задължително трябва да имаш обща маса межу ардуино и драйвера. Ардуиното може да го захраниш и отделно. Сложи в управляващите вериги към Ардуино по 100 ома последователно (сигнало IN, SD).
Кой пин на ардуино ще ползваш за PWM?  Имай предвид че функцията "analogWrite" ползва PWM сигнал с честота около 500 - 1000Hz,  която може да е малко ниска за това приложение. Тези дни четох как може да се промени честотата, но не съм експериментирал още.
Ясен Паунски,  гр.София, 39 г.

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
Запоявам цял ден, Arduino го захраних направо от стабилизатора на драйвера, на SD подавам +5V а на pin 3 съм свързал IN. Не тръгна, на изхода няма никакво напрежение, значи въобще не отпушва транзисторите.. http://www.edaboard.com/thread133948.html тук чета, че честотата трябвало да е около 2-3 kHz и резисторите към гейта при честота 1kHz да са около 200 ома,значи може и да става с по-ниска честота, но разбира се това което пишат не може да бъде на 100% Нещо е трудно да го подкарам този драйвер, но предполагам че е от честотата на сигнала

Това не знам дали ще помогне..
http://www.instructables.com/id/ARDUINO-SOLAR-CHARGE-CONTROLLER-Version-30/step10/SCHEMATIC-AND-WORKING/

// Buck Converter test code

#include <TimerOne.h>
 
void setup()
{
  // Initialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards
  pinMode(13, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  Timer1.initialize(20); // set a timer of length 8uS
  //Timer1.attachInterrupt( timerIsr ); // attach the service routine here
 
  //Set duty cycle
  //Timer1.pwm(9,256);  // 25% duty cycle
 // Timer1.pwm(9, 512); // 50% duty cycle
  Timer1.pwm(9, 768);  //  75% duty cycle
}
 
void loop()
{
  // Main code loop
  // TODO: Put your regular (non-ISR) logic here
}
 
/// --------------------------
/// Custom ISR Timer Routine
/// --------------------------
void timerIsr()
{
    // Toggle LED
    //digitalWrite( 13, digitalRead( 13 ) ^ 1 );
}
« Последна редакция: Март 09, 2015, 05:02:00 am от importante »
Мартин Костадинов
Skype - Optixam

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Тествах кода, който си дал и при мен схемата работи. Честототата  е малко висока 50KHz (период 20us) за управление на мотор, но може лесно да бъде намалена при инициализация на таймера. Аз тествах при 20kHz (50uS), но няма проблем и да работи на 1kHz (пробвах го). 
Timer1.initialize(50); //20kHzОтносно схемата първо провери захранващото напрежение на пин 1 на драйвера, трябва да в рамките на 10 до 20V. Провери контролните сигнали (IN, SD). Аз свързах цифров пин 8 на Ардуино с пин 3 на IR2104 (тук имаме постоянно високо ниво), а цифров пин 9 (PWM) го вързах на пин 2(IN). Захраних моста с 24V, a IR2104 я захранвам с 12V с един 7812. Ардуиното го захранвам от USB.  Провери дали имаш връзка между масите на Ардуино и драйвера.  Не се плаши ако не тръгне от първия път, това е нормално :)
Ясен Паунски,  гр.София, 39 г.

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
Точно както си го свързал ти, така го свързах и аз, на Arduino pin 9 свързвам към PWМ на интегралата, от Pin 8 на Arduino подавам към SD.Масите на драйвера и Arduino са общи понеже ги захранвам от един и същ стабилизатор.
Какво трябва да имам на изхода на драйвера на LO и HO, да го проверя, понеже може да съм издумкал единия транзистор и за това да не завърта мотора.Първоначално бях обърнал местата на гейт и сорс..

Мартин Костадинов
Skype - Optixam

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
С колко волта захранваш ардуиното и драйвера?  Провери с мултицет всички връзки. Направи една снимка да видим как изглежда монтажа.
Относно проверката на LO & HO - първо настрой ардуиното да генерира PWM с коефициент на запълване 25 % и включи схемата. Ако имаш осцилоскоп на изхода LO трябва видиш този PWM сигнал инвертиран, т.е с PWM =75% и с амплитуда равна на захрaнването на драйвера. Ако мериш с мултицет нещата трябва да изглеждат така: на изход 9 на ардуинo трябва да имаш около 1.25V (5V*0.25), което се подава на на pin2-IR2104. При захранване 12V на изхода LO трябва да измериш около 9V (12V*0.75). Това е така наречената "low side"  част на драйвера.
Сега при изхода HO нещата са по-сложни. За захранването на тази част от драйвера (high side) се използва схема за повдигане на напрежението в която участват D3, C15 и Q2. Провери дали въпросните елементи са свързани правилно. След това провери с мултицет напрежението върху C15, ако всичко е наред трябва да имаш около 12V, което показва, че BOOST схемата работи изправно. Без да влизам в детайли по-работата на BOOST схемата при захранване 24V на транзисторите и PWM=25% на изход HO измерваме около 9V. Aко всичко дотук е наред на pin-6(Vs) трябва да имаме 4V (24V*0.25).
« Последна редакция: Март 10, 2015, 11:14:05 am от yasko »
Ясен Паунски,  гр.София, 39 г.

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
Arduino съм го заредил с тази същата програма от по-предният ми пост, само че я редактирах както ти каза:
Timer1.initialize(50); //20kHz
Arduino и драйвера се захранват от същото захранване, с което захранвам и мотора, само че минават през 7812.
pin 9 свързан към IN имам около 3.75V,а на pin 8 свързан към SD имам 5V
На драйвера имам на Vcc  и на общата точка с C15, както и VB - 12V, след кондензатора няма никакво напрежение(VS), както и на LO и HO
BOOST схемата ли не работи, проверявах всичко многократно, смених кондензатора C15 със 100n и същата работа.Транзисторите имат изолационна подложка, не се вижда на снимките, както и C16 е директно на транзистора и маса запоен.





Мартин Костадинов
Skype - Optixam

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Започва да става интересно :)
Първо да корегираме стойността на PWM на Ардуино, тъй като в момента е на 75% (3,75V -pin9), пък аз съм мерил при 25%. Откоментирай този ред:
Timer1.pwm(9,256);  // 25% duty cycle Сега измери какво имаш на крачета 2 & 3 на IR2104. Целта е да се провери дали PWM сигнала стига до драйвера. Ако на изходите отново няма никой, разкачи транзисторите и виж какво има на изход LO, ако схемата е изправна трябва да измериш около 9V, както писах. В противен случай може да се окаже че схемата не е изправна. Провери още веднъж включването на IR2104.
Ясен Паунски,  гр.София, 39 г.

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
Готово!
На IN имам около ~1.3V на SD имам ~5V, на LO около 8.5V и мотора завъртя.Накрая май се оказа че имам студена спойка при изводите на Arduino платката, но не съм забелязал.Казвам ''май'' понеже презапоих и подмених всичко без драйвера, и може и да не е било само това!Доволен съм, че не е изгорял драйвера или някой транзистор, понеже няма магазин наблизо и всичко поръчвам онлайн и чакам по 2 седмици за някой неща..
Голямо благодаря на yasko за отделеното време, внимание и ценните съвети и напътствия!!!
Сега остава да се сътвори и кода, който ще задвижва мотора от педалите и да се тества на живо  :) :)

Откоментирах този ред, с него тръгна, но ако било заради спойката, може и с 75% да става, ще пробвам да видя какво ще се получи..
Timer1.pwm(9,256);  // 25% duty cycle
Мартин Костадинов
Skype - Optixam

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Браво! Успя да го подкараш.
Ще трябва малко да  поправиш този обемен монтаж защото като тръгнат големите токове може да има още проблеми и изпушване на елементи :)
Предлагам като следваща стъпка да се направи насторйка на PWM чрез потенциометър закачен на някой от аналоговите входове на ардуино.
Ясен Паунски,  гр.София, 39 г.

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
Готово е и това, направих направо нова платка, по-прегледно е, и по-безопасно и ето как изглежда :
https://www.youtube.com/watch?v=SPcRLIZKfe4





Закачил съм потенциометър към pin А0 на Arduino.С този код:
#include <TimerOne.h>
 int potPin = 0;
 int potValue = 0;
void setup()
{
 
  pinMode(13, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  digitalWrite(8, HIGH);
  Timer1.initialize(20);
 
Timer1.pwm(9,256); 
}
 
void loop()
{

  potValue = analogRead(potPin) / 4;
  analogWrite(9, potValue);
}
 

void timerIsr()
{
   
}
Мартин Костадинов
Skype - Optixam

yasko

  • Administrator
  • *****
  • Публикации: 484
    • Профил
Много добре изглежда.
Някои насоки за следващите стъпки по софтуера, както писах в предните постове ще мерим период, което значи, че ще измерваме времето между два фронта на постъпващите импулси. Един от вариантите е да вържеш входа на датчика на пин 3  и да закачиш прекъсване на този пин  (примерно по преден фронт). Вътре в прекъсването четеш текущата стойност на времето с помощта на функците millis() или micros(). Периода на импулса ще в равен на разликата в стойностите прочетени в две последователни прекъсвания.
Трябва да уточним диапaзонa на измерваните импулси за да може да се сложат граници на валидните стойности за измервания период.
Ясен Паунски,  гр.София, 39 г.

importante

  • Зомбиран Роботостроител
  • *****
  • Публикации: 178
    • Профил
Значи до колкото разбирам, програмата няма да брои моментите на включване, (моментите заключени между две прекъсвания) ами самите прекъсвания? За диапазона на импулсите си го представям така:



По този начин на един оборот на педалите отговарят 8 импулса.Максимален брой импулси може да са 16Hz(два оборота в секунда).И ако го разделя на части при засечени над 4Hz входящи импулси двигателя да върти на 25%, после на 8Hz-50% 12Hz-75% 16Hz 100%..
Това при положение, че въртя педалите с 2 пълни оборота за 1 секунда и това да е максималният праг.
« Последна редакция: Март 16, 2015, 08:12:32 pm от importante »
Мартин Костадинов
Skype - Optixam