roboforum.ru

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

Помогите разобраться с аппаратным и программным шимом

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

Помогите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 13 авг 2010, 13:02

Два кода, представленые ниже, это то, пока что я умею. Если с программным(delau_us(...); PORTx.x^=1;) ШИМом я еще более менее разобрался, то с аппаратным не очень.

Программный ШИМ:
Код: Выделить всёРазвернуть
int i;
for(i=0;i!=10000;i++)
{
PORTC.6^=1;
if(i<3000)
   {
   PORTx.x^=1;
   delay_us(1300);
   }
if(i>3000 && i<6000)
   {
   PORTx.x^=1;
   delay_us(1500);
   }
}
while(1);




Аппаратный ШИМ:

Код: Выделить всёРазвернуть
#include <mega32.h>



void main(void)
{
PORTD=0x00;
DDRD=0x30;


TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;


TCCR1A=0xA3;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;


ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;


MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x00;


ACSR=0x80;
SFIOR=0x00;

while (1)
      {
     
      // вывести ШИМ около 25% на PD4
OCR1BH = 0x00;
OCR1BL = 0xFF; // PWM(PD4) 255/10.23 = 24.9(%)
OCR1AH = 0x00;
OCR1AL = 0x00;
      };
}


я вчера вроде как вкурил то, например это OCR1AH и OCR1AL (L-младший, H-старший), и то, что в них записывается цифра от 0 до 1023. в шестнадцетеричной системе. Вобщем я запустил шим на обоих ножках PD4/5. Все крутится. Причем оба в одну сторону. Непонятно вот что, судя по формуле: число от 0...1023/10.23= W ШИМА в %. Когда я "изменял" мощьность (W) этого шима, например, записывая цифру 500(01ff) то разницы в скорости я них не заметил. Что я не так сделал ? И как заставить серву в другую сторону крутиться ?
Последний раз редактировалось S-T-A-L-K-E-R 13 авг 2010, 13:53, всего редактировалось 1 раз.
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

Re: Помагите разобраться с аппаратным и программным шимом

Сообщение avr123.nm.ru » 13 авг 2010, 13:09

Серва управляется длиной импульсов. Подробно в задаче-упражнении 13 обучалки по AVR - http://proavr.narod.ru/z13.htm

Среднее положение servo это ШИМ около 7.5 % с частотой около 50 Гц.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Помагите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 13 авг 2010, 13:44

Т.е. если я заместо ICR1H=0x00; ICR1L=0x00; запишу так: ICR1=9216; (либо так: ICR1H=0x16;ICR1L=0x92;), то получу частоту в 50 Гц ? И потом запишу в OCR1BH = 0x4С; OCR1BL = 0x00; то серва на PORTD.4 будет находится в состоянии покоя ? (1500)
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение avr123.nm.ru » 13 авг 2010, 13:57

Я немогу в уме прикинуть 16-ричные числа :lol: но вроде меньше 1 % получается.

Если таймер до 9216 считает при 50 Гц, то надо 691 в регистр ШИМ записывать пожалуй.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 13 авг 2010, 14:06

avr123.nm.ru
Я тоже не могу ) Хотя учили... Пользуюсь калькулятором инженерным ;)
Я читал оба курса, но не один из них в полной мере не поясняет как всеже выставить все правильно чтоб работало ( Либо я еще не совсем это понимаю. Можешь в кратце объяснить как заставить серву крутитьсяв разные стороны, стоять. Дело в том что я пишу в CvAVR, а мне дали код из WinAVR, и мой компилятор не понимает что такое OCR1B...и тд. Может надо дерективу прописывать... незнаю.
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение avr123.nm.ru » 13 авг 2010, 14:16

Вы задачу 13 то смотрели ? там как раз 8 серв ATmega16 крутит в родном CVAVR :D

Таймеры лучше настраивать мастером ICC - более детально все расписано. Картинка в задаче 6.

Если у вас 9216 дает 50 Гц ( смотрите в PROTEUS или в Студии или в VMALB), то меньше 691 вал против часовой должен крутится а больше - по часовой.

Добавлено спустя 5 минут 8 секунд:
S-T-A-L-K-E-R писал(а):не поясняет как всеже выставить все правильно чтоб работало

Надо внимательно прочитать и проделать то что в задаче по ШИМ - задача 8 - http://proavr.narod.ru/z8.htm
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 13 авг 2010, 14:22

ШИМ - задача 8
-ее я вчера и курил весь день

Добавлено спустя 53 секунды:
вот прога, как ее переделать под квавр :

Код: Выделить всёРазвернуть
#include "defines.h"
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void)
{
  DDRC=0x20;
  DDRD=0x30;

  //Init PWM for SERVO Control on PD4, PD5
  //PWM, Phase and frequency correct, TOP=ICR1
  TCCR1A=0xA0; //clear on up-counting, set on down-counting
  TCCR1B=0x12; //Clock prescaler 1/8
  ICR1=9216;  //Set 50Hz frequency   

  while(1){

    for(uint16_t i=750; i<2250; i+=10){ //vrasheniye serv vpered

      //Set servo A pos:
     uint16_t servoPosA=i;
      OCR1A=servoPosA*23/50;

     //Set servo B pos:
     uint16_t servoPosB=2250+750-i;
     OCR1B=servoPosB*23/50;

     //Wait for a 20ms
     _delay_ms(20);
    };

    for(uint16_t i=2250; i>750; i-=10){ //vrasheniye serv nazad

     //Set servo A pos:
      uint16_t servoPosA=i;
     OCR1A=servoPosA*23/50;

     //Set servo B pos:
     uint16_t servoPosB=2250+750-i;
     OCR1B=servoPosB*23/50;
     //Wait for a 20ms
     _delay_ms(20);
    };
  };
   
}


