Программа простого движения – для новичков в радиоделе

May 5, 2014 by admin Комментировать »

Функций управления мотором в программе MicroC, конечно, нет Нет, поскольку нет микроконтроллеров со встроенным модулем управления мотором Но в руководстве есть текст файла заголовка, который можно скопировать и, как это рекомендуется, разместить в директории Include установленной программы MicroC

Первая неприятность – нет такой директории Её можно, наверное, создать, но проще сохранить этот файл (motorh) в папке проекта

Вторая неприятность – при попытке оттранслировать текст программы компилятор остаётся недоволен файлом motorh

Рис 40 4 Первая трансляция программы проверки движения

Заглянув  в  библиотеку  MicroC,  приходится  согласиться  –  нет  такой  библиотечной  функции

Pwm1_Change_Duty(speed)

Рис 405 Библиотечные функции модуля PWM

Поменяв функцию на Pwm1_Set_Duty(speed), можно транслировать программу:

#include “motorh” void main()

{

Sound_Init(&ampPORTC, 0) // Инициализировать звуковой порт while(1)

{

Forward(255) // Команда ВПЕРЕД Delay_ms(2000)

Sound_play(100,500) // звуковой сигнал 1 кГц на выводе RC0 S_Left(255) // Команда ПОВОРОТ ВЛЕВО

Delay_ms(800)

Sound_play(100,500) // звуковой сигнал 1 кГц на выводе RC0 Forward(255) // Команда ВПЕРЕД

Delay_ms(2000)

Sound_play(100,500) // звуковой сигнал 1 кГц на выводе RC0 S_Right(255) // Команда ПОВОРОТ ВПРАВО

Delay_ms(800)

Sound_play(100,500) // звуковой сигнал 1 кГц на выводе RC0 Forward(255) // Команда ВПЕРЕД

Delay_ms(2000)

Sound_play(100,500) // звуковой сигнал 1 кГц на выводе RC0 Backward(255) // Команда НАЗАД

Delay_ms(1000)

Sound_play(100,500) // звуковой сигнал 1 кГц на выводе RC0 Motor_Stop // Остановить оба двигателя

}

}

Файл motorh выглядит теперь так:

char motor_duty_= 127 // Ширина импульса ШИМ по умолчанию 50% char motor_init_=0 // Начальное состояние

// *** Motor A *****

// PD0 ====> 1A

// PD1 ====> 1B

// PC2 ====> 1E (PWM1)

// *** Motor B *****

// PB1 ====> 2A

// PB2 ====> 2B

// PC1 ====> 2E (PWM2)

//****************************************************

//********* Функция инициализации двигателя ****************

//**************************************************** void Motor_Init()

{

if (motor_init_==0) // Это первый вызов функции

{

motor_init_=1 // Состояние

ANSELHF0=0 // RB1 ==> Цифровой Ввод/Вывод ANSELHF2=0 // RB2 ==> Цифровой Ввод/Вывод TRISBF1=0 // Двигатель Б 2A

TRISBF2=0 // Двигатель Б 2B TRISDF0=0 // Двигатель А 1A TRISDF1=0 // Двигатель А 1B

Pwm1_Init(5000) // Инициализация ШИМ1 => 1E Pwm2_Init(5000) // Инициализация ШИМ2 => 2E

}

}

//****************************************************

//****************************************************

//********* Управление шириной импульса *******************

//**************************************************** void Change_Duty(char speed)

{

if (speed = motor_duty_) // Получили то же значение скорости

{

motor_duty_=speed // Сохранить текущее значение скорости Pwm1_Set_Duty(speed) // Двигатель A

Pwm2_Set_Duty(speed) // Двигатель B

}

}

//****************************************************

/********** Двигатель A команда ВПЕРЕД ********/ void Motor_A_FWD()

{

Pwm1_Start() PORTDF0 =0

PORTDF1 =1

}

/************************************/

/****** Двигатель B команда ВПЕРЕД ****/ void Motor_B_FWD()

{

Pwm2_Start()

PORTBF1 =0

PORTBF2 =1

}

/************************************/

/******** Двигатель A команда НАЗАД*****/ void Motor_A_BWD()

{

Pwm1_Start() PORTDF0 =1

PORTDF1 =0

}

/************************************/

/******** Двигатель B команда НАЗАД *****/ void Motor_B_BWD()

{

Pwm2_Start() PORTBF1 =1

PORTBF2 =0

}

/************************************/

/******* Двигатель A выключен **********/ void Motor_A_Off()

{

Pwm1_Stop() PORTDF0 =0

PORTDF1 =0

}

/************************************/

/********** Двигатель B выключен *******/ void Motor_B_Off()

{

Pwm2_Stop() PORTBF1 =0

PORTBF2 =0

}

/************************************/

/******* Команда ДВИЖЕНИЕ ВПЕРЕД ******/ void Forward(char speed)

{

Motor_Init() Change_Duty(speed) Motor_A_FWD() Motor_B_FWD()

}

/************************************/

/****** Команда ДВИЖЕНИЕ НАЗАД ********/ void Backward(char speed)

{

Motor_Init() Change_Duty(speed) Motor_A_BWD() Motor_B_BWD()

}

