Перейти к содержимому
Форум журнала практической электроники «Датагор»

Оригинал микро-ПК Raspberry Pi 3 Model B+ (Broadcom 1.4GHz quad-core 64 bit processor, Wifi, Bluetooth, USB)

Офигенная миниатюрная рация на литии BaoFeng UV-5R, 5W, 5-15 км! Охота, поход, торговый центр и т.п.

TrueRMS мультиметр UNI-T UT139A с автодиапазонами

Паяльнник 80W с терморегулятором и LCD-дисплеем, популярные жала серии 900M
Wishmaster

Помогите модифицировать программу управления бесколлекторным двигателем постоянного тока.

Рекомендованные сообщения

Здравствуйте товарищи!

Прошу Вас помочь советом о модификации программы управления бесколлекторным двигателем постоянного тока.

Повторил следующую схему:

post-32116-0-41061500-1500409447_thumb.gif

Всё запустилось и отлично работает. Хочу теперь миниатюризировать плату и убрать лишний функционал в виде кнопки запуска и выбора стороны вращения. Опыта в программировании явно не достаёт.

Исходный код:

 

// Подключение бесколлекторного двигателя к AVR(без датчиков)

#include <avr interrupt.h="">

#include <avr io.h="">

#include <util delay.h="">

 

// Фаза U(Верхнее плечо)

#define UH_ON TCCR1A |= (1 << COM1A1);

#define UH_OFF TCCR1A &= ~(1 << COM1A1);

 

// Фаза U(Нижнее плечо)

#define UL_ON PORTB |= (1 << PB5);

#define UL_OFF PORTB &= ~(1 << PB5);

 

// Фаза V(Верхнее плечо)

#define VH_ON TCCR2 |= (1 << COM21);

#define VH_OFF TCCR2 &= ~(1 << COM21);

 

// Фаза V(Нижнее плечо)

#define VL_ON PORTB |= (1 << PB0);

#define VL_OFF PORTB &= ~(1 << PB0);

 

// Фаза W(Верхнее плечо)

#define WH_ON TCCR1A |= (1 << COM1B1);

#define WH_OFF TCCR1A &= ~(1 << COM1B1);

 

// Фаза W(Нижнее плечо)

#define WL_ON PORTB |= (1 << PB4);

#define WL_OFF PORTB &= ~(1 << PB4);

 

#define PHASE_ALL_OFF UH_OFF;UL_OFF;VH_OFF;VL_OFF;WH_OFF;WL_OFF;

 

#define SENSE_U ADMUX = 0; // Вход обратной ЭДС фазы U

#define SENSE_V ADMUX = 1; // Вход обратной ЭДС фазы V

#define SENSE_W ADMUX = 2; // Вход обратной ЭДС фазы W

 

#define SENSE_UVW (ACSR&(1 << ACO)) // Выход компаратора

 

#define START_PWM 10 // Минимальный ШИМ при запуске

#define WORK_PWM 100 // Рабочий уровень ШИМ

 

unsigned char start_stop = 0;

volatile unsigned char motor_pwm = WORK_PWM;

volatile unsigned char commutation_step = 0;

volatile unsigned char rotor_run = 0; // Счетчик импульсов обратной ЭДС

 

// Крутим по часовой стрелке

void commutation(unsigned char startup)

{

switch (commutation_step)

{

case (0):

if(!SENSE_UVW || startup)

{

UH_ON; // На фазе U - ШИМ

WH_OFF; // Фаза W отключена

SENSE_W; // Активируем вход фазы W

commutation_step = 1; // Следующий шаг

TCNT0 = 0; // Обнуляем счетчик T0

}

break;

 

case (1):

if(SENSE_UVW || startup)

{

VL_OFF; // На фазе V - лог. 0

WL_ON; // На Фазе W - лог. 1

SENSE_V; // Активируем вход фазы V

commutation_step = 2;

TCNT0 = 0; // Обнуляем счетчик T0

}

break;

 

case (2):

if(!SENSE_UVW || startup)

{

UH_OFF; // Фаза U отключена

VH_ON; // На фазе V - ШИМ

SENSE_U; // Активируем вход фазы U

commutation_step = 3;

TCNT0 = 0; // Обнуляем счетчик T0

}

break;

 

case (3):

if(SENSE_UVW || startup)

{

UL_ON; // На фазе U - лог. 1

WL_OFF; // На Фаза W - лог. 0

SENSE_W; // Активируем вход фазы W

commutation_step = 4;

TCNT0 = 0; // Обнуляем счетчик T0

}

break;

 

case (4):

if(!SENSE_UVW || startup)

{

VH_OFF; // Фаза V отключена

WH_ON; // На фазе W - ШИМ

SENSE_V; // Активируем вход фазы V

commutation_step = 5;

TCNT0 = 0; // Обнуляем счетчик T0

}

break;

 

case (5):

if(SENSE_UVW || startup)

{

UL_OFF; // На фазе U - лог. 0

VL_ON; // На Фазе V - лог. 1

SENSE_U; // Активируем вход фазы U

commutation_step = 0;

TCNT0 = 0; // Обнуляем счетчик T0

}

break;

}

}

