-
Вложений: 2
Н-Мост на MOSFET+Arduino
Всем привет! Идея такова: Собрать для модели mosfet модуль управления двигателями ходовой. Для этого нужно собрать Н-Мост на Мосфетах и управлять им RC Пультом через Arduino.
Содрал в нете следующую схемку Н-моста Предварительно подправив в плане используемых Мосфетов и уменшил номеналы R3 и R4 с 20 до 10ко.
Вопрс первый правильно ли я понимаю принцип работы этой схемы: Когда на портах "A=1" "В=0" Задействованны VT2 и VT3 и работают они следующим образом: VT3 "Р" открыт за счет того что он зацеплен на землю через резистор R4 ном 10к и пропускает через себя +12v к мотору, затем VT2 "N" получая от порта "А" позитивный управляющий сигнал открываеться и пропускает через себя +12v идущие через мотор к земле?
Вопрос второй: Возможна ли плавная регулировка оборотов двигателя по средствам "ШИМ" Тоесть если я запущу в порт "A" сигнал "ШИМ" допустим
PHP код:
void setup()
{
pinMode(5, OUTPUT);
}
void loop()
{
analogWrite(5, 128);
}
То VT2 должен открыться чуть больше чем на половину, соответственно регулируя обороты двигателя.
Касательно схемы: Выбрал её как по моему взгляду наиболее подходящую для управления ШИМом. По одной причине что на мой взгляд R3 и R4 в периодах прирывания будут избавлять VT от паразитных зарядок Мосфетов не давая им тем самым перейти в линейное положение. Склоняюсь еще к тому что сигнал ШИМ лучше завести не на прямую в порты "А/B" а через транзисторный ключь.
Подведу итог:
1. Хотелось бы узнать правильно ли я понял принцип работы данного Н-Моста в том числе и насчет ШИМа.
2. По схеме Н-Моста. Ваши мысли по поводу выбора типа Мосфетов и всяческие советы по улучшению схемы.
-
Вложений: 1
Re: Н-Мост на MOSFET+Arduino
Не совсем правильная схема
Вот проверенный рабочий вариант
-
Re: Н-Мост на MOSFET+Arduino
Отлично, спасибо. Характеристики IRF7319 тоже порадовали. Насчет транзисторов для ключей: Подойдут простые транзисторы или в виду того что управляться будет ШИМом лучше взять с высокой скоростью срабатывания?
-
Re: Н-Мост на MOSFET+Arduino
-
Re: Н-Мост на MOSFET+Arduino
С прошивкой только начал разбераться но думаю использовать аппаратный шим с частотой еще не совсем разобрался. Ка к я понемаю например вот в таком случае:
PHP код:
void setup()
{
pinMode(5, OUTPUT);
TCCR0B = TCCR0B & 0b11111000 | 5;
}
void loop()
{
analogWrite(5, 128); // скважность от 0 до 255
}
Частота задается строкой
PHP код:
TCCR0B = TCCR0B & 0b11111000 | 5;
в таком случае частота 60 Гц
я вот не знаю для управления Мосфетами нужна какаято определенная частота? или частота в данном случае будет изменять лиш скорость смены скважности?
Мне предстоит еще выяснить с какой частотой и скважностью сигнал на пропорцеональном выходе RC приемника затем обробатывая это сигнал arduino будет менять скважность на выходе к Н-Мосту.
ps: Схема Н-Моста выложенная мной не работает, вернее работает но бешанно греется "Р" мосфет. Если сигнал с порта "А" то VT1 если с порта "В" то VT3
-
Вложений: 1
Re: Н-Мост на MOSFET+Arduino
Спасибо за схемку. собрал по ней Н-мост, работает отлично. Разобрался с сигналом от RC приемника. частота 50Гц длинна периода 20мс Down-18,5mc, Up-1.5mc. (среднее значение) сигнал варирует от Down-17,5мс Up-2,5mc. Следовательно для управления есть 5мс в каждую сторону от среднего значения. Проще говоря при среднем значении Arduino молчит, при значении от Up-1,5mc до Up-2mc крутит мотор в одну сторону, при значении от Up-1,5mc до Up-1mc в другую сторону.
Вот только не знаю как это обработать в Arduino. Прочитать этот сигнал с аналогова порта, перевести полученное значение в байты и назначить на них запись в порт идущий на мотор значение 0-255???
-
Re: Н-Мост на MOSFET+Arduino
Нарыл фукцию pulseIn по всей видимосте это то что мне нужно, функция считывает длинну сигнала H или L. Есть у кавонибудь пример использования этой функции? или подскажите уже существующий проект с ее использованием.
-
Re: Н-Мост на MOSFET+Arduino
-
Re: Н-Мост на MOSFET+Arduino
PHP код:
#include <TimerOne.h>
#define BTNPIN 2 // Вход сигнала
#define L 5 // Выход на H-Мост вращение в лево
#define R 6 // Выход на H-Мост вращение в право
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
void setup()
{
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
startImpuls=0;
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
pinMode (L, OUTPUT);
pinMode (R, OUTPUT);
Serial.begin(115200);
Timer1.initialize(10); // Интервал срабатывания таймера 10мкс
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING); // Запуск таймера при наличии сигнала HIGH
}
void callback() { timerCount++; }
void loop()
{
if (lengthImpuls > 0)
{
uint16_t li = lengthImpuls;
lengthImpuls=0;
if (li > 100 && li < 150) // эамер сигнала для вращения в лево
analogWrite (L, 23 - li);
if (li > 155 && li < 200) // эамер сигнала для вращения в право
analogWrite (R, 23 - li);
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, RISING);
}
-
Re: Н-Мост на MOSFET+Arduino
-
Re: Н-Мост на MOSFET+Arduino
Цитата:
Сообщение от
Chip
Управлять то получилось?
Не совсем :( подправил окно со скетчем по последним изменениям, ну вот собственно и описание эксперемента:
Повторюсь что бы было понятно как работает сигнал с RC приемника. После включения ДУ пульта на выходе сигнал 1,5 мс (150 тактов таймера по 10мкс) При нажатии рычага в право сигнал плавно увеличивается от 1,5мс до 2мс... При возврате рычага в нейтральное положение естественно возвращается на 1,5мс... При нажатии рычага в лево сигнал плавно уменьшается с 1,5мс до 1мс.
Вот что у меня получилось: цепляю Н-Мост на 5 или 6 пин (L,R) мотор начинает крутить сразу после включения пульта. Думаю что идет запись в оба порта L и R сигнала 1,5мс при нейтральном положении. Нажимая рычаг в лево обороты двигателя возрастают. Перекидываю провод с пина 5 "L" на пин 6 "R" мотор крутится, но при нажатии рычага в право обороты двигателя снежаются. Следовотельно вывод: При нейтральном сигнале идет запись в оба порта L и R допустим от 0-128 при уменьшении сигнала в порт L записывается 0-255 а при увиличении в порт R записывается 255-0.
Мои знания иссякли. Просмотрел все проекты на форуме, совсем запутался. Но мысль такая что надо замерять от 100 до 200 тактов для обоих каналов а потом как то методом сравнения назначать на этот сигнал запись в порты...
Эдуард подскажи плиз как мне это органезовать... я иссяк, мой словарный запас программирования израсходован :)
зы: связь с компом используется только для просмотра приходящих данных.
-
Вложений: 1
Re: Н-Мост на MOSFET+Arduino
Давай начнем с Н-моста.
Для плавной регулировки оборотов например влево нужно:
На вход А моста подать логический 0, а на вход В подавать ШИМ сигнал от 0 до 255.
Для плавной регулировки оборотов например вправо нужно:
На вход В моста подать логический 0, а на вход А подавать ШИМ сигнал от 0 до 255.
Для остановки двигателя нужно на входы А и В подать логический 0.
Теперь вопрос какие пределы регулировки нужны?
Правильно ли я понимаю что изменение сигнала с пульта 1,5мс до 2мс это у тебя должно вызывать измениение ШИМ от 0-255?
-
Re: Н-Мост на MOSFET+Arduino
Цитата:
Сообщение от
Chip
...Правильно ли я понимаю что изменение сигнала с пульта 1,5мс до 2мс это у тебя должно вызывать измениение ШИМ от 0-255?
И, вроде, при изменении длительности от 1,5 до 1мс тоже ШИМ должен меняться 0-255, только теперь на выводе В, а вывод А должен =0.
-
Re: Н-Мост на MOSFET+Arduino
Цитата:
Сообщение от
edw123
И, вроде, при изменении длительности от 1,5 до 1мс тоже ШИМ должен меняться 0-255, только теперь на выводе В, а вывод А должен =0.
Правильно. При изменении сигнала от 1,5мс до 2мс в порт A 0-255 при изменении сигнала от 1,5мс до 1мс в порт B 0-255
-
Re: Н-Мост на MOSFET+Arduino
теперь математика 2000-1500=500 , 1500-100=500 , 500мкс делим на 2мкс получим диапазон ШИМ 250, почему у тебя диапазон ШИМ 50?
-
Re: Н-Мост на MOSFET+Arduino
Цитата:
Сообщение от
Chip
теперь математика 2000-1500=500 , 1500-100=500 , 500мкс делим на 2мкс получим диапазон ШИМ 250, почему у тебя диапазон ШИМ 50?
здесь диапазон задается? analogWrite (R, 23 - li);
-
Re: Н-Мост на MOSFET+Arduino
Извини что не могу ответить развернуто , все никак не дают сосредоточится вникнуть, вечером все проверю
-
Re: Н-Мост на MOSFET+Arduino
Да нет проблем. Спасибо что вообще нашел время.
-
Re: Н-Мост на MOSFET+Arduino
Проверить мне не начем , так что пробуй и отпишись по результатам.
PHP код:
#include <TimerOne.h>
#define BTNPIN 2 // Вход сигнала
#define L 5 // Выход на H-Мост вращение в лево
#define R 6 // Выход на H-Мост вращение в право
volatile uint16_t lengthImpuls, timerCount;
void setup()
{
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
pinMode (L, OUTPUT);
pinMode (R, OUTPUT);
analogWrite (L, 0);
analogWrite (R, 0);
Timer1.initialize(2);
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING);
}
void callback() { timerCount++; }
void loop()
{
uint16_t li = lengthImpuls;
if (li > 499 && li < 1001)
{
if (li >= 750) {analogWrite (R, 255-(1000-li)); analogWrite (L, 0);}
if (li < 750) {analogWrite (L, 750-li); analogWrite (R, 0);}
lengthImpuls=0;
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
timerCount=0;
detachInterrupt(0);
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
lengthImpuls = timerCount;
detachInterrupt(0);
attachInterrupt(0, fireUp, RISING);
}
-
Re: Н-Мост на MOSFET+Arduino
При выключенном пульте начинает прирывисто крутить, включаю пульт останавливается. нажимаю в лево пин L начинает с высоких оборотов крутится, и к малым оборотам снижается. при нажатии в право на порт L тоже немного выдает (медленно крутится) пин 6 R совсем молчит.
Может укоротить импулс с 750 до 730 примерно, чтоб лишнего не захватывал? щас попробую с настройками поиграть.
-
Re: Н-Мост на MOSFET+Arduino
При выключенном пульте начинает прирывисто крутить, включаю пульт останавливается. нажимаю в лево пин L начинает с высоких оборотов крутится, и к малым оборотам снижается. при нажатии в право на порт L тоже немного выдает (медленно крутится) пин 6 R совсем молчит.
Может укоротить импулс с 750 до 730 примерно, чтоб лишнего не захватывал? щас попробую с настройками поиграть.
PHP код:
void loop()
{
if (lengthImpuls > 0)
{
uint16_t li = lengthImpuls;
lengthImpuls=0;
if (li > 100 && li < 150) // замер сигнала для вращения в лево
// analogWrite (L, 23 - li)
Serial.print (li,DEC);
if (li > 155 && li < 200) // замер сигнала для вращения в право
// analogWrite (R, 23 - li);
Serial.print (li,DEC);
}
}
Вот с такими установками в комп риходит чистый сигнал и нет посылок в период когда положение в середине и при выключенном пульте.
-
Re: Н-Мост на MOSFET+Arduino
может лучше сделать на сравнении байтов а не на прямую переводить длинну сигнала в значение 0-255?
-
Re: Н-Мост на MOSFET+Arduino
-
Re: Н-Мост на MOSFET+Arduino
Цитата:
Сообщение от
XsanderS
может лучше сделать на сравнении байтов а не на прямую переводить длинну сигнала в значение 0-255?
Да в общем если алгоритм работает , то дальше можно по любому пробывать
А вот Serial.print лучше не использовать
-
Re: Н-Мост на MOSFET+Arduino
Цитата:
Сообщение от
Chip
Да в общем если алгоритм работает , то дальше можно по любому пробывать
А вот Serial.print лучше не использовать
Щас вообще ничего не делает. насчет Serial.print согласен, но у меня не получилось отправиь li мотодом Serial.write. я так понял что данные както надо преобразовать из li в буфер и потом отсылать их методом Serial.write
-
Re: Н-Мост на MOSFET+Arduino
Код подправил попробуй еще разок, логической ошибки не вижу , может длительность импульса все таки другая? Или импульс в инверсии получаешь?
Я вообще про Serial имел ввиду, эта функция очень много ресурсов требует и времени на отправку
-
Re: Н-Мост на MOSFET+Arduino
Нет никакой реакции, когда пульт выключен на pin 5 L немного идет, мотор подвывает скорее всего хватает короткие поразитные импульсы, так как когда пульт выключен то на выходе проскакивают сигналы по 50-500 мкс примерно.
-
Re: Н-Мост на MOSFET+Arduino
А ты чем измерял сигнал на входе пина D2 ?
Может всетаки где то ошибся?
-
Вложений: 2
Re: Н-Мост на MOSFET+Arduino
Вот такие данные приходят в комп при след параметрах замера.
PHP код:
if (li > 100 && li < 150) // замер сигнала для вращения в лево
// analogWrite (L, 23 - li)
Serial.print (li,DEC);
if (li > 155 && li < 200) // замер сигнала для вращения в право
// analogWrite (R, 23 - li);
Serial.print (li,DEC);
-
Re: Н-Мост на MOSFET+Arduino
А весь код для замеров можно посмотреть
-
Re: Н-Мост на MOSFET+Arduino
Цитата:
Сообщение от
Chip
А ты чем измерял сигнал на входе пина D2 ?
Может всетаки где то ошибся?
Arduino осцилографом. да нет наврятли ошибся, сигнал стандартный у всех пультов и осцилограф его подтвердил. только щас заметил что ты изменил такт срабатывания таймера на 2мкс, выше указанные замеры я проводил на таймере с тактом в 10мкс.
-
Re: Н-Мост на MOSFET+Arduino
вот полностью код
PHP код:
#include <TimerOne.h>
#define BTNPIN 2
#define L 5
#define R 6
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
void setup()
{ /*
LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении значения на входе;
RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
*/
startImpuls=0;
lengthImpuls=0;
pinMode(BTNPIN, INPUT);
pinMode(L, OUTPUT);
pinMode(R, OUTPUT);
pinMode(13, OUTPUT);
pinMode(13, LOW);
Serial.begin(115200);
Timer1.initialize(10);
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
attachInterrupt(0, fireUp, RISING);
}
void callback() { timerCount++; }
void loop()
{
if (lengthImpuls > 0)
{
uint16_t li = lengthImpuls;
lengthImpuls=0;
if (li > 100 && li < 150) // замер сигнала для вращения в лево
// analogWrite (L, 23 - li)
Serial.print (li,DEC);
if (li > 155 && li < 200) // замер сигнала для вращения в право
// analogWrite (R, 23 - li);
Serial.print (li,DEC);
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, RISING);
}
-
Re: Н-Мост на MOSFET+Arduino
Ну так я не только время изменил, я поменял немного логику измерения
Ты вообще то мой код пробовал? без каких либо дополнений и изменений?
-
Re: Н-Мост на MOSFET+Arduino
Конечно. я думаю что проблемма сдесь if (li > 499 && li < 1001) сигнал не попадает в эти рамки. щас попробую изменить.
-
Re: Н-Мост на MOSFET+Arduino
Здесь получаются рамки от 1мс до 2мс
-
Re: Н-Мост на MOSFET+Arduino
если посмотреть на сигнал li в serialMonitor какие длительности будет выдавать? Только посмотри через мой код
-
Re: Н-Мост на MOSFET+Arduino
Странно, лолжен попадать. ща вот с твоим скетчем работает так: пин R молчит совсем, пин L начинает сразу крутить мотор. значит скетч захватывает нейтральный сигнал 1,5 мс а на изменения не реагирует...
-
Re: Н-Мост на MOSFET+Arduino
значит нейтральное положение находится реально вверху диапазона
-
Re: Н-Мост на MOSFET+Arduino
if (li >= 750) {analogWrite (R, 255-(1000-li)); analogWrite (L, 0);} так 750=1,5мс
-
Re: Н-Мост на MOSFET+Arduino
1такт таймера равен 2мкс
750х2мкс=1500мкс или 1,5мс