Добавлено спустя 53 секунды:
только в условии не нужно серву вращать на определенный градус, только в одну из сторон.
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение avr123.nm.ru » 13 авг 2010, 15:18

Наверно так:

Код: Выделить всёРазвернуть
#include <"процессор ваш".h>
#include <delay.h>

int main(void)
{
  DDRC=0x20;
  DDRD=0x30;

  //Init PWM for SERVO Control on PD4, PD5
  //PWM, Phase and frequency correct, TOP=ICR1
  TCCR1A=0xA0; //clear on up-counting, set on down-counting
  TCCR1B=0x12; //Clock prescaler 1/8
  ICR1=9216;  //Set 50Hz frequency   

  while(1){

    for(uint16_t i=750; i<2250; i+=10){ //vrasheniye serv vpered

      //Set servo A pos:
     uint16_t servoPosA=i;
      OCR1A=servoPosA*23/50;

     //Set servo B pos:
     uint16_t servoPosB=2250+750-i;
     OCR1B=servoPosB*23/50;

     //Wait for a 19 ms
     delay_ms(19);
    };

    for(uint16_t i=2250; i>750; i-=10){ //vrasheniye serv nazad

     //Set servo A pos:
      uint16_t servoPosA=i;
     OCR1A=servoPosA*23/50;

     //Set servo B pos:
     uint16_t servoPosB=2250+750-i;
     OCR1B=servoPosB*23/50;
     //Wait for a 19 ms
     delay_ms(19);
    };
  };
   
}
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 13 авг 2010, 16:46

Нет, конечно не так, от того что вы изменили паузу с 20 мкс на 19, и подключили две дерективы, ничего не изменится :D Вы хорошо разбераетесь в компиляторе CvAVR ? Просто он не все поймет из этой программы. Например:
1. uint16_t servoPosA=i; заменяем на int servoPosA=i;
2. OCR1B=servoPosB*23/50; тут компелятор не знает что это за "символ" OCR1B/A ! Я знаю что OCR1B/A состоит из двух регистров: OCR1AH (cтарший бит) и OCR1AL(младший бит). И в них записывается значение этой формулы: OCR1B=servoPosB*23/50; и это значение выдается на ножку порта D5.
3. Так как, уважаемые, заставить компилятор CvAVR заставить видеть OCR1B/A ? :)
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение avr123.nm.ru » 13 авг 2010, 16:50

Можно в хидере разрешить доступ к OCR1B по аналогии с другими 16 битными регистрами.


Но лучше просто записать число в две части регистра OCR1B

servoPosB = servoPosB*23/50;

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

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 13 авг 2010, 16:55

А что именно записывать в BH и BL я не совсем понял ?
OCR1Bl = servoPosB*23/50;
OCR1BH = servoPosB;
А точнее, как вытащить оттуда это число и расфасовать по H & L ?
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение avr123.nm.ru » 13 авг 2010, 17:02

Язык Си для микроконтроллеров AVR и PIC - http://proavr.narod.ru/05.htm

Код: Выделить всёРазвернуть
servoPosB = servoPosB*23/50;

OCR1BL = (char)servoPosB;
OCR1BH = (char)(servoPosB >> 8);
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 16 авг 2010, 19:09

У меня компилятор ругается на запись ICR1=ххххх; :o Пишет, что не "индифицированный символ". Что делать в таком случае ? Компилятор CvAVR

Добавлено спустя 4 минуты 32 секунды:
MCU-ATmega32L

Добавлено спустя 16 минут 13 секунд:
Ай, сам разобрался, надо тоже разделить на старший и младший регистр
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение avr123.nm.ru » 16 авг 2010, 19:36

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

Re: Помогите разобраться с аппаратным и программным шимом

Сообщение S-T-A-L-K-E-R » 16 авг 2010, 20:10

Input Capture Register (ICR1) are all 16-bit registers. Special procedures must be followed when
accessing the 16-bit registers.
РОБОТОТЕХНИКА для каждого СВОИМИ РУКАМИ - SERVODROID.RU [SERVODROID.RU-Робототехника для начинающих своими руками]
Аватара пользователя
S-T-A-L-K-E-R
 
Сообщения: 314
Зарегистрирован: 05 ноя 2009, 10:10
Откуда: Санкт-Петербург vs Мурманск
Skype: sergey199100
прог. языки: С, C++, C++++, Delphi, Pascal, Asm

След.

Вернуться в Новичкам или основы основ роботостроения.

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24