roboforum.ru

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

Управление сервой с помощью потенциометра. МК PIC16F887

Re: Управление сервой с помощью потенциометра. МК PIC16F887

kotikov » 14 июл 2010, 01:31

Исправил. Конечно выложу! + весь полезный материал, который будет использоваться и видео с демонстрацией.
Только вот сначала нужно ЭТО СДЕЛАТЬ, а новых идей пока никаких...

Добавлено спустя 1 минуту 47 секунд:
Как данными из ADRESH и ADRESL можно более грамотно воспользоваться?

Re: Управление сервой с помощью потенциометра. МК PIC16F887

avr123.nm.ru » 14 июл 2010, 08:54

Посмотреть код можно в примерах, в руководстве компилера похожем на супер учебник, возможно в даташите.

Re: Управление сервой с помощью потенциометра. МК PIC16F887

kotikov » 14 июл 2010, 10:44

avr123.nm.ru писал(а):Посмотреть код можно в примерах, в руководстве компилера похожем на супер учебник, возможно в даташите.

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

Re: Управление сервой с помощью потенциометра. МК PIC16F887

avr123.nm.ru » 14 июл 2010, 11:22

На страничке где качается компилер находится СУПЕР ПУПЕР и экстра руководство. Где есть ВСЕ что делает типовой радигубитель - АЦП точно есть.

вот картинка из того СУПЕР мануала

По ней код ваш таков примерно

Код: Выделить всёРазвернуть
while(1){
пауза 18 мс
на серво выдать "1"
пауза_мкс ( ( ADC_read (номер канала АЦП) + 1000) );
на серво выдать "0"
}


А функцию паузы в мкс вам придется самому наверно писать.
Либо использовать функцию паузы в 10 машинных циклов PIC - Delay_Cyc ( от 3 до 255 )

Delay_Cyc (10);

Это пауза 100 циклов, при 20 Мгц циклы в PIC с частотой 5 МГц случаются, значит пауза 20 мкС.


=
Вложения
adc_pic_mikroc.png

Re: Управление сервой с помощью потенциометра. МК PIC16F887

kotikov » 14 июл 2010, 13:23

Я сейчас более глубоко изучал ситуацию и понял что ADRESH изменяется от 0 до 255, кот-нибудь может пояснить как изменяется и в зависимости от чего ADRESL? Его значения прыгают от 0 до 192.
И так ADRESH мы умножаем на 4 и получаем значение от 0 до 1020. ADRESL делим на 64 и получаем значение от 0 до 3. Складываем ADRESH и ADRESL и получаем значение от 0 до 1023.

Проблему с колбашеньем сервы решил, теперь она двигается плавно.

Вот последняя версия кода на данный момент. Серва все еще выполняет только три положения(как я писал ранее - крайне левое, среднее, крайне правое). Не могу понять какая часть кода отвечает за это явление...
Код: Выделить всёРазвернуть
int x;
unsigned i;

void main()
{
TRISC.F5 =0;
TRISB.F4 =0;
TRISB.F5 =0;

while(1)
      {
ADCON0=0b00001111;          //справа на лево 1 - АЦП вкл, 1- аналогово-цифровое преобразование вкл., 1100 порт RA3, 00 - FOSC для частоты 20мгц, Tad=100нсек
   Delay_ms(20);                // задержка 20мс

   x=(ADRESH*4)+(ADRESL/64);   // а здесь начинается вычисление лучше которого я пока что не придумал...
   i=(1900/100)*(x/(1023/100));
   i=i+500;
   i=i/1000;

ANSEL=0x00;
ANSELH=0x00;

PORTC.F5=1;          //команды работать соответствующим выходам
PORTB.F5=1;
PORTB.F4=1;
Vdelay_ms(i);   

PORTC.F5=0;
PORTB.F5=0;
PORTB.F4=0;
delay_ms(20);
       }
}

Re: Управление сервой с помощью потенциометра. МК PIC16F887

Zeus » 14 июл 2010, 14:50

