В статье, опубликованной в журнале "Радио" №9 2007г., редакция   вырезала на мой взгляд некоторые существенные моменты, поэтому здесь я выкладываю статью в том виде, в каком я её послал в редакцию

Световое табло с круговой механической развёрткой

 

Световое табло с круговой механической развёрткой позволяет небольшим количеством светодиодов создавать относительно сложные графические картинки, на которые при статичном способе формирования изображения потребовались бы сотни светодиодов. При этом, также как в кино и ТВ, используется свойство инерционности человеческого зрения. Линейка светодиодов, двигаясь по кругу, рисует какое-то изображение, но так как скорость её вращения примерно 25 об/сек, создаётся иллюзия «висящей» в воздухе картинки (рис.1.).

 

Рис.1

 

 Картинка может быть как статичной, так и с несложной  анимацией (вращение фигуры, плавное увеличение количества  лучей звезды и т.д.).    Изображение  хорошо различимо и днём (но не на прямом солнечном свете), т.к. используются светодиоды с повышенной яркостью.

   Память программ PIC16F84A позволяет показывать последовательно 5-6 различных фигур.

 

   Вместе с тем, главным недостатком такого способа является наличие вращающихся с высокой скоростью механических частей, что  заставляет позаботиться об исключении контакта зрителя с табло - закрывать его прозрачном экраном; размещать за стёклами окон, витрин; подвешивать на недосягаемой высоте и т.д.

 

    Конструктивно табло состоит из трёх частей:

1.      Двигателя от компьютерного БП со вращающимся трансформатором (ВТ).

2.       Стационарной платы со схемой импульсного питания ВТ и схемой стабилизации скорости вращения двигателя.

3.      Вращающейся платы развёртки, на которой размещены две линейки светодиодов – красная и зелёная и контроллер PIC16F84A.

 

      Процесс изготовления ВТ  практически повторяет описанный в  [2].  Снимите фиксирующую шайбу ротора вентилятора, снимите крыльчатку. Отпилите (откусите) лопасти вентилятора, зачистите пластмассовый стакан ротора- должна быть ровная, гладкая поверхность.

  Закрепите ротор в дрели и надфилем или резаком текстолита сделайте углубление (как показано на рис.2), так чтобы по краям образовались бортики. Намотайте в этом углублении 200 витков эмалированным проводом диаметром 0.1мм.  Для придания жёсткости покройте лаком  или эпоксидкой. Выводы обмотки необходимо вывести к центру крышки стакана ротора.  На рис.3. показан ротор с закреплённой платой развёртки.

 

Рис.3.

 

 Подберите втулку -  пластиковую, картонную или изготовьте сами (я вырезал втулку из  баночки с канифолью). Внутренний диаметр этой втулки должен быть  на 2-3мм больше, чем диаметр намотанной обмотки на роторе. Намотайте на неё 200 витков эмалированным медным проводом диаметром 0.1мм, выведите среднюю точку, и затем оставшиеся 200 витков в том же направлении. Зафиксируйте  обмотку лаком и закрепите (например, холодной сваркой) эту втулку на статоре так, чтобы обмотка ротора не касалась внутренней поверхности втулки. На рис.4 показана неподвижная обмотка, закреплённая на статоре.

 

Рис.4.

 

    В более мощных двигателях вентилятора металлическое основание ротора имеет вид стакана, а не кольца, как описано выше. В таком случае, от пластмассового стакана отрежьте под самую крышку внешнее пластмассовое кольцо, снимите его.  Наждачкой или круглым напильником увеличьте, по возможности, его  внутренний диаметр и намотайте на него обмотку статора. Обмотку ротора намотайте виток к витку прямо на металлическую чашку ротора. Этот способ описан в [3].

 

 На стационарной плате собраны формирователь импульсного напряжения питания обмотки статора ВТ и стабилизатор скорости вращения двигателя. На рис.5 показана схема этой платы.

 Формирователь импульсного напряжения выполнен по схеме генератора симметричного меандра [5], стр.218 . Частота генератора - 10 кГц.  В этой схеме я использовал мощные N-канальные полевые транзисторы IRF630, хотя можно поставить и менее мощные, например отечественные КП505.

 Схема стабилизации частоты вращения двигателя практически полностью аналогична [4], которая переделана под однополярное питание и изменены входной и выходной каскады. В качестве входного сигнала частоты вращения использован сигнал с датчика скорости, расположенного на   плате  мотора вентилятора. Чтобы найти этот сигнал снимите ротор, найдите на плате мотора трёхвыводной датчик скорости. Просверлите с обратной стороны в пластике отверстие, чтобы получить доступ к контактным площадкам этого датчика. Соберите мотор, включите его и определите на каком из выводов сигнал меандра, пропорционального скорости вращения - его и подайте на схему на вывод IN.

 

