Кодер
С появлением одно кристальных программируемых микроконтроллеров построение
схем обработки существенно упростилось. Вот пример построения кодера на PIC16F84 или аналогичном
В PIC16F84 нет встроенного АЦП,
поэтому для определения положения ручки управления используется такой принцип:
На портах А0-А3 устанавливается высокий уровень , при этом заряжаются
конденсаторы С1-С4 затем порт А0 переключается в режим входа конденсатор
С1 разряжается до уровня логического 0. Время заряда зависит от положения
движка резистора R1. В результате формируется канальный импульс первого канала.
Процесс повторяется для 2,3 и 4 го каналов, далее идет синхроимпульс в результате получается что то похожее на
широко распространенную PPM кодировку. В приведенных ниже полных текстах программ синхроимпульс имеет
фиксированную длинну в то время как стандартный PPM сигнал имеет фиксированную длину пакета, но для большинства
PPM приемников это особого значения не имеет
Вот фрагмент программы для первого канала.
call ki ;Формирование канального импульса bsf Status,RP0 movlw b'00000001' movwf TrisA ; RA0 input bcf Status,RP0 ; clrf PortA ; RA0..RA4 = 0 detect btfsc PortA,0 ;Если С1 разрядился до лог.0 ;пропустить команду goto detect ; bsf Status,RP0 ; movlw b'00000000' ; movwf TrisA ; RA output bcf Status,RP0 ; RA0..RA3=1 movlw b'00001111' movwf PortA
Резисторы R5-R8 нужны для предотвращения короткого замыкания
вывода микроконтроллера на массу в случае если движек потенциометров R1-R4 окажется в крайнем нижнем положении.
Последовательно с R5-R8 можно установить подстроечные резисторы на 1-3 кОм которые будут выполнять роль триммеров
Декодер
Предлагаемый далее декодер предназначен для работы с сервоприводами без электроники типа "Новопрп"
или самодельными

Вот фрагмент программы декодера для первого канала.
call DetectSI ;Ловим синхроимпульс ;********** 1-й канал ************** call ki ;Ждем Канального импульса movlw 08h ;!!!! Завистит от инерционности серво movwf TiMZ ; btfsc PortB,1 ; goto s1 ; btfsc PortB,0 ; goto s1 movlw 1h ;Если двигатель стоит мертвая зона минимальна movwf TiMZ ; s1 bcf PortB,1 ; bcf PortB,0 ; bsf Status,RP0 movlw b'00010001' movwf TrisA ; RA0,RA4 input bcf Status,RP0 ; ;определение направления вращения detect1 btfss PortA,0 ;Пропустить если RC первого канала 1 goto GRB0 ;Вращать в сторону увеличения R btfss PortA,4 ;Пропустить если KI первого канала 1 goto GRB1 ;Вращать в сторону уменьшения R goto detect1 GRB0 call p1 ;Задержка для устранения колебаний btfss PortA,4 ;Если КI=1 перейти на включение сервопривода goto K1_OK ;Если KI=0 сервопривод в нужной точке bsf PortB,0 ;Включить сервопривод в сторону увеличения R btfsc PortA,4 ;Дождаться обнуления goto $-1 ;RA4. goto EndK1 ;завершение обработки 1го канала GRB1 call p1 ;Задержка для устранения колебаний btfss PortA,0 ;Если SI=1 goto K1_OK ;Если SI=0 сервопривод в нужной точке bsf PortB,1 ;включить сервопривод в сторону уменьшения R goto EndK1 K1_OK bcf PortB,0 ;Выключить сервопривод bcf PortB,1 EndK1 bsf Status,RP0 ; movlw b'00010000' ; movwf TrisA ; RA output bcf Status,RP0 ; RA0..RA3=1 movlw b'00001111' movwf PortA ;********** 2-й канал **************(схему приемника на MC3361 можно взять здесь здесь)
Для увеличения входной мощности и избавления от необходимости источника питания со средней точкой сервоусилители можно построить по таким схемам.



Причем в варианте с BA6955, BA6208 резисторы R9-R16 не нужны.
Скачать тексты программ