ADRESL ADRESH - 10 битный результат АЦП
в одном 8 бит в другом 2 бита.
можно выставить левое и правое выравнивание.
А вообще не заморачивайся с ними бери готовую функция ADCRead(канал).
в твоем случае можно использовать только ADRESH - 8бит - разрешение получится 255 и не делать преобразование х=()+().
а прыгает так по-тому что у тебя левое выравнивание стоит и биты по спадающему идут, сперва забивают ADRESH, а потом ADRESL.
сделай правое выравнивание.
1.jpg

ADRESL
00xx xxxx - 0
01xx xxxx - 64
10xx xxxx - 128
11xx xxxx - 192
только когда сделаешь правое выравнивание, надо будет формулу для х менять.

Re: Управление сервой с помощью потенциометра. МК PIC16F887

Zeus » 15 июл 2010, 10:33

Изучай даташит на PIC16F887.
Вот вкратце накидал прогу (без прерываний и таймеров) она далеко не гут, но все же работает:
Код: Выделить всёРазвернуть
#include <built_in.h>

int x;
unsigned i;

void main()
{
TRISC.F5 = 0;

ANSEL  = 0b11111111;        // PORTA is input
TRISA  = 0b00001000;        // Configure AN3 pin as analog

while(1)
      {
      i = ADC_Read(3);   // Get 10-bit results of AD conversion
      i=i+1000;

      PORTC.F5=1;                 //команды работать соответствующим выходам
      VDelay_Advanced_ms(i, 20);  // задержка в мкс (виртуальное занижение частоты)

      PORTC.F5=0;
      VDelay_Advanced_ms(20000-i, 20);      // задержка мс 20мс=20000мкс
      }
}

2.jpg

Файл для протеуса:
2.rar
(17.1 КиБ) Скачиваний: 0


Для более точной настройки можно поиграться с i=i+1000;
и VDelay_Advanced_ms(20000-i, 20);

Re: Управление сервой с помощью потенциометра. МК PIC16F887

kotikov » 16 июл 2010, 17:16

На выходные уезжаю. Приеду разберусь с программой. Она работает, я ее загрузил на плату - все окей. Только серва не доходит до крайних положений. Доработаю по возвращению :)
Про ADRESL и ADRESH - зачем нужно делать левое или правое выравнивание?

Re: Управление сервой с помощью потенциометра. МК PIC16F887

Anubis » 23 июл 2010, 01:51

kotikov писал(а):Я сейчас более глубоко изучал ситуацию и понял что ADRESH изменяется от 0 до 255, кот-нибудь может пояснить как изменяется и в зависимости от чего ADRESL?

не глубоко...
Если по простому то: при правом выравнивании точность, при левом быстродействие.
При правом выравнивании тебе в любом случае придется использовать оба регистра, тобишь все 10 бит. И изменяться от 0 до 255 будет не ADRESH, а ADRESL. ADRES=ADRESL+(256*ADRESH) , а дальше можешь делать с ним все что хочешь.
При левом выравнивании младшие пару битов ADRESL можно выкинуть и работать только с ADRESH. Получается только 8 бит (правда это потом надо будет учитывать). Если не придираться к словам то как-то так...
З.Ы. Помоему лучше завязывать с микроС и переходить на Hi-Tech, все по ближе к примерам и пониманию как и что должно работать... Чем мучаться с этими Delay-то Delay-сё, лучше включить таймер и делать все на нем....

Re: Управление сервой с помощью потенциометра. МК PIC16F887

Zeus » 06 авг 2010, 17:02

Сообщение kotikov » 16 июл 2010, 18:16
На выходные уезжаю. Приеду разберусь с программой. Она работает, я ее загрузил на плату - все окей. Только серва не доходит до крайних положений. Доработаю по возвращению :)


Уже не одни выходные прошли...
Есть какие-нить результаты или вопросы?

Re: Управление сервой с помощью потенциометра. МК PIC16F887

Anubis » 08 авг 2010, 00:33

:oops:
У меня вопрос, только контроллер другой PIC18F6527 и проблема с другим модулем


cron
Rambler\'s Top100 Mail.ru counter