Рис.5.

 

 Скорость вращения регулируется  с помощью переменного резистора R28.

 Конденсаторы С1, С2, С3 и особенно С5 необходимо выбрать по возможности с минимальным ТКЕ.

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

 

    На рис.6 показан чертёж печатной платы, на рис.7 –сборочный чертёж.

Рис.6.

 

Рис.7.

 

 

 

 

 

 

  Так как двигатель вентилятора БП сравнительно маломощный, с целью уменьшения веса и размеров вращающейся платы развёртки монтаж выполнен в основном на SMD компонентах (рис.8).

 

 

Рис. 8.

    Принципиальная схема платы развёртки приведена на рис.9. 

  Светодиоды катодами подключены к порту PORTB через токоограничительные резисторы резистивных матриц RM1-RM8. Эти матрицы можно выпаять с неисправных материнских плат. Биты RB0-RB6 управляют по одному светодиоду, причём бит RB0 управляет внешним (самым дальним от центра) светодиодом, RB1- следующим ближе к центру и так по порядку до RB6.  Бит RB7 управляет сразу шестью ближними к центру светодиодами.

  Выводы RA1 и RA2 управляют включением зелёной и красной линеек светодиодов соответственно.

Рис.9

 

C1-0.01

C2-100pF

C3-220.0x16V

C4-0.1

C5,C6-20pF

C7-0.1

C8-220.0x10V

C9,C10-0.1

 

D3..D15- красные светодиоды диаметром 3 мм повышенной яркости

D16..D26- зелёные светодиоды диаметром 3 мм повышенной яркости

 

IC1-PIC16F84A

IC2-78L05 (SMD корпус)

 

Q1-Q3, Q8,Q9- КТ3130А9

Q4-Q7- КТ3129А9

 

R1-10K

R2-47K

R3-47K

R4-2K2

R5..R7-10K

R8,R9-4K7

R10-10K

R11-4K7

R12-10K

R13-4K7

R14-10K

R15-1K

R16-10K

R17-10K

R18,R19-2K2

R20..R23-100

RM1..RM4-4x56 Om

 

T1- GP1S55

 

ZQ1 – 4MHz

 

Вывод RA0 опрашивает сигнал с датчика начальной фазы. В качестве этого датчика я использовал П-образную оптопару (например, GP1S55), которая часто используется в принтерах, копирах (в качестве датчика наличия бумаги), в подкатушечниках видеомагнитофонов (в качестве датчика скорости вращения) и т.д.

 

Рис.10.

 

   Разрезав её, получим ИК излучатель и ИК приёмник. ИК излучатель необходимо закрепить на стационарной части табло, строго внизу (т.к. я писал программу исходя из того, что изображение начинает рисоваться снизу против часовой стрелки). ИК приемник крепится к линейке зелёных    светодиодов напротив ИК излучателя так, чтобы расстояние между ними было 3-5мм (рис.10).

  На рис.11 и рис.12 показаны чертежи печатных плат (ПП). ПП со стороны монтажа (рис.11) показана так, как она реально выглядит, а чертёж обратной стороны (рис.12) - в зеркальном виде. Так, если будет использоваться лазерно-утюжная технология, надо будет распечатать ПП со стороны монтажа в зеркальной проекции, а ПП нижнего слоя в том виде, как на рисунке.

 

Рис.11.

Рис.12

 