// Обработчик прерывания по компаратору. Детектор обратной ЭДС

ISR(ANA_COMP_vect)

{

rotor_run++; // инкрементируем импульсы

if(rotor_run > 200) rotor_run = 200;

if(rotor_run == 200) // Если импульсы обратной ЭДС присутствуют, крутим наполную

commutation(0);

}

// Обработчик прерывания по переполнению Т0. Работа двигателя без сигналов обратной ЭДС

ISR(TIMER0_OVF_vect)

{

commutation(1); // Если сработало прерывание, есть пропуски импульсов обратной ЭДС

rotor_run = 0; // Сбрасываем счетчик импульсов

OCR1A = START_PWM; // ШИМ минимум

OCR1B = START_PWM;

OCR2 = START_PWM;

}

// Обработчик внешнего прерывания INT0. Энкодер

ISR(INT0_vect){

_delay_us(100);

if ((PIND & ( 1 << PD2)) == 0){

_delay_us(100);

// Крутим против часовой стрелки

if ((PIND & ( 1 << PD1)) == 0)

{

if(motor_pwm != START_PWM) motor_pwm -= 5; // Уменьшаем ШИМ

}

// Крутим по часовой стрелке

else

{

if(motor_pwm != 255) motor_pwm += 5; // Увеличиваем ШИМ

}

}

GIFR = (1 << INTF0); // Сбрасываем флаг внешнего прерывания

return;

}

 

int main (void)

{

// Порты ввода/вывода

DDRB = 0xFF;

PORTB = 0x00;

DDRD &= ~(1 << PD6)|(1 << PD2)|(1 << PD1)|(1 << PD0);

PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0);

PORTD &= ~(1 << PD6);

 

// T0 - для старта и работы двигателя без сигналов обратной ЭДС

TCCR0 |= (1 << CS02)|(1 << CS00); // Предделитель на 1024

TIMSK |= (1 << TOIE0); // Разрешаем прерывание по переполнению T0

// T1 и T2 ШИМ

TCCR1A |= (1 << COM1A1)|(1 << COM1B1)| // Clear OC1A/OC1B, set OC1A/OC1B at BOTTOM

(1 << WGM10); // Режим Fast PWM, 8-bit

TCCR1B |= (1 << CS10)|(1 << WGM12); // Без предделителя

TCCR2 |= (1 << COM21)| // Clear OC2, set OC2 at BOTTOM

(1 << WGM21)|(1 << WGM20)| // Режим Fast PWM

(1 << CS20); // Без предделителя

 

PHASE_ALL_OFF; // Выключаем все фазы

 

// Аналаговый компаратор

ADCSRA &= ~(1 << ADEN); // Выключаем АЦП

SFIOR |= (1 << ACME); // Отрицательный вход компаратора подключаем к выходу мультиплексора АЦП

ACSR |= (1 << ACIE); // Разрешаем прерывания от компаратора

 

// Внешнее прерывание(Энкодер)

MCUCR |= (1 << ISC01); // Прерывание по заднему фронту INT0(по спаду импульса)

GIFR |= (1 << INTF0); // Очищаем флаг внешнего прерывания

GICR |= (1 << INT0); // Разрешаем внешние прерывания INT0

 

sei(); // Глобально разрешаем прерывания

 

while(1)

