Управление на мотор за сателитна чиния с помощта на микроконтролер

Източник: cxem.net

Превод от руски: Т. Б.

 

В една немного стара епоха на Dial-Up интернета, много хора са инсталирали сателитни чинии задвижвани от двигател, за да получат достъп до бърз интернет и безплатна телевизия с добро качество. Днес на първи план е ADSL, както и мобилният интернет.

Двигателното задвижване при много от хората излезе от употреба. Но не използването на такова нещо си е просто грях. Реших да използвам ДЗ(SG2100A, едно от най-популяните и евтини) за проследяване на позицията на слънцето (планирам изготвянето на слънчев воден нагревател). В крайна сметка ДЗ включва в себе си двигател + скоростна кутия + главен механизъм + крайни изключватели + контролер.

Контролерът на ДЗ работи обикновено на базата на протокола Diseqc 1.2(еднопосочно, без отговори). Контролерът на ДЗ се явява подчинен(slave)-контролер върху Diseqc шината и изпълнява командите на управляващото(master)-устройство (приемник, платка в PC, микроконтролер…). Цялата документация по този протокол се намира на английски език на уеб страницата www.eutelsat.com.

Инструкцията се състои от три байта: начало, адрес, команда[допълнителни байтове за инструкцията].

Началният байт може да бъде различен, но за ДЗ той има стойност 0xE0.
Адресът също може да бъде различен, но за ДЗ той има стойност 0x31.
Двигателното задвижване(ДЗ) може да изпълнява много и различни инструкции/ команди, но нас ни интересуват единствено следните:
0x00 Reset, нулиране на ДЗ, необходима за запомнянето на текущата позиция като 0-градуса.
0x60 Disable Soft Limits, необходима за реализиране на преместване в крайно възможно положение
0x66 Set East Soft Limit, необходима за задаване на максимален ъгъл на завъртане на Изток
0x67 Set West Soft Limit, необходима за задаване на максимален ъгъл на завъртане на Запад
0x68 Drive East, в 4-тия байт задават се стъпки или секунди
0x69 Drive West, в 4-тия байт задават се стъпки или секунди
0x6E Goto x.x°(Goto X), в техническата документация на ДЗ е указано, че то разбира тази инструкция.
Достатъчно.

ДЗ се захранва с постоянно напрежение 12-18V (когато се свърже напрежението светодиода на ДЗ трябва да свети със зелен цвят!)
Захранването се свързва по следният начин: плюса към жилото на кабела, а минуса – на оплетката.
Инструкцията сама по себе си представлява модулация на тези постоянни напреженови импулси с честота 22kHz +-20%.
Амплитудата на модулацията 650mV +- 250 mV.
Байтовете се предават последователно без паузи.
Всеки байт има 8-бита +9ти бит допълващ до нечетно число(например: 111100001). Всеки бит има продължителност 1500 us. В този смисъл бит „0“ е 22рия импулс с обща продължителност 1000 us плюс паузата 500 us.
А бит „1“ е 11тия импулс с обща продължителност 500 us плюс паузата 1000 us. Тогава подпрограмата за изработването на битовете за микроконтролера PIC, работещ с 4MHz, изглежда по следния начин:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// CCS C Compiler
#define MOPO  PIN_B0
**********
void sendbit(int8 v)  //v=0|1;
{int8 k,n;
 if(v==0) n=23; else n=12;   //Стойността на n е избрана по експериментален път в Proteus
 for(k=1;k < n; k++)
{ output_high(MOPO);
  delay_us(19);   // експериментален път
  output_low(MOPO);  
  delay_us(12);   // експериментален път
 }
 delay_us(500); if(v==1) delay_us(500);   // създаване на закъснение
}

Разбира се може да използвате метода за генериране на импулси чрез таймер и прекъсвания.

Сега е необходимо да се създаде един байт за предаване в ДЗ.
Байтът се предава, като се започне със старшия бит, и се приключи с бита за четност. За неговото изчисление разполагаме с този красив алгоритъм(документ Microchip AN774):

1
2
3
4
5
6
7
8
9
10
int8 odd(int8 n)
{int8 p;
 p=n >> 1;   
 p ^= n;    // XOR
 n= p >> 2;
 p ^= n;  
 n= p >> 4;
 p ^= n;  
 return !(p & 1); // връщане на младшия бит като бит за нечетност
}

Сега можем да предадем към ДЗ целия байт:

1
2
3
4
5
void sendbyte(int8 b)
{int8 i,bb; bb=b;
 for(i=0;i<8;i++) sendbit(shift_left(&bb,1,0));  // изход, започва със старшия бит
 sendbit(odd(b));    // изход бит Odd
}