Подпись: значком        показаны межслойные переходы. 
 

 

     Рис. 13.

 

     На рис.13 показан сборочный чертёж платы развёртки.

     Выводы от ВТ пропускаются  через отверстие в центре платы. Центр этого отверстия является геометрическим центром платы, поэтому постарайтесь, чтобы он точно совпал с геометрическим центром крышки стакана ротора во избежание вибрации и биений платы при её вращении.

 Плата крепиться к ротору 2-мя винтами. В плате надо просверлить 2 отверстия диаметром на 0.5 мм меньше, чем диаметр винтов, используемых для крепежа (я крепил винтами от крышек АТХ БП, головки которых потом утопил). Этими же винтами в этих отверстиях в текстолите нарезается резьба, впоследствии будьте аккуратны, чтобы чрезмерным усилием не сорвать эту резьбу.

    Напротив всех мест паек на нижнем слое, необходимо сделать углубления на поверхности пластикового стакана ротора,  так, чтобы места этих паек были утоплены и ПП плотно прилегала к крышке стакана ротора. Это лучше делать до монтажа элементов,  приложив ПП к крышке стакана и просверлив тонким сверлом сквозные отверстия, а затем сверлом с бОльшим диаметром раззенковать отверстия в крышке стакана ротора.

 До монтажа 18-выводной панельки под PIC16F84A надо запаять R5 и C10. У панельки 15 и 16 вывод вставляются в отверстия и паяются с обратной стороны, все остальные выводы загибаются горизонтально и так паяются со стороны монтажа (как у планарной м/с). 18 вывод загибается под небольшим углом (см. рис.13).

     2 провода от ВТ пропускаются через центральное отверстие и припаиваются непосредственно к выводам диодного моста В1 (см. рис.8).

  Светодиоды подключаются к плате через соответствующие  контактные площадки с помощью 0.1мм эмалированного медного провода. Когда все светодиоды будут подключены, можно зафиксировать жгут из этих проводов лаком, термоклеем или эпоксидкой в 2-3 точках.

     После того, как плата собрана, с целью минимизировать вибрации при вращении, её необходимо отцентровать по осям А-А  и Б-Б. Для этого можно припаять обрезки выводов от резисторов в показанных на рис.14 точках, положить их на две опоры (по оси А-А или по оси Б-Б) и добиться горизонтальности (равновесия) платы. В качестве противовеса я использовал термоклей.  

 

   Проверьте правильность сборки платы, для чего  подайте +15В на стационарную плату при отключённом двигателе.  Убедитесь, что питание подаётся на плату развёртки и на выв.14 панельки контроллера присутствует +5В.

   Запишите в память программ   контроллера файл port_test.hex . Эта программа написана с целью облегчить проверку платы развёртки при неработающем двигателе. Подайте питание - при этом светодиоды должны загораться последовательно от края к центру по одному (в центре 6 одновременно) сначала на красной линейке, затем на зелёной, затем на обеих и снова по циклу. Убедитесь, что все светодиоды загораются  и что они  включаются в правильной последовательности. Подключите двигатель и запишите в память программ контроллера файл radio2007.hex .

 

 Программа для микроконтроллера PIC16F84A написана на языке Си с использованием  компилятора HI-TECH PICC, бесплатную упрощённую версию которого HI-TECH PICC Lite  можно скачать с сайта www.htsoft.com . Эта версия поддерживает микроконтроллер PIC16F84A, который используется в этой схеме.

 В начале программы идут массивы, по элементам которых прорисовывается фигуры. Круг поделён на 120 секторов, каждый по 3 град. -  это и есть элемент, 8-разрядный код которого хранится в соответствующей ячейке массива.

  Чтобы нарисовать фигуру, надо  начертить  8 концентрических окружностей, разбить их на 120 секторов  и в точках пересечения ставить цветные метки там, где должны светить светодиоды. Я это делал  с помощью программы MS Office Visio.  Полученные значения необходимо занести в массив изображаемой фигуры, двигаясь в направлении вращения двигателя (против часовой стрелки).

Рис.15

 

На рис.15 показан фрагмент пятиконечной звезды.

 

 

 Наиболее компактным получается код для фигур с центральной симметрией- звёздочек, снежинок и т.д. (рис.16).

   

Рис.16

 

   Для таких фигур достаточно создать массив с элементами, описывающими один луч, а затем мультиплицировать его нужное количество раз.

 

    Для фигур с осевой симметрией- например, ёлочка (рис.17), код можно уменьшить в 2 раза- в массив заносятся элементы левой половины фигуры, а затем повторяются зеркально.

Рис.17

 

 Для фигур, в которых симметрия  отсутствует (рис.18), в массив приходится заносить все 120 элементов изображения.

Рис.18

 

 Табло создавалось в преддверии Нового Года, этим объясняется новогодняя тематика картинок. Вы можете создать картинки по своему вкусу, изменив значения элементов массива или полностью переписав программу.

 

 Ниже приведён листинг программы (файл radio2007.c).

 

#include               "pic.h"

 

#define bitset(var,bitno) ((var) |= 1 << (bitno))

#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))

 //----------Функции---------------------

void delay(int);    //задержка

 

const unsigned char radio2007[120]= {    // "<<РАДИО>> - 2007г."

0x00, 0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, //O  

0x00, 0x00, 0x00, 0x40, 0x47, 0x48, 0x50, 0x60, //7

0x00, 0x00, 0x0F, 0x08, 0x08, 0x01,//г.

0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 

0x00, 0x00, 0x00, 0x80, 0x00, 0x00,

0x00, 0x08, 0x00, 0x14, 0x22, 0x08, 0x14, 0x22, //>> 

0x00, 0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, //O 

0x00, 0x00, 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, //И

0x00, 0x00, 0x00, 0x40, 0x7F, 0x41, 0x42, 0x44, 0x78, 0x40, //Д

0x00, 0x00, 0x00, 0x7F, 0x11, 0x12, 0x14, 0x78, //A

0x00, 0x00, 0x00, 0x06, 0x09, 0x09, 0x09, 0x7F, //P

0x00, 0x00, 0x22, 0x14, 0x08, 0x22, 0x14, 0x08, //<<

0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 

0x00, 0x00, 0x00, 0x80, 0x00, 0x00,

0x00, 0x00, 0x00, 0x21, 0x43, 0x45, 0x49, 0x31, //2

0x00, 0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E //O 

};  

 

const unsigned char HeppyNY[120]= {              // " С Новым Годом"

0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, //O 

0x00, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, //H 

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //пробел

0x00, 0x00, 0x22, 0x41, 0x41, 0x41, 0x3E, //C 

0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,  //Г   

0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, //O      

0x00, 0x00, 0x01, 0x0F, 0x11, 0x21, 0x41, 0x7F, 0x01, //Д

0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, //O   

0x00, 0x00, 0x7F, 0x20, 0x10, 0x08, 0x10, 0x20, 0x7F, //M 

0x00, 0x00, 0x00, 0x7D, //!     

0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x7F, 0x02, 0x04, 0x08, 0x04, 0x02, 0x7F, //M   

0x00, 0x00, 0x7F, 0x00, 0x30, 0x48, 0x48, 0x48, 0x7F,//Ы

0x00, 0x00, 0x36, 0x49, 0x49, 0x49, 0x7F  //B  

};

const unsigned char Elka[60]= {    // Ёлка

0x0F, 0x08, 0x08, 0x7C, 0x3C, 0x1C, 0x06, 0xE6, 0xFE, 0xF3,

0xF1, 0xF0, 0xF8, 0x04, 0x02, 0x3F, 0xC0, 0xC0, 0xF0, 0xF8,

0x04, 0x02, 0x03, 0x1C, 0x20, 0x40, 0xC0, 0xF0, 0x7C, 0x3F,

0x1E, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00, 0x70, 0x60, 0x60,

0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x40, 0x50, 0x50, 0x30,

0x70, 0x70, 0x70, 0x70, 0x78, 0x38, 0x3C, 0x1C, 0x1E, 0x81

 

};

 

const unsigned  char StarGreen[24]= { //луч 5-конечной звезды

0x80, 0x80, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x08, 0x04, 0x02, 0x01,

0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80

 };

const unsigned  char StarRed[24]= { //луч 5-конечной звезды

0x01,0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x00,

0x80, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x08, 0x04, 0x02 

 };

const unsigned  char Snow[20]= { //снежинка

0x00, 0x20, 0x50, 0xC8, 0x50, 0x20, 0x00, 0x00, 0x00, 0x09,

0x12, 0x24, 0x48, 0xFF, 0x48, 0x24, 0x12, 0x09, 0x00, 0x00

 };

//-----------Глобальные переменные--------

            unsigned char  Strob;

main()

                           {

            unsigned char   cntLine, color,varTmp, beamNum,cntLine2;

            unsigned int cntKdr;

 

            TRISA = 0b00000001;            //PORTA

            TRISB = 0b00000000;            //PORTB

 

            PORTB=0x7F;

            di();         //запрет  прерываний(GIE=1)

            while(1){

 

 

//===============================<<РАДИО>> - 2007г.============================

            cntKdr=0;                //счётчик оборотов

            PORTA =0b00010011;          

            while(cntKdr<100){

            cntLine=0;              //счётчик угловых осчётов (по 3 град. каждый)

            Strob=0;

                                           for(cntLine=0; cntLine<120; cntLine++){

                                                           delay(39);                //задержка T=(20+ki*11)us

                                                           varTmp=radio2007[cntLine]; //извлечение значения из массива

                                                           PORTB= varTmp^0x7F; //RB0-RB6 включается нулём, RB7- единицей

                                                           if(RA0==0 && Strob>10)  break; //опрашивается датчик фазы по срезу импульса и

                                                                                          //игнорируется в течении 10 следующих угловых отсчётов              

                                           }//for                                                                                                    

                                                           while (RA0) ;

                                                           cntKdr++;

            }//while _____________________________________________________________

//======================= 5-конечная звезда ==============================

            PORTA =0b00010101;                          //red

            cntKdr=0;

            while(cntKdr<100){

            cntKdr++;

            beamNum=0;

            cntLine=0;

            Strob=0;

                           for (beamNum=0; beamNum<5; beamNum++) {  //цикл по числу лучей

                                           for(cntLine=0; cntLine<24; cntLine++){ //цикл по угловым отсчётам

                                                                           delay(39);                //задержка T=(20+ki*11)us

                                                           varTmp=StarRed[cntLine]; //извлечение значения из массива

                                                           PORTB= varTmp^0x7F; //RB0-RB6 включается нулём, RB7- единицей

                                                           if(RA0==0 && Strob>10)  break; //опрашивается датчик фазы по срезу импульса и

                                                                                          //игнорируется в течении 10 следующих угловых отсчётов              

            }//for

                                           if(RA0==0 && Strob>10)  break;          

                                           cntLine=0;

                           }//for

                                                           while (RA0) ;

            } //while_____________________________________________________

//=======================Снежинка ==============================

            cntKdr=0;

            while(cntKdr<100){

            cntKdr++;

            PORTA =0b00010011;                          //green

            beamNum=0;

            cntLine=0;

            Strob=0;

                           for (beamNum=0; beamNum<7; beamNum++) {

                                           for(cntLine=0; cntLine<20; cntLine++){

                                                           delay(39);                //задержка

                                                           varTmp=Snow[cntLine];

                                                           PORTB= varTmp^0x7F;

                                                           if(RA0==0 && Strob>10)  break;

                                           }//for

                                           if(RA0==0 && Strob>10)  break;          

                                           cntLine=0;

                           }//for

            } //while______________________________________________________________

//========================= C Новым Годом =================================

            cntKdr=0;

            PORTA =0b00010101;          

            while(cntKdr<100){

            cntLine=0;

            Strob=0;

                                           for(cntLine=0; cntLine<120; cntLine++){

                                                           delay(39);                //задержка T=(20+ki*11)us

                                                           varTmp=HeppyNY[cntLine];

                                                           PORTB= varTmp^0x7F;

                                                           if(RA0==0 && Strob>10)  break;

                                           }//for

                                                           while (RA0) ;

                                                           cntKdr++;

            }//while______________________________________________________________

//=======================  Снежинка - вращение  =====================

            cntKdr=0;

            while(cntKdr<200){

            cntKdr++;

            PORTA =0b00010011;                          //green

            beamNum=0;

            cntLine=0;

            Strob=0;

                           for (beamNum=0; beamNum<7; beamNum++) {

                                           for(cntLine=0; cntLine<20; cntLine++){

                                                           delay(37);                //задержка

                                                           cntLine2=(cntKdr & 0x0F);  //сдвигаем в течении 16 оборотов

                                                           cntLine2 += cntLine; //каждый оборот фаза сдвигается на 3 град.(на 1 угловой отсчёт)

                                                           if (cntLine2 > 19) cntLine2-=20;

                                                           varTmp=Snow[cntLine2];

                                                           PORTB= varTmp^0x7F;

                                                           if(RA0==0 && Strob>10)  break;

                                           }//for

 

                                           if(RA0==0 && Strob>10)  break;          

                                           cntLine=0;

                           }//for

            } //while______________________________________________________________

 

//======================= 6-конечная звезда -расширение от центра ==========================

            cntKdr=0;

            while(cntKdr<255){

            cntKdr++;

            beamNum=0;

            cntLine=0;

            Strob=0;

                           for (beamNum=0; beamNum<6; beamNum++) {

                                           for(cntLine=0; cntLine<24; cntLine++){

                                                           unsigned int varTmp1; //локальная на время цикла 16-разрядная переменная

                                                           delay(30);                //задержка T=(20+ki*11)us

                                                           varTmp1=StarRed[cntLine];

                                                           varTmp1<<=8;

                                                           varTmp1=varTmp1>>((cntKdr>>1) & 0x0F); //сдвигаем от 0 до 15 раз в зависимости

                                                                                                                         //от значения счётчика оборотов cntKdr

if (cntKdr & 0x20)                 PORTA =0b00010101; //red

                                                                          else  PORTA =0b00010011;                   //green

                                                           PORTB= varTmp1^0x7F;

                                                           if(RA0==0 && Strob>10)  break;

                                           }//for

 

                                           if(RA0==0 && Strob>10)  break;          

                                           cntLine=0;

                           }//for

                                                           while (RA0) ;

            } //while______________________________________________________________

//=============================== Ёлка ===================================

            cntKdr=0;

            while(cntKdr<300){

            cntLine=0;

            Strob=0;

            PORTA =0b00010011;

                                           for(cntLine=0; cntLine<121; cntLine++){

                                                                                          PORTA =0b00010011; //зелёный

                                                                           delay(37);                //задержка T=(20+ki*11)us

                                                                          if (cntLine<60)       varTmp=Elka[cntLine]; //рисуем правую половину ёлки

                                                                          else if(cntLine<120)  varTmp=Elka[119-cntLine];//левую половину

                                                                          else {PORTA =0b00010111; //зелёный и красный

                                                                                                          varTmp=0x01;}      //рисуем "звёздочку" на макушке

                                                           PORTB= varTmp^0x7F;

                                                           if(RA0==0 && Strob>10)  break;

                                           }//for

 

                                           while (RA0) ;

                                                           cntKdr++;

            }//while _________________________________________________________

//======================= (4-->N)-конечная звезда ==============================

            PORTA =0b00010101;                          //red

            cntKdr=0;

            while(cntKdr<200){

            cntKdr++;

            beamNum=0;

            cntLine=0;

            Strob=0;

                           for (beamNum=0; beamNum<100; beamNum++) {

                                           for(cntLine=0; cntLine<24; cntLine++){

                                                           delay(51-(cntKdr>>2)); //меняем время задержки в зависимости

                                                                                          //от значения счётчика оборотов

                                                           varTmp=StarRed[cntLine];

                                                           PORTB= varTmp^0x7F;

                                                           if(RA0==0 && Strob>10)  break;

                                           }//for

 

                                           if(RA0==0 && Strob>10)  break;          

                                           cntLine=0;

                           }//for

                                                           while (RA0) ;

            } //while______________________________________________________________

//======================= (4-->N)-конечная звезда ==============================

            PORTA =0b00010011;                          //green

            cntKdr=0;

            while(cntKdr<200){

            cntKdr++;

            beamNum=0;

            cntLine=0;

            Strob=0;

                           for (beamNum=0; beamNum<100; beamNum++) {

                                           for(cntLine=0; cntLine<24; cntLine++){

                                                           delay(51-(cntKdr>>2));           //задержка T=(20+ki*11)us

                                                           varTmp=StarRed[cntLine];

                                                           PORTB= varTmp^0x7F;

                                                           if(RA0==0 && Strob>10)  break;

                                           }//for

 

                                           if(RA0==0 && Strob>10)  break;          

                                           cntLine=0;

                           }//for

                                                           while (RA0) ;

            } //while______________________________________________________________

 

            }//while

            }//main

 

//============-- задержка T=(20+ki*11)us  --==========

void delay(kmax)

            {              unsigned char ki;

            for (ki=kmax; (ki); ki--) {

                           if(RA0==0 && Strob>10)  return;                                                                                        

                           }

            if (Strob<12) Strob++;

}                            //

 

 

 

 

 

 

Литература

1.      http://www.bobblick.com/techref/projects/projects.html

2.      http://www.arjan-swets.com/tekst_hobby_propklok_mech_N.html

3.       http://www.geocities.com/syco5_2k/propellerclock.html  

4.       Ридико Л. Стабилизатор частоты вращения коллекторного двигателя    http://www.telesys.ru/projects/proj055/index.shtml

 

5.      Шило В.Л. Популярные цифровые микросхемы.

6.       

Hosted by uCoz