{

if((PIND&(1 << PD0)) == 0) // Старт/Стоп

{

_delay_ms(20);

start_stop ^= 1; // Переключаем состояние

while((PIND&(1 << PD0)) == 0){}

}

 

if(start_stop)

{

ACSR |= (1 << ACIE); // Разрешаем прерывание от компаратора

TIMSK |= (1 << TOIE0); // Разрешаем прерывание по переполнению T0

GICR |= (1 << INT0); // Разрешаем внешние прерывания INT0

 

if(rotor_run == 200) // Если импульсы обратной ЭДС присутствуют, можем менять ШИМ

{

OCR1A = motor_pwm;

OCR1B = motor_pwm;

OCR2 = motor_pwm;

}

}

else

{

PHASE_ALL_OFF; // Все фазы выключены

ACSR &= ~(1 << ACIE); // Запрещаем прерывание от компаратора

TIMSK &= ~(1 << TOIE0); // Запрещаем прерывание по переполнению T0

GICR &= ~(1 << INT0); // Запрещаем внешние прерывания INT0

}

 

}

}

 

 

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

 

 

// Обработчик внешнего прерывания INT0. Энкодер

ISR(INT0_vect){

_delay_us(100);

if ((PIND & ( 1 << PD2)) == 0){

_delay_us(100);

// Крутим против часовой стрелки

if ((PIND & ( 1 << PD1)) == 0)

{

if(motor_pwm != START_PWM) motor_pwm -= 5; // Уменьшаем ШИМ

}

// Крутим по часовой стрелке

else

{

if(motor_pwm != 255) motor_pwm += 5; // Увеличиваем ШИМ

}

}

GIFR = (1 << INTF0); // Сбрасываем флаг внешнего прерывания

return;

}

 

 

 

Но, что именно и как понять не могу.

Изменено пользователем Wishmaster

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый день, Дмитрий.

 

Попробуйте из этого куска

 

if((PIND&(1 << PD0)) == 0) // Старт/Стоп

{

_delay_ms(20);

start_stop ^= 1; // Переключаем состояние

while((PIND&(1 << PD0)) == 0){}

}

 

оставить только

 

start_stop = 1;

Изменено пользователем erbol
  • Поддерживаю, плюсую! 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

+

... Хочу, чтобы при подачи питания движок вращался сразу по часовой стрелке, без внешнего прерывания от кнопки. ...

 if(rotor_run == 200) // Если импульсы обратной ЭДС присутствуют, можем менять ШИМ
 {
 OCR1A = motor_pwm;
 OCR1B = motor_pwm;
 OCR2 = motor_pwm;
 }

Если вам не нужна регулировка вращения, то в регистры PWM нужно будет забить какое то конкретное значение, в зависимости от необходимой скорости.

Изменено пользователем Sergiy_83

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за ответы. Завтра опробую Ваши вариаты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здравствуйте товарищи!

Прошу Вас помочь советом о модификации программы управления бесколлекторным двигателем постоянного тока.

 

 

Дмитрий, добрый день!

А можно попросить ссылку на первоисточник данной схемы. интересно посмотреть для каких целей и с какими движками она там применялась.

Для своих целей попробовать использовать.

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Возможно вот оно:

_http://radioparty.ru/prog-avr/program-c/611-lesson-bldc-sensorless

  • Поддерживаю, плюсую! 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, войдите для комментирования