Последователността на работа на ДЗ:
1) Прилага се захранващо напрежение към ДЗ(12-18V)
2) Ръчно, натиска се бутона за преместване на ДЗ в 0-та точка (Север)
3) Задържаме с ръка въртящия се лост, натискаме Reset(тесния отвор) и задържаме ~2 сек., докато светодиода несветне в зелен цвят.(Контролера на ДЗ запаметява тази позиция, като Север(0 градуса)).
4) Свързваме контролера на ДЗ, с вече сглобената микроконтролерна схема за генериране на импулси.
5) Изпращамве инструкцията Disable Soft Limits:
sendbyte(0xE0);sendbyte(0x31);sendbyte(0x63);
Между инструкциите е необходимо да осигурите пауза, и едва след това да изпратите следващата след като изпълнениено на предходната е приключило!
6) Сега ще завъртим ДЗ в крайно положение, за да разберем неговите възможности:
sendbyte(0xE0); sendbyte(0x31); sendbyte(0x68); sendbyte(0x7F);

– 3-ти байт инструкция 0x68 -Drive East
– 4-ти байт инструкция са неговите стъпки/секунди:
– 0x01 – 0x07F – това са секунди
(тоест, 0x7F това е завъртане с продължителност 127 секунди, а скоростта на завъртане на ДЗ е 2 градуса/сек. при захранване 12V)
– 0x80 – 0xFF – това са стъпки, при това 0xFF-представлява 1 стъпка, а 0x80 – 128 стъпки
– 0x00 – непрекъснато движение до края на механичния ограничител

Измерваме ъгъла на завъртане на ДЗ, ако той е недостатъчен, опитайте да премахнете или преместите крайните изключватели. При мен се получи +- 75 градуса, което съответства на данните от документацията. След това не забравяйте да зададете максималния ъгъл на завъртане.

Но първо трябвна да се научим да придвижваме ДЗ на дадена ъглова позиция:
Първо ще върнем задвижването в точка „Север“:
sendbyte(0xE0); sendbyte(0x31); sendbyte(0x6E); sendbyte(0x00); sendbyte(0x00);
Нека разгледаме структурата на тази инструкция от 4-ри байта:
– за придвижване в точката изток Север (в моя случай 0-75) старшия полубайт = 0xE.
– за придвижване в точката запад Север (0-75) старшия полубайт = 0x0.
– числото в младшия полубайт задава градуса: за получаване на градусите това число се умножава с 16 (например, 3х16=48 градуса).
Структурата на 5-тия байт от инструкцията:
– старшия полубайт дава градуси (например, 0хА – това са 10 градуса)
– младшия полубайт определя дробната част:
1ххх добавя 0,5 градуса
х1хх добавя 0,25 градуса
хх1х добавя 0,125 градуса
ххх1 добавя 0,0625 градуса

Нека разгледаме примерната инструкция: 0xE0,0x31,0x6E,0xE5,0x3F
– 0xE в 4-ти младши байт означава, че двигателя се движи на изток
– 0x5 в 4-ти младши байт означава, че двигателя се придвижва в точка 5х16 = 80 градуса.
– 0х3 в 5-ти младши байт означава, че към 80-те градуса се добавят още 3 градуса
– 0хF в 5-ти младши байте означава, че към 83-те градуса се добавят още надо добавить еще 0,5+0,25+0,125+0,0625=0,9375
И така ДЗ ще се премести в точка 83,9375 градуса източна дължина. Незабравяйте, че ако ние разменим нулевата позиция (точка Север) на точка Юг (което се е направено за антени или слънчеви концентратори), то Запад и Изток ще сменят своите места.

Сега нека преминем към крайната Източна точка, например E60:
sendbyte(0xE0); sendbyte(0x31); sendbyte(0x6E); sendbyte(0xE3); sendbyte(0xC0);
Нека зададем и този ъгъл като ограничение на изток:
sendbyte(0xE0); sendbyte(0x31); sendbyte(0x66);
Сега нека се преместим в крайната западна точка, например W60:
sendbyte(0xE0); sendbyte(0x31); sendbyte(0x6E); sendbyte(0x03); sendbyte(0xC0);
Нека зададем този ъгъл като граница на запад:
sendbyte(0xE0); sendbyte(0x31); sendbyte(0x67);
Сега, в случай на грешна инструкция или при повреда, Двигателното Задвижване не може да се завърти повече от зададените +-60 градуса.

ntv30-1_1

Схемата за генериране на импулси е взета от статията Тестер DISEqC-устройств с поддержкой протоколов управления: 1.0, 1.1 и 1.2″, А. Данилин, СОВРЕМЕННАЯ ЭЛЕКТРОНИКА № 7 2009.
Като вместо двата диода VD5, VD6 (1N4004) е поставен само един.

Алгоритъмът и схемата са действително изпитани.