Например TDA7294

Форум РадиоКот • Просмотр темы - Простое управление коллекторным двигателем с помощью МК
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 24, 2024 19:05:10

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 47 ]    , , 3
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Простое управление коллекторным двигателем с помощью МК
СообщениеДобавлено: Пт мар 30, 2018 12:30:03 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6619
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
сначала попробовал первый вариант, потом второй
частоты сам поправь под свои нужды
добавил схемку, если протеус файл не откроет


Вложения:
upr копия.gif [25.13 KiB]
Скачиваний: 348
upr.zip [47.54 KiB]
Скачиваний: 192

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простое управление коллекторным двигателем с помощью МК
СообщениеДобавлено: Пт мар 30, 2018 12:56:26 
Грызет канифоль

Карма: 9
Рейтинг сообщений: 80
Зарегистрирован: Чт ноя 06, 2014 13:09:06
Сообщений: 251
Рейтинг сообщения: 0
[Я правильно понял, нужно записать так?


Как минимум, так (за логикой что в каком такте делать не следил). Я считаю, что мотор крутится, если стоит хотябы один бит из PD6 и PD7,
если двигатель не крутится - ничего не делаем. Остальные предположения в комметариях.

Код:
ISR (TIMER2_OVF_vect)
{
    static unsigned char takt = 0; // если takt только в этом обработчике, не зачем делать эту переменную глобальной 
    unsigned char a;    // если а используется только в этом обработчике, не зачем делать эту переменную (тем более с таким именем)
    static unsigned char b;    // если b используется только в этом обработчике, не зачем делать эту переменную (тем более с таким именем) глобальной

    if ((PORTD & ((1 << PD6) | (1 << PD7))) ==  0) {
        /* двигатель не крутится -> ничего не делаем */
        takt = 0;
        return;
    }

    /* двигатель крутится -> ждем */
    if (++takt == 25) { /* на 25 тике запоминаем положение енкодера */
        b=TCNT0;
        return;
    }
    if (takt >= 30) {
        /* насколько я понимаю, здесь надо отключить мотор, если приращение енкодера менее 20 */

        a = TCNT0;
        if ((unsigned char)(a - b) < 20) {
            PORTD &= ~((1 << PD6) | (1 << PD7)); // Вы же хотите сбросить два старших бита
            takt = 0; /* отключили мотор, сбросили счетчик тактов */
            return;
        }
        /* Тут надо что-то сдедать, если енкодер продолжает выдавать 20 и более импульсов */
        /* например, перезапускаем ожидание "прекращения импульсов" енкодера */
        b = a;
        takt = 25;
    }
}


Последний раз редактировалось viiv Пт мар 30, 2018 13:33:25, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простое управление коллекторным двигателем с помощью МК
СообщениеДобавлено: Пт мар 30, 2018 20:17:29 
Встал на лапы

Зарегистрирован: Чт дек 07, 2017 13:48:44
Сообщений: 142
Рейтинг сообщения: 0
Ivanoff-iv, viiv Спасибо, парни! Буду разбираться.

Добавлено after 1 hour 9 minutes 16 seconds:
viv, по вашему коду значения переменным стали присваиваться в 16-тиричной системе счисления, а на этапе сравнения - переменной "а" присваивается значение "("
(см. вложенный скрин) и двигатель, по прошествии 30 тактов - останавливается...
Я ШО то не понимаю видно...

Добавлено after 5 hours 56 minutes 56 seconds:
Ivanoff-iv, viiv Короче, так и не смог разобраться... Можете подсказать, что за значения в переменных?


Вложения:
Значение переменных.gif [37.75 KiB]
Скачиваний: 334
Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Простое управление коллекторным двигателем с помощью МК
СообщениеДобавлено: Пт мар 30, 2018 22:50:51 
Грызет канифоль

Карма: 9
Рейтинг сообщений: 80
Зарегистрирован: Чт ноя 06, 2014 13:09:06
Сообщений: 251
Рейтинг сообщения: 0
Можете подсказать, что за значения в переменных?

нет у мкня пртеуса и никогда не было. попробуй правую кнопку мыши для изменения формата отображения.


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Простое управление коллекторным двигателем с помощью МК
СообщениеДобавлено: Сб мар 31, 2018 02:02:17 
Встал на лапы

Зарегистрирован: Чт дек 07, 2017 13:48:44
Сообщений: 142
Рейтинг сообщения: 0
Можете подсказать, что за значения в переменных?

нет у мкня пртеуса и никогда не было. попробуй правую кнопку мыши для изменения формата отображения.

Блин, ну это ж так просто - дать рабочий код... Мы В РАЗНЫХ ИЗМЕРЕНИЯХ! Вы считаете математически, с учетом синтаксиса языка Си и особенностей микроконтроллеров. Получаете математически выверенный вариант и заключаете: вот это будет работать... Но я - лузер: пользую прогу протеус и не совсем разбераюсь в Си...
Так вот я, лузер, подставляю Ваш код в протеус и вижу фигу! Пытаюсь разобраться в логике - разбираюсь, но понять почему проблема - не хватает знания языка и синтаксиса...
ВОТ И ПРОШУ ВАС, ЕСЛИ НЕ СЛОЖНО, ДАЙТЕ ВЫВЕРЕННЫЙ ВАРИАНТ, ОТНОСИТЕЛЬНО МОЕЙ ЗАДАЧИ, ВАРИАНТ БЕЗ ПРИМЕРОВ!
Ну давайте попробуем не в Протеусе просимулировать. В Какой программе вам удобнее?


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Простое управление коллекторным двигателем с помощью МК
СообщениеДобавлено: Сб мар 31, 2018 06:02:37 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6619
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
мой прпмер чем не угодил? я его собрал, проверил - работает: ждет некоторое время и начинает замерять частоту, до тех пор, пока та не опустится ниже определённого значения (счетчик сбрасываю не в 0 чтобы следующее измерение начиналось сразу после предыдущего, а не мучило возможно заклинивший мотор ещё 2секунды)
если протеус у тебя мой проект не принимает - я выложил схему, собрать её заново несложно,
если чтото не так с КВАВР проектом - для проверки есть прошивка, а С файл можно даже блокнотом открыть и вкопировкть код себе.

Добавлено after 4 minutes 55 seconds:
это уже не пример а код, который ты можешь скопировать себе в проект с минимальными правками (таймеры настроены как у тебя, переменные с теми же именами)
кстати на счет переменных, мне кажется ты не уделил им должного внимания при объявлении (прикинь их область видимости и сохранность) может ещё в этом дело?

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Простое управление коллекторным двигателем с помощью МК
СообщениеДобавлено: Ср апр 04, 2018 17:08:07 
Встал на лапы

Зарегистрирован: Чт дек 07, 2017 13:48:44
Сообщений: 142
Рейтинг сообщения: 0
Только появилось пару часов, что бы разобраться.
Суть я понял. Проблема была (правда не вся) в представлении целочисленных типов.
Результат выражения (a-b)<20 в определенный период времени давал результат с отрицательным значением ну и мотор соответственно самопроизвольно останавливался. unsigned char - это значения от 0 до 255. Применяя его к выражению - мы отсекаем все значения с отрицательным знаком и тем самым убираем самопроизвольные остановки мотора.
Рабочий код:
ISR (TIMER2_OVF_vect){
if ((PORTD & ((1 << PD6) | (1 << PD7))) == 0) {takt = 0;return;}else { takt++;}
if (takt == 25) { b=TCNT0;return;}
if (takt == 45) {a = TCNT0; takt = 0;
if ((unsigned char)(a - b) < 20) {PORTD &= ~((1 << PD6) | (1 << PD7)); return;}}}

Просто мне нужно было это доступней объяснить.
Но тут тоже не все так как я планировал, ибо эта схема работает при определенных промежутках между измерением и сравнением, а также зависит от количества оборотов мотора. Я же мечтал о решении на подобии процентного соотношения, не зависящего от ТХ мотора окромя энкодера.
Так же, если мотор работает к примеру в режиме "вперед", нажатие на кнопку "назад" - приводит к его остановке (он не успевает остановится и набрать больше тех самых 20-ти импульсов), а нужно, что бы он начинал крутится в обратную сторону. Нужно будет еще дописать, но это уже ерунда.
Спасибо вам обоим за помощь!
Думаю пока я эту железяку соберу - вопросов еще будет уйма...

Добавлено after 7 minutes 37 seconds:
Так же, если мотор работает к примеру в режиме "вперед", нажатие на кнопку "назад" - приводит к его остановке (он не успевает остановится и набрать больше тех самых 20-ти импульсов), а нужно, что бы он начинал крутится в обратную сторону.

Забыл убрать возврат значения функции (зачем это нужно так и не понял из примера viiv) и проблема с остановкой мотора при нажатии при реверсе направления ушла! Почему так? Как return на это влияет?
Рабочий код:
ISR (TIMER2_OVF_vect){
if ((PORTD & ((1 << PD6) | (1 << PD7))) == 0) {takt = 0;}else { takt++;}
if (takt == 25) { b=TCNT0;}
if (takt == 45) {a = TCNT0; takt = 0;
if ((unsigned char)(a - b) < 21) {PORTD &= ~((1 << PD6) | (1 << PD7));}}}


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 47 ]    , , 3

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Валерьян и гости: 36


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y