Вы сможете оставить комментарий после входа



Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

  • Сообщения

    • Это значит, что резистор подбирается при настройке. Вполне может быть, что выкусил его настройщик, так как параллельно ему стоит R346 номиналом 51 Ом. Проверьте, что он стоит. При изменении R345 от 620 Ом до 1 кОм, суммарное сопротивление параллельных R345 и R346 меняется всего от 47,1 до 48,5 Ом, что для режима работы данного каскада -  "ловля блох", не говоря о том, что есть подстроечник R351, и говорит лишь о том, что настройщик грамотнее разработчика этой схемы.     Схема, где стоит этот R345, - обычный стабилизатор напряжения с таким вот дебильным "настраиваемым" (и нафиг не нужным) ограничением тока, так как работает на аккумулятор. Кстати, прибор может не работать потому, что эти аккумуляторы (Б1 и Б2) в нём ещё стоят, и давно сдохли.   В этом техническом описании есть таблицы с напряжениями на выводах транзисторов - "Карта напряжений на электродах транзисторов и микросхем", "Карта сопротивлений" для проверки омметром в выключенном состоянии, осциллограммы в контрольных точках.  Это поможет вам найти место неисправности. Перед началом рекомендую проверить исправность всех электролитических конденсаторов. Прибор старый, срок их эксплуатации давно истёк.
    • Доброго времени суток Николай!!!! Огромное спасибо за подсказку!!!! Я не мог чётко прочитать последний символ на плате так как резистор был откусан вместе с краской и как я  теперь выяснил с Вашей помощью, он не R 348 как я предполагал по оттиску от краски а R 345 как показано на схеме на которую Вы указали. За что ещё раз огромное спасибо за вашу помощь. Из таблиц узнал что  там должен быть ОМЛТ-025 - 910 Ом±5% но в примечании напротив стоит значение 620 Ом...1 кОм . Я давно не занимался подобными делами и многое позабыл. Предполагаю придется селекционировать???
    • На первой странице этой темы, в первом посте, в приложенных файлах есть полная документация на этот прибор, со схемами. В ней написано, что резистор R348 - 33 кОм, 0,25 Вт.   Кроме схем, настроить и проверить прибор вам помогут имеющиеся в этой документации техническое описание, методика поиска неисправностей, таблицы напряжений, сопротивлений и т. д.
    • Всем доброго времени суток!!!  У меня появился прибор Р5-10. Свиду без повреждений, даже какие то пломбы на месте.Попробовал включить в розетку (заменив вилку) лампочка питания горит но прибор не работает. Настройки не трогал и решил разобрать посмотреть что внутри. В самом измерителе всё цело, а вот в блок питания кто то залез и выгрыз резистор под номером 348 номинал его я и хочу узнать чтоб его купить и установить. Схемы с номиналом не нашёл поэтому надеюсь на то что кто нибудь посмотрит у себя и сообщит мне. Из за это никону не нужного резистора не хочу разбирать прибор в лом и на эксперименты. Заранее всем спасибо)))))
    • Александр, с точки зрения шумов и других неприятностей, лучше со средней точкой силовой или...? В схемах одного и того же усилителя то мост стоит, то со средней точкой. Влияет на что? 
    • Добрый день! Имеется пара широкополосников 150гдш35-8. Хочу собрать под эти динамики усилитель. Посоветуйте со схемой и доступными комплектующими. 150ГДШ35-8.zip
    • Каждый создает этот "кладезь знаний" для себя сам. Поскольку Ваши запросы весьма общие и довольно таки обширные, без конкретики, то и начинать посоветуют с учебников...Когда один не хочет "зря терять время", то кто-то должен это сделать за него
    • Спасибо за информацию. Можно считать, что дроссель уже есть. Вот ещё иметь информацию об основных правилах подбора железа для выходных трансформаторов. Соотношение сторон магнитопровод а для той или иной мощности, достаточность окна для намотки.. Как мотать, секционирование и тд здесь много обсуждается. Неплохо бы создать этакий "кладезь знаний"… чтобы посмотреть табличку и иметь ясность хотя бы ориентировочно и меньше задавать вопросы. Те же ВАХи самых применяемых ламп, режимы их работы. Согласитесь, лазанье по всему интернету, или в своей "копилке".. Иногда жаль терять время. 
    • Ув. geshka55, все правильно Вы прикинули, обычно дросселя так и делают, чтобы намотка была под завязку, лишнее место там ни к чему. Индуктивности Вам должно хватить с головой, также и сечение провода, выбранное по току для данного случая,  достаточно. Насчет зазора, то даже в выходных трансформаторах, где токи в разы больше, часто применяют лист бумаги 0,1 мм, в сумме 0,2 мм. У меня такая прокладка применена в дросселе, через который питается полностью весь усилитель. Тоже приблизительно около 2 тыс. витков, фильтрация замечательная! 
    • Скажите пожалуйста. Очень много железа, провода, и т д и т п... Универсальный трансформатор для усилителя - тоже нет однозначного ответа. А вот можно ли как-то систематизировать знания о трансформаторном железе и описать оптимальные параметры. Я имею ввиду отношение сторон сечения магнитопровода, размер окна, и какова может его зависимость от мощности.. Читая статью о трансах на любые случаи жизни, постоянно есть отговорки, типа маловато, но можно придумать. Может такой вариант снимет многие вопросы на чем мотать? Как мотать - это уже что-то конкретное к данной лампе, к данному режиму.   
    • Вот пока почитал умных советов, решил сам провести расчет дросселя для усилителя.  В схеме: индуктивность 8 Гн. Питаются 3 лампы 6Н1П. Принял для расчетов ток 50мА. По таблицам пошарил нужные коэффициенты. И вот что получилось: железо - УШ 16х25 с окном 10х28. кол-во витков 2000 &#8709; провода 0,18 зазор 0,25. При проверке заполнения окна получилась площадь 2,6 см2 и как-бы "в притирочку", сопротивление обмотки 136 ом, что означает 6.8 вольт падения на дросселе. Также проверка показала, что индуктивность 7.7-7.8 Гн, что и требовалось доказать. Но вот с зазором. Проложить картон 0,25 под "зуб", или 0,1? перечитал что-ли.. ? он должен быть равен половине заложенного в расчет? Помогите рассеять мысли о плохом. Может у кого опыт был намотки .. Сравните, как у меня - как у вас. Приблизительно хоть у цели я? Если все так, то с утра пойду в электроцех. Есть оборудование для намотки, пропитки и т.д... обещали помочь и с проводом и научить пользоваться станком. Блин, мало 15 типов станков, так еще и намоточный освою.
    • Есть трансформатор без опознавательных знаков... Слегка видно "3050...0.2...380в.. Ш- железо 16х32 высота намотки 40мм.. Эта обмотка как раз целая. Хватит ли применить вот это" чудо" в качестве дросселя? Там, куда он нужен, дроссель 6 гн. Напряжение 475в, ток ну где-то до 350ма. Или потрошить и доматывать, если не перематывать полностью. Спасибо    
    • Если вопрос актуален, вот и схема.https://yadi.sk/d/oMHKET9244a0UQ
    • Судя по формулировке вопроса - вариант один: сдать в ремонт.
    • Александр, прошу прощения, значит изготовление начнется с полным "опустошением" катушек? (на всякий случай спросил, но сам понял, что все с изнова). Но хочу поблагодарить за выдержку и терпение об"яснять нам что такое Z-соединение и делиться личным опытом.
    • Спасибо я решил проблему изменив схема биполярным транзистором)
    • В вашей схеме конденсатор может только зарядится. Нужно, что бы он мог разрядится. Либо резистор высокоомный параллельно конденсатору, или диод параллельно светодиоду в обратном включении. Попробуйте.
    • Добрый день.У меня возник вопрос как создать простейший тестер для определения работоспособности кулеров. Мне пришла партия 4ех контактных кулеров и ситуация с товаром странна. У кулеров через раз работают датчики Холла и собственно вопрос такой у меня есть схемка нарытая на просторах интернета которую хотелось бы доработать для тестов тех же кулеров.Помогите в общем.)
    • Здравствуйте. Телефон Explay не включается. Подсоединил зарядное устройство, но ничего не произошло! Проверяю мультиметром, напряжение есть, а батарея на 100% заряжена, проверял на другом устройстве. Один раз включился, а потом выключился и все. Долго лежал в тумбочке! Везде проверял мультиметром и везде напряжение не меньше 20 Ма, что делать?
    • Уважаемые форумчане, подниму тему. Есть такой тюнер с неработающем одним каналом. Что сделано, поменял полностью все электролиты, заменил выходные на IRF540N. Без выходных канал работает, только тихо, при подключении греются выходные. Подскажите может у кого есть мануал со схемой где указаны замеры напряжения? Буду рад если вышлите на почту sdvpilkin@yandex.ru.
    • Если не трудно прошу ответить на такой может и смешной вопрос: на ТС200-1М блок можно использовать имеющиеся обмотки для выходного транса? Или перематывать? 1-3 и 5-6 почти равны.Хорошо это ли плохо?
    • Может поможет кто определить моточные данные или хотя бы описание трансформаторов, которые случайно обнаружил в инструментальной комнате нашего ансамбля. 1. E14 702 030 2. Amplimo 3A5L4 Буду очень благодарен
    • Мне не к спеху, я пока собираю преусилитель, цап и спектроанализатор. В УМЗЧ можно было и ничего не ставить, хо хотелось чтобы не была голая морда у него. 
    • Придётся немного подождать. Нужно вспомнить что да как... Однако времени прошло достаточно, и  подзабыт и уже давно заброшен тот проект, как не востребованный.
︽ Наверх страницы ︽
×
×
  • Создать...