/************************************/

/***** Команда ПОВОРОТ НАПРАВО ** ******/ void S_Right(char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_FWD() Motor_A_BWD()

}

/************************************/

/******** Команда ПОВОРОТ НАЛЕВО ******/ void S_Left(char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_BWD() Motor_A_FWD()

}

/************************************/

/********** Команда СТОП ************/ void Motor_Stop()

{

Motor_Init() Change_Duty(0) Motor_A_Off() Motor_B_Off()

}

/************************************/

После трансляции программы её можно загрузить в микроконтроллер Остаётся проверить правильность подключения двигателей В руководстве говорится о правом и левом двигателе, но при сборке не очень ясно, где право, а где лево

Программа указывает на то, что первый поворот должен быть налево Но робот упрямо поворачивает направо И переключение разъёмов мне не очень помогает Что ж, не мытьём, так катанием Я исправляю в файле motorh те два раздела, что относятся к повороту (меняю В на А и наоборот):

/***** Команда ПОВОРОТ НАПРАВО ** ******/ void S_Right(char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_FWD() Motor_A_BWD()

}

/******** Команда ПОВОРОТ НАЛЕВО ******/ void S_Left(char speed)

{

Motor_Init() Change_Duty(speed) Motor_B_BWD() Motor_A_FWD()

}

Теперь  первый  поворот  робот  делает  налево  Попутно  в  основной  программе  я  исправляю функцию звукового сигнала: Sound_play(100,500)

Первую букву делаю заглавной (может быть, это не имеет никакого значения), а длительность сигнала увеличиваю до половины секунды Пятьдесят миллисекунд… не уверен, что звук появится

Может быть, я и зануда, но теперь робот ездит, бибикает, а с поворотами, если в дальнейшем окажется, что я неправ, то переделать файл, вернув его к первоначальному виду, не составит труда Впрочем, и руководство конструктора IE-ROBOPICA советует в данный момент проделать те же операции, что я проделал, чтобы привести команды и их выполнение в полное соответствие

Повороты робот может выполнять двумя способами: первый способ – выключить один двигатель и включить другой второй способ – включить двигатели разнонаправленно Разница в том, где будет точка, вокруг которой поворот выполняется, ось вращения В первом случае в центре гусеницы выключенного двигателя, во втором случае в центре платформы робота

Второй способ и описан в файле motorh Если вам понадобится изменить способ поворота, то ни что не мешает вам создать в программе новую функцию с новым именем, которая будет работать, используя файл motorh, но так, как вам больше нравится

Есть некоторое неудобство при программировании: для программирования нужно включить питание платы, что включает и двигатели Можно вытаскивать разъёмы двигателей при программировании, но и разъёмы вытаскивать не слишком удобно Разумно сделать некий пьедестал для робота, на который его отправлять при программировании Достаточно того, чтобы гусеницы были в воздухе и не цеплялись за подставку Можно использовать, скажем, подходящую по размерам коробочку от старой обувной губки

Чтобы ещё раз разобраться в управлении двигателями, проделаем несколько экспериментов за компьютером

В программе Flowcode я соберу простую программу: при нажатии на первую кнопку мотор будет вращаться в одну сторону, при нажатии на другую кнопку он сменит направление вращения на обратное

Рис 406 Программа управления вращением двигателя

Моделируя программу в ISIS (Proteus), можно убедиться, что двигатель вращается в выбранном направлении

Рис 407 Моделирование программы в Proteus

Но  даже  программа  ISIS  понимает,  что  так  двигатель  включать  нельзя  Пока  не  изменишь сопротивление нагрузки в свойствах двигателя, он вращаться не желает

Рис 408 Диалог свойств двигателя

Можно добавить транзисторные ключи Скажем, так:

Рис 409 Использование транзисторных ключей

При таком включении нужен двигатель, имеющий достаточно большое сопротивление обмотки (малый ток потребления), поскольку в любом случае последовательно с ним включён резистор сопротивлением 100 Ом

Эту проблему можно решить, если использовать двухтактный усилитель

Рис 4010 Использование усилителей мощности

Модель  транзисторов  и  величину  резисторов  следует  определить  из  расчётов,  зависящих  от конкретного типа двигателя Транзисторы, видимо, придётся сделать составными, используя на

входе маломощные транзисторы Но, если ток, потребляемый двигателем, остаётся в пределах допустимого выходного тока для микросхемы L293D, то лучше всё-таки использовать микросхему

В этой главе мы познакомились с тем, как устроен привод двигателей робота ROBOPICA Мы внесли исправления в текст программы, приспособив её к новой версии программы MicroC PRO Мы получили исходный текст на языке Си, который можно использовать в других средах разработки программы для микроконтроллера

Мы познакомились с микросхемой обслуживания двигателей постоянного тока, применяемых в движущихся моделях Мы разобрали возможное устройство этой микросхемы на примере транзисторных усилителей

Мы осуществили первые несложные движения робота И мы готовы продолжить эксперименты с роботом

Источник: Гололобов ВН,- Самоучитель игры на паяльнике (Об электронике для школьников и не только), – Москва 2012

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты