roboforum.ru

Технический форум по робототехнике.

Помогите разобраться с программной частью для сервопривода

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: Помогите разобраться с программной частью для сервопривода

Сообщение Master » 18 апр 2008, 14:54

жаль что сервы КОЛОМ стоят ... Вот так ИМХО поприкольней будет ...

Согласен.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Помогите разобраться с программной частью для сервопривода

Сообщение space » 18 апр 2008, 22:37

Более мение переделал под WinAVR. Не знаю на сколько правильно, но по крайней мере компилируется. Единственное что не могу разобраться как заставить работать задержки. Вот прога:
Код: Выделить всёРазвернуть
#include <avr/io.h>
#define OUT PORTC 
#define servo PC1
#define delay_us
#define delay_ms

char servo_pulse = 150;   // импульс среднее положение SERVO - (150 * 10) мкС
char servo_cw = 1;   
// "1" servo крутится по часовой, если "0" то импульс убавляется - крутится против часовой
char t;    // переменная - счетчик

int main(void){

     DDRA = 0;   
   PORTA = 0;
   
   DDRB = 0;   
   PORTB = 0;
   
   DDRC = 255;   // 8 LEDs
   PORTC = 0;
   
   DDRD = 0;   
   PORTD = 0; 

UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;

while(1){
           
// изменение направления движения SERVO

if (servo_pulse > 210) { // если импульс 2100 мкС
    servo_cw = 0;        // убавлять длину импульса
                       }
                       
if (servo_pulse < 90) { // если импульс 900 мкС
    servo_cw = 1;       // прибавлять длину импульса
                       }                     

// изменение ширины импульса

if (servo_cw == 0) { // если нужно убавить
    servo_pulse --;  // убавить длину импульса на 10 мкС
                   }

if (servo_cw == 1) { // если нужно прибавить
    servo_pulse ++;  // увеличить длину импульса на 10 мкС
                   }

// вывод импульса на серву

t = servo_pulse; 

char(t); // вывести длину импульса на серво в десятках микросекунд

PORTC |= _BV(PC1);  // подать на серву лог. "1"

while (1) { // отсчет паузы
  while (t--);
   delay_us(10); // пауза 10 мкС
             }
PORTC &= ~_BV(PC1);  // подать на серву лог. "0"

//delay_ms(17); // пауза между импульсами на серву 17 милиСек
delay_ms(1); // пауза ДЛЯ УСКОРЕНИЯ симуляции 1 мС
}
}


И вот что пишет при компиляции:
Код: Выделить всёРазвернуть
servo.c:64: warning: statement with no effect
servo.c:69: warning: statement with no effect


Добавлено спустя 2 минуты 28 секунд:
Это относится к этим строчкам:
Код: Выделить всёРазвернуть
delay_us(10);
delay_ms(1);
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света
Аватара пользователя
space
 
Сообщения: 565
Зарегистрирован: 17 июн 2007, 23:44
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич

Re: Помогите разобраться с программной частью для сервопривода

Сообщение avr123.nm.ru » 18 апр 2008, 23:35

space писал(а):И вот что пишет при компиляции:


Дак этож бессмыслица !

Код: Выделить всёРазвернуть
#define delay_us
#define delay_ms


Смотри "Си для МК" - http://avr123.nm.ru/05.htm про #define

Тут

Код: Выделить всёРазвернуть
while (1) { // отсчет паузы
  while (t--);
   delay_us(10); // пауза 10 мкС
             }


бесконечно засядет ! из-за while (1)
и непонятно: while (t--);

У меня то в примере ТАК было:
Код: Выделить всёРазвернуть
while (t) { // отсчет паузы
    t --;
   delay_us(10); // пауза 10 мкС
              }


=============

вместо delay_us(10); можно просто лабуду написать которая будет 10 мкСек времени занимать

Так например сделать:

Код: Выделить всёРазвернуть
ctr = 100;

while (ctr) {
    ctr --;
                }


И замерить в VMLAB сколько это будет выполняться а потом скорректировать число 100.

Если оптимищатор будет выкидывать эти циклы то переменный объявить как volatile
Смотри "Си для МК" - http://avr123.nm.ru/05a.htm

Либо посмотреть в FAQ курса как в WinAVR использовать delay_us правильно.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Пред.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 20