Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro
Скачать 6.79 Mb.
|
Рис. Схема, позволяющая измерять сопротивление фоторезисторов 4.72. Схема размещения элементов на макетной плате с методами подключения внешней микросхемы АЦП к микроконтроллеру, устрой- ство получилось несколько сложным, и реализовать его не так-то легко. Поэтому вернемся к нашему проекту. Исходный текст программы можно най- ти в файле // 24 апреля 2002 - фоторезистора, сопротивление которых // измеряется с помощью 274 Устройства управления роботами // Для индикации используется жидкокристаллический дисплей, // подключенный к микроконтроллеру через двухпроводной интерфейс // на основе сдвигового регистра 74LS174. // // Используются прерывания от таймера каждую миллисекунду. // // Замечания по аппаратным средствам: // Микроконтроллер PIC16F627 работает на частоте 4 МГц. // Используется внешний тактовый генератор. // // Подключение выводов // RB1 - линия Clock интерфейса жидкокристаллического дисплея; // RB2 - линия Data интерфейса жидкокристаллического дисплея; // - левый фоторезистор; // RB5 - правый фоторезистор. // Глобальные переменные и константы: RTC = 0; // Счетчик реального volatile = 20; // Длительность volatile char LCDState = 1; // Номер текущего состояния. static volatile bit Clock static volatile bit ClockTRIS static volatile bit Data static volatile bit DataTRIS char * MessageOut; // Указатель volatile char = 0; char = // 1 2 char = volatile char ADCState = 0; volatile char ADCDlay = 1; volatile char LeftADC = 0; volatile char RightADC = 0; на выводимое сообщение. // Смещение текущего символа в строке. // Перемещение курсора // в первую строку. 34567890123456789 // Перемещение курсора // во вторую строку. // Текущее состояние конечного автомата // для работы с фоторезисторами. // Задержка 1 мс между операциями // с фоторезисторами. // Сопротивление // Сопротивление правого фоторезистора. // Слово конфигурации: defined(_16F627) PIC16F627 CONFIG(Ox03F61); «else Unsupported with external XT oscillator selected // Для МК PIC16F627: // внешний тактовый генератор XT, // RA6/RA7 используются для ввода-вывода, // внешний сброса, // таймер включен, // сторожевой таймер выключен, // защита кода отключена, // детектор BODEN включен. selected // Служебные LCDNybble(char Nybble, char RS) // Запись полубайта в Подключение к микроконтроллеру периферийных устройств 275 Byte, char RS) // Запись байта в // Инициализация ЖКИ. LCDOut(char * const LCDString) // Вывод строки на ЖКИ. while (LCDState); = LCDString; LCDState = 100; // Ждать готовности ЖКИ. // Загрузка выводимой строки. // Послать строку на ЖКИ. // Обработчик прерываний: void interrupt char temp; . if { 0; RTC++; // Обработчик прерываний от таймера TMRO. // Сбросить флаг прерываний от таймера TMRO. // Инкремент счетчика реального времени. // Здесь можно разместить код // для обработки прерываний от таймера TMRO. // Конечный автомат для ЖКИ: // Конечный автомат для работы с { // Если нет работы с ЖКИ. switch (ADCState) { case 0: // Начальная if 0) ADCState++; break; case // Начинаем подачу импульса // на обе (1 мс). TRISB4 0; TRISB5 = 0; RB4 = 1; RB5 = 1; • // Переход к следующему // шагу через 1 мс. break; case 2: TRISB4 = 1; // Закончить подачу // импульса на левую RC-цепочку. = PORTB; // Разрешить прерывания // по изменении сигнала на входе. RBIF = 0; RBIE = 1; 276 Устройства управления роботами ADCState++; break; case 3: LeftADC = OxOFF; temp = PORTB; = 0; // Запретить прерывания = 0; // по изменении входного // сигнала. break; case 4: TRISB5 // Закончить подачу // импульса на правую temp = PORTB; RBIF = 0; // Разрешить прерывания по R8IE = 1; // изменении входного сигнала. ADCState++; break; case 5: RightADC = OxOFF; temp = PORTB; RBIF = 0; // Запретить прерывания RBIE = 0; // по изменении входного // сигнала. ADCDlay = 10; ADCState = 0; break; } // Конец оператора switch. } // Конец оператора if. } // Конец обработчика прерываний от таймера. //• Здесь можно разместить другие обработчики прерываний. if (RBIF) { // Обработка прерываний по изменении входного сигнала. { case 3: // Работаем с левым фоторезистором. LeftADC = // Счетчик времени. ADCState++; break; case 5: // Работаем с правым фоторезистором. RightADC = TMRO; // Счетчик времени. ADCDlay = 10; ADCState = 0; break; } // temp = PORTB; RBIF = // Очищаем флаг и запрещаем прерывания RBIE = 0; // по изменении входного сигнала. } // Конец обработки прерываний по изменении входного сигнала. // Конец обработчика прерываний. // Главная программа: ' , void Подключение к микроконтроллеру периферийных устройств 277 unsigned int i, j; unsigned int OPTION = // работает с таймером // коэффициент деления равен 4. THRO = 0; // Начальный оброс таймера TMRO. TOIE = 1; // Разрешение прерываний от таймера TMRO. GIE = 1; // Разрешение обработки прерываний. // Инициализация порта, к которому подключен // Здесь можно проинициализировать другие периферийные while (1 == 1) { // Бесконечный цикл. // Здесь можно разместить код верхнего уровня. while (ADCState != 2); // Ожидаем начала работы // с while (ADCState); // Ожидаем окончания работы // с фоторезисторами. tempLeft = LeftADC; = // Сохраняем измеренные значения // сопротивлений фоторезисторов. j = (tempLeft / 8) + 1; // Количество звездочек // для индикации состояния левого for (i = 2; i < 18; i++ ) if - 2) <= j) // Выводим звездочку на дисплей. MessageL[i] = else // Выводим пробел. = j = (tempRight / 8) + 1; // Количество звездочек // для индикации состояния правого for (i = 2; i < 18; i++ ) if - 2) <= j) // Выводим звездочку на дисплей. HessageR[i] = '*'; else // Выводим пробел. = ' '; // Состояние левого датчика выводится // в первой строке дисплея. LCDOut(MessageR); // Состояние правого датчика выводится // во второй строке дисплея. } // Конец цикла while. } // Конец главной программы. Для определения времени заряда конденсатора здесь используются прерыва- ния, формируемые при изменении уровня сигнала на входных линиях порта PORTB. Многие эксперты не рекомендуют использовать эту возможность микроконтролле- ров PICmicro, но я придерживаюсь противоположного мнения. Многочисленные эксперименты с работающими устройствами показывают, что прерывания по 278 Устройства управления роботами изменении входного сигнала от внешнего источника достаточно надежны и их ис- пользование не вызывает особых трудностей. Единственное, что при этом требует- ся учитывать, - некоторые особенности программирования: • прерывания по изменению уровня сигнала на линиях порта PORTB формиру- ются, только если эти линии работают в режиме входных; • во время использования любой линии PORTB в качестве источника прерыва- ний нельзя обращаться ни к одному разряду регистра этого порта (обраще- ние к любому биту требует использования команды, работающей со всеми во- семью разрядами регистра). При необходимости всегда можно использовать служебную переменную для хранения текущего значения данного регистра; • для флага прерывания надо использовать следующий код: Variable = PORTB; // Запомнили текущее состояние регистра порта // в служебной переменной. RBIF // Очистили флаг прерывания. RBIE = 0; // Запретили (если необходимо) прерывания // по изменении входного сигнала. • следует убедиться, что изменение уровня входного сигнала не произойдет раньше, чем программа окажется готова обработать запрос на прерывание. Только из-за того, чтобы удовлетворить этому требованию, мне пришлось ввести в схему два ограничительных резистора R5 и R6, благодаря которым удалось снизить скорость перезаряда конденсаторов. После включения питания микроконтроллера программа начинает цикл рабо- ты с фоторезисторами. На обе RC-цепочки подается прямоугольный импульс, затем засекается время и разрешаются прерывания по изменению уровня сигнала на входах RB4 и RB5. В момент возникновения прерывания определяется время перезаряда конденсатора и вычисляется значение сопротивления фоторезистора. Конечный автомат, реализующий интерфейс с фоторезисторами, начинает свою работу, только если не активен конечный автомат, обслуживающий жидко- кристаллический дисплей. Это сделано для того, чтобы одновременное выполне- ние обоих автоматов не привело к нарушению временных промежутков между отдельными операциями. Для тех же целей в главной программе перед началом вывода на дисплей ожидается завершение работы с фоторезисторами. Хотя в нашей новой схеме микроконтроллер получает намного больше инфор- мации об уровне освещенности обоих фоторезисторов, на выполнение всех необ- ходимых для этого операций требуется много времени, и робот может не успеть среагировать на то или иное изменение окружающей обстановки, особенно если скорость его движения достаточно велика. В нашей программе один цикл опроса состояния двух фоторезисторов занима- ет 6 мс, что позволяет делать около 330 измерений в секунду. Но большинство современных АЦП работает намного быстрее. Подключение к периферийных устройств 279 4.30. ЗВУКОВЫЕ ДАТЧИКИ Использование звукового датчика в электронной схеме не должно представлять особой сложности. У многих роботов часто имеется какое-либо устройство ввода звуковой информации, которое предоставляет пользователю возможность управ- лять ими, хлопая в ладоши или громко произнося команды. В некоторых автома- тических устройствах звуковые сенсоры работают в качестве датчиков столкно- вений (прислушайтесь к звукам, которые раздаются, когда робот сталкивается с предметами). Подключить к микроконтроллеру микрофон, который бы рас- познавать громкие звуки, не так уж сложно, и мы не упустим эту возможность в наших экспериментах. Многим сложнее всего понять, что аналоговые сигналы (в том числе и звуко- вые) могут быть представлены в виде суммы множества колебаний разной часто- ты. Обычно для такого разложения используются синусоидальный и косинусои- сигналы (рис. 4.73). Синус Амплитуда колебаний Косинус О 90 180 360 О я Градусы Радианы Рис. 4.73. и колебание В виде суммы нескольких таких колебаний (их называют гармониками), име- ющих разную частоту и амплитуду, можно представить любой аналоговый нал. Напомним, что синусоидальное колебание описывается формулой вида x(t) = A / Т) = A где А - амплитуда, Т - период, f = - частота колебаний, t - время. Именно по этому закону изменяется координата точки, лежащей на ободе колеса радиусом А при его вращении. Когда колесо совершит полный оборот (360°), все будет повто- ряться с самого начала. Говорят, что начался новый период колебания. волна сдвинута относительно синусоидальной по фазе на 90° есть на x(t) = A = A - 280 Устройства управления роботами В электронике фазовый угол колебаний = обычно измеряется в радиа- нах. Напомним, что для перевода в радианы величины 9, выраженной в градусах, можно воспользоваться формулой j = / 180, где число 3,14159265359. Например, 45° - это = 0,7854 рад, а полный обо- рот (360°) - это = 6,2832 рад. Тактовые импульсы, которые используются в микропроцессорной технике, обычно имеют прямоугольную форму. Последовательность прямоугольных им- пульсов называют меандром. Сигнал такого вида не слишком подходит для того, чтобы его представляли в виде суммы синусоид и косинусоид. На рис. 4.74 пока- зано, что получится, если сложить три первые в разложении прямо- угольного сигнала, ширина импульса которого равна половине периода. Как мож- но видеть, суммарное колебание не слишком-то совпадает с прямоугольными импульсами. Для более точного представления следует учесть большее количе- ство гармоник. Прямоугольные импульсы (меандр) 1-я гармоника \ \ г Сумма гармоник Рис. 4.74. Гармонический анализ прямоугольных Таким образом, складывая несколько синусоидальных и колебаний, можно с достаточной точностью воспроизвести любое аналоговое ко- лебание. При этом частоты суммируемых гармоник всегда кратны частоте самого сигнала. Частота первой гармоники совпадает с частотой сигнала, частота второй Если сигнал нечетный, то есть его график антисимметричен относительно оси ординат (в данном примере этого можно добиться, расположив начало отсчета в начале какого-нибудь импульса), то все гармоники будут иметь нулевую амплитуду. Поэтому на рис. 4.74 ются только синусоидальные гармоники: нулевая (постоянная составляющая, на рисунке не на), первая, основная, гармоника (ее частота совпадает с частотой самого сигнала), вторая (также не показана на рисунке, так как в данном случае ее амплитуда равна 0) и третья гармоника, имеющая частоту, в три раза превышающую частоту сигнала. Следует отметить, что колебания, изображенные на рис. 4.73 и которые буквально воспроизводятся здесь с английского оригинала, только отда- ленно напоминают по форме синусоидальные. - Прим. перев. Подключение к микроконтроллеру периферийных устройств 281 гармоники в два раза больше частоты сигнала и т.д. Чтобы найти амплитуды гар- моник, используют формулы — x(t) dt; =— Т где а. - амплитуда косинусоид, а - амплитуда синусоид в разложении сигнала; интегрирование ведется по любому отрезку, длина которого равна периоду сигна- ла. В этом случае само колебание может быть записано в виде ряда Фурье: I Например, рассмотренная выше последовательность прямоугольных импуль- сов, длительность каждого из которых равна половине периода, будет представ- лена в виде ряда 1 При синтезе сигнала мы должны рано или поздно оборвать бесконечный ряд. Чем позже мы это сделаем, тем больше гармоник учтем, и тем точнее будет полу- ченная сумма представлять искомое колебание. Но реальна и обратная ситуация: исходный прямоугольный сигнал можно про- пустить через специальный чтобы отсечь одни гармоники и учесть другие. Фильтр, который пропускает только несколько первых гармоник, называется нижних частот (ФНЧ). Его амплитудно-частотная характеристика (АЧХ) представлена на рис. 4.75. Она показывает, во сколько раз ослабляется сигнал определенной частоты. В электронике коэффициент усиления или ослабления часто измеряют в де- цибелах. Если речь идет о напряжении или токе сигнала, то ослабление в два раза соответствует 6 дБ. Полосу частот, которые пропускает фильтр, оценивают по уровню 3 дБ, что соответствует ослаблению в раз. Другими словами, гра- ница полосы пропускания ФНЧ (так называемая частота среза) - это частота, на которой коэффициент пропускания фильтра падает до 1/1,414 0,707 своей макси- мальной величины. Часто для фильтрации сигналов используют так называемые активные тры, выполненные на основе операционных усилителей. Один такой пример - - показан на рис. 4.76. Здесь использованы два резистора с одинаковым сопротивлением R и два кон- денсатора с одинаковой емкостью С. Другие два резистора R1 и R2 задают коэф- фициент усиления схемы. Для дополнительного усиления я часто использую вто- рой каскад на операционном усилителе. 282 Устройства управления роботами Амплитуда (А) Уровень входного сигнала Зависимость уровня выходного . сигнала от частоты Частота Частота среза Рис. 4.75. характеристика фильтра нижних частот Входной сигнал Выходной сигнал Частота среза f = 1/(2RC) Коэффициент усиления = R2 / R1 4.76. Фильтр Если коэффициент усиления достаточно велик, то сигнал на входе фильтра превращается в хороший меандр на выходе. Возможно, вы пришли в недоумение: мы начали с того, что раскладывали прямоугольные импульсы на гармоники, за- тем пропускали их через фильтр, чтобы отсечь высокочастотные составляющие, а закончили тем, что снова получили прямоугольные импульсы! Но в этом есть смысл. Ведь наша задача состоит не в том, чтобы получить меандр из него самого, а в том, чтобы преобразовать произвольное звуковое колебание в низкочастотную синусоиду. При этом, если на вход фильтра вместе со звуковой командой подает- ся какое-либо более высокочастотное колебание (например, шум двигателей), то фильтр его ослабит, насколько возможно. Существует большое количество разнообразных фильтров. Кроме ФНЧ, ис- пользуются также верхних частот (ФВЧ), полосовые и фильтры. ФВЧ ослабляют сигналы низкой частоты, а пропускают только старшие гармоники (то есть по сравнению с ФНЧ ведут себя противоположным образом). Подключение к микроконтроллеру периферийных устройств 283 Полосовые фильтры пропускают колебания только в определенном диапазоне ча- стот, а фильтры, наоборот, пропускают все частоты, кроме тех, что лежат в некотором диапазоне. Для фильтрации помех в робототехнике обычно ис- пользуются полосовые фильтры и ФНЧ. Итак, чтобы робот имел возможность реагировать на звуковые команды или мог обнаруживать по звуку момент столкновения с окружающими предметами, разработчик должен определить, в каком частотном диапазоне лежит звуковое колебание, на которое должен реагировать робот. Этот диапазон частот необходи- мо выделить с помощью соответствующего фильтра, чтобы отсеять все остальные звуки. Проще сказать это, чем сделать, поэтому многие радиолюбители избегают ис- пользования звуковых датчиков в своих конструкциях. Часто бывает трудно най- ти звуковой диапазон, который отличает команду (или звук при столкновении) от посторонних шумов, которые действуют внутри и снаружи автоматического устройства. Однако я считаю, что в большинстве практических случаев фильтр Баттервор- та позволяет получить хорошие результаты. Чтобы робот как можно меньше реагировал на собственные звуки, надо поста- раться изолировать датчики от его корпуса. Неплохим решением будет и исполь- зование картонного или пластикового конуса, который повысит направленность микрофона. Современные операционные усилители слабочувствительны к электрическим помехам. Но работа с аналоговыми сигналами всегда требует осторожности. Вы- ход активного фильтра лучше подключать не к стандартному порту ввода-вывода микроконтроллера, а к входу какого-нибудь счетчика (например, к счетчику тай- мера В этом случае проще организовать защиту от дребезга и других па- разитных колебаний. |