Привет всем у меня такая проблема собрал таракана только четырёхлапого и надо теперь код написать.Мне дали код я зашил в мк и он только трясётся и всё.В 13 задаче я ничего не понял одна реклама.Мне надо только чтоб сервы туда сюда бегали и всё а как сделать не знаю.Вот исходник который мне дали. #include <mega16.h>
// My bits definitions http://avr123.nm.ru/m8_128.h #include <m8_128.h> // в этом файле я сделал определения битов для МК
#include <delay.h> // библиотека пауз CVAVR
// Alphanumeric LCD Module functions // строки нужны для работы LCD 2 строки по 16 символов // схема подключения в http://avr123.nm.ru/z5.htm #asm .equ __lcd_port=0x1B ;PORTA #endasm
#include <lcd.h> // библиотека для LCD
// ++++++ переменные добавленые в задаче 13
// индекс состояний PORTC для работы в прерывании char index_st = 0;
// массив констант содержащий 2 состояний PORTC : flash char pc_state[3]={ 0b00000001, // "1" на servo на PC0 0b00000010, // "1" на servo на PC1
0b00000000 };// "0" на всех servo
// сколько осталось мкС досчитать до 20 мС unsigned int ctr_last = 20000;
char servo_poz[2]={255,-255}; // массив для хранения положения servo
char servo_num = 0; // переменная хранит номер servo
// Timer 1 output compare A interrupt service routine interrupt [TIM1_COMPA] void timer1_compa_isr(void) { // Place your code here
TCNT1H=0x00; // обнулить счет таймера TCNT1L=0x00;
// PORTC ^= 255; // инвертировать регистр PORTC
// Вывести в PORTC новое состояние PORTC = pc_state[index_st];
if (index_st == 2){
OCR1A = ctr_last; // прерываться после отсчёта остатка времени
ctr_last = 20000; // обновить остаток времени на 20 мС
index_st = 0; // обнулить индекс } else {
// Вычислить длину имп. для сервы и вписать в OCR1A OCR1A=992+(((unsigned int)servo_poz[index_st])<<2); /* тут servo_poz[index_st] умножается на 4 сдвигом на 2 в лево и затем плюсуется к 992. пример - среднее положение сервы команда 127, умножим на 4 будет 508, прибавим 992 - получим 1500 мкС - это и есть длина импульса для среднего положения вала srvo. */
// Вычесть длину имп. сервы из периода в 20 мС ctr_last -= OCR1A ; // увеличить индекс на 1 index_st ++ ; };
} //++++++++++++++++++++++++++++++++++++++++++++++++ // Standard Input/Output functions #include <stdio.h>
// Константы ! строки в памяти программ flash char string_1[]="Prog Start"; flash char string_2[]="The END"; // Declare your global variables here // глобальные переменные для примера // вывода температуры на ЖКИ //++++++++++++++++++++++++++++++++++++++++++++++++
// Главная функция
void main(void) { // Declare your local variables here
DDRD=0x30; //PORTD4 & PORTD5 сконфигурированы на выход
servo1_position(1500); //на PD5 появится ШИМ с частотой 50 гц и длит. импульса 1500 мксек, серва встанет по центру servo2_position(1300); //на PD4 аналогично, но длительность импульса уже 1300 мксек while(1); }
Как сделать чтобы серва туда сюда ходила наверно разберетесь? Обратите внимание на то, от чего микроконтроллер тактируется и с какой частотой:
Цитата:
Code Vision AVR C Compiler MCU atmega16 CLOCK 8 MHz RC INT
PS: Пользуйтесь тегом code. PPS: Не заметил что вы уже разобрались
Заголовок сообщения: Re: Помогите доделать код для сервы.
Добавлено: 20 мар 2011, 13:06
Зарегистрирован: 20 мар 2011, 11:49 Сообщения: 3 Откуда: Красноярск
Не стал создавать новую тему, надеюсь не против, что задам вопрос(ы) в этой. Решил сделать изначально радио управляемого "жука/паука" на подобии проекта HEXAPOD Anubis. В программированиии МК нуб-самоучка, написал код как смог. МК ATtiny 2313, сервоприводы MG995 - 3шт. Пишу в CVAVR
Тактирование МК от внешнего кварца 8МГц. Питание МК 78L05, питание серв отдельно L7805CV. Так вот, если закоментировать основной код в теле while (1), то все отлично, стоит не дергается. Ни каких сбоев ни чего. Осцилограмма ровная, все времЕные интервалы выдержаны А если начинать выполнять этот код, то происходит что то не понятное. Импульсы все сбиваются, крайние и нейтральное положение уходят. При условии что меняем импульс только одной сервы, другие то же начинают немного дергаться, то вверх, то вниз. Через некоторое время(примерно 1мин), все останавливается и ни происходит ни каких действий, а потом через 5-10сек опять начинает шевелиться. Сначало грешил на питание. Подключил осцил к ноге Res, все нормально, сбоев не происходит. Подключил к питанию, в спокойном состоянии есть небольшие пульсации, скорей всего из за стабилизатора, но эти пульсации ни как не увеличиваются при шевелении ногой. Куда дальше капать уже не представляю, стал отчаиваться в своем начинании. Помогите, направте в нужную сторону.
У вас чуть не вся логика написана в прерывании, которая формирует серво импульсы. Это не правильно. К сожалению МК не такой быстрый, чтоб все успевать. Логику надо вынести в майн, а в прерывании ТОЛЬКО формирование импульсов, без всяких лишних вычислений. Поэтому у вас в простом случае впритык все нормально, а как более сложный случай, импульсы начинают плыть, т.к. у МК не хватает времени на обработку.
в прерывании должно быть постоянное формирование импульсов на сервы. Понятие лапа, локоть и плечо - этого вообще не должно быть там.
в простейшем случае например для 3х серв делаем глобальный массив servo_delay[3] где храним в микросекундах длительность импульса в прерывании стартуем 3 импульса и гасим их по таймеру в соответствии с этим массивом. все. Больше никаких локтей, плечей, операторов IF и т.д. там быть не должно. И так то быстродействия хватит не на много.
а вот расчет длительности импульса в зависимости от нужного положения сервы размещаете в отдельной функции, а всю логику с локтями и коленями пихаете в майн.
И еще. Если хотите т.о. управлять не 3-мя сервами, а например 18-ю, то вскоре вам придется делать по другому, т.к. быстродействия МК не хватит. На форуме уже обсуждались различные алгоритмы серво-контроллера на большое кол-во серв. Мне лично нравится вариант с массивами, хранящими по 256 выборок одного порта. Минус этого решения большой расход памяти. 256 байт на каждые 8 серв.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения