8 канальный кодеры
к примеру на 16F877 - там обьема памяти должно хватить
и на счет не думая - подскажите как !
Не думая, это если язык знать. Так что изучайте ассемблер и делайте не думая… А в железе, готовое, каждый попробовать сможет…
и на счет не думая - подскажите как ! ( аналогия только с пивом 😃
Кусок из мач.с того проекта:
read_adc(Ailerons);
AD[0]=ADCW-ADmid[0];
read_adc(Throttle);
AD[2]=ADCW-ADmid[2];
read_adc(Rudder);
AD[3]=ADCW-ADmid[3];
read_adc(Elevator);
AD[1]=ADCW-ADmid[1];
read_adc(Rpop_contr);
AD[4]=ADCW-ADmid[4];
read_adc(Prop_contr_2); - добавили не думая, по аналогии с
AD[5]=ADCW-ADmid[4]; - с предъидущей строкой
Конечно надо по аналогии продублировать все переменные и константы для нового канала. Делается элементарно, компилишь, где ошибка выскакивает - добавляешь, или увеличиваешь размерность массива. Собсвтенно, если резисторы одинаковые и установлены одинаково - можно забить на нормализацию для доп. каналов и использовать значения средней точки и коэфициентов от “проп_контрол”. Для простоты так и поступим. Константу проп_контр_2 - опредеили в деф.с файле, аналогично проп_контр. Как не трудно догадаться, ее значение определяет вход аналого-цифрового преобразователя, с которого мы будем считывать напряжение с переменного резистора-крутилки.
read_adc(Batt); - если надо именно 8 проп. крутилок - то батарейку мерять останется нечем… что касается нее тогда - удалить.
U_bat=ADCW;
U_bat=U_bat*2;
if(!SW1)input[4]=-750; (*) - вот тут дискретные каналы. типа:если выключен
else input[4]=750; св1, то инпут(4) в минимальное положение, в противном случае - в максимальное. Выбираем канал, который из дискрета переводим в пропорциональный, и для этого канала удаляем такую строчку.
я выбрал для примера инпут(6) и удалил то, что касалось его.
…
for (i=0; i<4; i++)
{
if (AD[i]>0) input[i]=AD[i]*Kmax[i]/10;
else input[i]=AD[i]*Kmin[i]/10;
}
input[8]=input[contr[8].from[FLY_MODE]];
input[9]=input[contr[9].from[FLY_MODE]];
if (AD[5]>0) input[6]=AD[5]*Kmax[4]/10; - ну и тут вставили по аналогии, с
else input[6]=AD[5]*Kmin[4]/10; - тем что было ниже…
Т.е. переменную инпут() мы меняем не как было выше (*) - в зависимости от переключателя - дискретно в -750 или в +750, а пропорционально от напряжения, считанного при помощи ацп с “крутилки”. Кмин и Кмах - угловые коэфициенты пропорциональности, расчитываются при калибровке, их можно взять такие же как и в канале проп_конрол, если конструктив одинаков, что я и сделал в примере.
if (AD[4]>0) input[7]=AD[4]*Kmax[4]/10;
else input[7]=AD[4]*Kmin[4]/10;
Ну вот, вроде и получилось, не думая практически, как и обещал. Только копи-паст, и вроде бы все. Компилим, видим огибки - увеличиваем размерность массива ад(), ну может еще где в цыклах “до скольки шагать”… вроде бы тривиально.
Кусок из мач.с того проекта:
Ну вот, вроде и получилось, не думая практически, как и обещал.
Насчёт “не думая”- это идея богатая 😃
А если всё таки подумать: сигнал с этого кодера- куда приходит?
Правильно, на декодер!
А ему, проклятому- нужна определённая длительность пачки да ещё, как не прискорбно- определённая пауза (для сброса в “0” )
Так вот, если одно из условий не будет соблюдено- декодер ничего не поймёт 😦
И если посчитать времена: 8 импульсов по 2,1 мСек (мах), семь пауз- по 0,3мСек= 16,8+2,1=18,9мСек
При ширине пачки (желательной) 20 мСек, синхропауза- где?
Или я чего то не понимаю?
Ширина пачки может должна быть 25 мс. Можно и больше, скажем 27мс. Так что хватает.
Ширина пачки может должна быть 25 мс. Можно и больше, скажем 27мс. Так что хватает.
Дело в том, что в обычных (с декодером на CD 4015) приёмниках цепь формирования импульса сброса настроена на 20 мС.
И в принципе, сделать в РРМ 8 команд с расчётом на любой приёмник- нельзя. Максимум что получается (для надёжной работы декодера)-7 команд.
Просто длины пачки не хватает для импульса сброса.
Так что, 27 мС можно сделать, но декодер придётся подстраивать под данное время 😦
Теорию вопроса можно почитать , набрав в Яндексе “школа дядьки глайдера”
Насчёт “не думая”- это идея богатая 😃
А если всё таки подумать: сигнал с этого кодера- куда приходит?
Очевидно тудаже, куда и с тех двух кодеров, которые топикстартер выложил выше. И то, что он выложил - мотивировал тем, что ему надо именно 8, а в том, что есть “от фокуса”- всего 5. Причем он проявил интерес, как почти не думая можно поменять дискретные каналы на пропорциональные. Заметьте, функционал кодера не менялся, кодер от фокуса подразумевает 8 каналов, и не вижу разницы, чем заполняется регистр таймера - константами в зависимости от положения переключателя или переменной, зависимой от напряжения на входе АЦП.
Правильно, на декодер!
А ему, проклятому- нужна определённая длительность пачки да ещё, как не прискорбно- определённая пауза (для сброса в “0” )
Ну сохраните длительность синхропаузы то, чтоб конденцатор в цепи сброса 4017 зарядиться успел! Длительность пачки классическому ппм декодеру на 4017 вобще не важна! Важно условие, чтоб в паузе между канальными импульсами конденцатор в цепи сброса не успевал заряжаться до напряжения логической “1”. От того, сколько каналов в пачке - 3 или 8 - счетчику абсолютно пофигу, хоть разрядность увеличивайте и 16, 24,32 и тд делайте! Паузу только увеличьте, чтоб его сбрасывать, и радуйтесь!
И вобще, тут восьмиканальные кодеры обсуждают, а не проблемы сброса счетчика 4017!
Все правильно !
Я указанные кодеры пробовал на двух приемниках - E Fly и Euro - на обоих никакой подстройки не требовалось только вывел из регистра еще два канала ( было на 6 )
Все 8 четко определяются
Кстати есть кодер и на 10 каналов на 16Ф88 - и к удивлению тоже работает
Так что, 27 мС можно сделать, но декодер придётся подстраивать под данное время 😦
Ничего подстраивать не нужно. Проверенно.
Теорию вопроса можно почитать , набрав в Яндексе “школа дядьки глайдера”
Знаю я твоего дядьку Глайдера. Пробовал повторять его схемы. Работают, но криво. На проце получается намного стабильнее.
Если честно его схемы уже давно морально устарели…
Это точно !