Необходимо самостоятельно сделать программу - сдвиг частоты: Если на входе X (Гц), то на выходе Y (Гц) 67>45 52>43 40>40 Цель - "обмануть" мозг сплит/системы ДЭО, там три ступени потока воздуха, которые почти ни отличаются, проц (ПО сплита таково, что) поддерживает кол.импульсов 40,43,45 (скорость)поступающих с датчика Холла с мотора вентилятора внутреннего блока, но этого очень мало, короче ДЭО накосячили. причём на другом сплите такая-же картина, так что проблема в ПО На данный момент, ради экспериманта, просто поставил "в разрыв" триггер на 155ТМ2, чисто пополам делит, но так лишь (ессно) максимальная скорость.
Вроде, как я частично программу оформил, но пока всё как-то разрозненно. Мне тяжело понять, как организовать ежесекундный (с выборкой в 1 сек, достаточно) учёт входящей частоты независимо от выходящей частоты? Может Таймер использовать? и каждую секунду считывать его и потом обнулять?
Я сейчас на уровне развития - 1часть Самоучителдя КЕА и всё. На практике (в "железе"), для тренировки написал программу динамической индикации со счётом нажатий на кнопки +1, -1, ну и ещё несколько работ в "железе" тоже для практики. Потому пока что весьма тяжко, маловато знаний.
Пост N: 349
Зарегистрирован: 25.09.09
Откуда: г.Саратов
Рейтинг:
1
Отправлено: 28.01.13 18:47. Заголовок: Правильно ли я понял..
Правильно ли я понял: есть некая коробочка на вывод "вход" которой может приходить одна из трех частот 67, 52, 40 Гц. На выводе "выход" должны выдаваться, соответственно, 45, 43, 40 Гц. Скорость реакции на изменение (анализ "входа", перестройка внутреннего генератора, возможные вычисления....) может быть до 1 сек. Если так, то я бы 1) научился измерять длительность (частоту) входного импульса, чтобы отличать три частоты друг от друга. Затем 2) научился формировать требуемые частоты на выводе "выход". Потом связал эти два процесса тремя сценариями соответствия. Думаю, про измерения импульсов с помощью МК и их формированию написано достаточно. На любом уровне и разными средствами.
А если на входе будет 69 или 23, или вообще 0 ? Что делать ? Или частоты будут идти чётко фиксированными ? И ещё, частота то частотой, форма сигнала какая ?
Отправлено: 28.01.13 22:21. Заголовок: Форма сигнала приход..
Форма сигнала приходит от датчика холла. потому прямоугольник А вот частота на входе (67-40), да, именно будет разная, от 0 до 68 Гц в зависимости от оборотов мотора вентилятора, а обороты зависят от ШИМ управления мотором от процессора, который и "нюхает" эти частоты, вот только поддерживает проц те самые 40-45 Гц, а этого мААло Вот потому и надо "преподнести" процессору эти три "фиктивные", т.е. подменённые частоты 40, 43 и 45 гц., когда мотор выдаст от максимума (67Гц) до минимума(40Гц)
Думаю частота "выборки" достаточно не чаще 1 секунды, но можно и чаще
С нулём на входе (нет оборотов) - команда ветвления в зависимости от флага С, если меньше 10Гц, то на выходе 0Гц и по команда по другому кругу С изменением частот на выходе счётчик с изменяемой переменной Х Эта переменная получается в результате возврата из addwf,PC Пока не могу придумать, как получить стабильный интервал измерения частоты на входе, ведь на выходе частота меняется в зависимости от переменной
Отправлено: 29.01.13 00:12. Заголовок: Очень сумборно. Напи..
Очень сумборно. Напишите, алгоритм хотя бы на уровне структурной схемы, что надо делать. "Процессор" это мк? в Вашем понимание.
"как получить стабильный интервал измерения частоты на входе, ведь на выходе частота меняется в зависимости от переменной "
А какая разница, что меняется частота на входе? У частотомеров она тоже в определенном ( и не маленьком) диапазоне. Считайте импульсы за фиксированный промежуток времени. Или измеряйте период. По нему частоту получите. Если нужна в этом помощь, поможем. Только надо понять четко что надо
Отправлено: 29.01.13 00:44. Заголовок: Вот структурно. htt..
Вот структурно. Вот так надо сделать.
В сплит-системе оборотами мотора внутреннего блока управляет процессор сплита при помощи ШИМ (синхронизированной с 50Гц) При этом проц сплита получает сигнал от датчика Холла в моторе и таким образом поддерживает обороты. В моей ситуации программисты сплита ДЭО заложили три поддерживаемые частоты : 40,43,35 гц, т.е. импульсов в сек.
В этом и есть косяк, что этой разницы в несколько импульсов мало, сплит на всех скоростях еле дует. Вот и появилась задача (пока зима на дворе) практико-материальная. И для мозга труд и толк будет.
В данный момент не могу допереть, как одновременно и выдавать частоту (которая будет меняться) и считать импульсы в 1 сек?
Пост N: 350
Зарегистрирован: 25.09.09
Откуда: г.Саратов
Рейтинг:
1
Отправлено: 29.01.13 07:16. Заголовок: fugi1 пишет: В спли..
fugi1 пишет:
цитата:
В сплит-системе оборотами мотора внутреннего блока управляет процессор сплита при помощи ШИМ (синхронизированной с 50Гц)
"Гусь заговорил громко, горячо и непонятно." - из детской сказки. Не обижайся, но если решил ставить МК, то придется учиться. Возможно несколько больше узнать, чем нужно для задачи. Зажечь светодиод просто, управлять им через МК - совсем другое. Задачу придется решать тебе и доступными тебе средствами. Отрешись для начала от флажков и переменных. Вообрази себя МК. Что ты получаешь извне, что ты можешь как МК и что надо выдать потребителю. Алгоритм работы устройства за тобой. Попробуй без фантазии и лирики описать его коротко и внятно 1)...,2)...3)...Это самая трудная часть задачи, я думаю. Вопросы заданы, советов достаточно. Дело за тобой.
Отправлено: 29.01.13 11:08. Заголовок: Давайте зайдём с дру..
Давайте зайдём с другой стороны. На каком контроллере вы это собираетесь делать? Это к тому, что если на pic84 то это одно а если на контроллере содержащем встроенные модули то это другое.
1) организовать учёт импульсов за 1 сек. подавайте импульсы на RB0, и считайте их по прерываниям.
2) задать соответствие: если на входе X, то на выходе Y Проще некуда. Вычисляемый переход по таблице.
3) выдать на выход количество импульсов Y Взяли из таблицы значение и Y и дёрнули ногой контроллера Y раз.
Пост N: 597
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг:
1
Отправлено: 29.01.13 12:33. Заголовок: Пока описывал igor ..
Пока описывал igor вывел почти тоже самое! А на проц деу от холла меандр идёт, или короткие импульсы? Судя по тому, что после триггера на 155ТМ2 деу адекватно реагирует, можно и меандр. Тогда: 1. задействовать прерывание по фронту, запускаем таймер с предделителем (если не мудрить и использовать внутренний ген. 4Мгц, 1м.ц. 1мкс, *Кд - получим разрешение (точность) определения частоты) и начинаем отсчёт 1 сек. За это время подсчитываем количество фронтов от холла. 2. Сравниваем (вычитаем) с константами 40, 52 и 67. Три сценария а) Х-40= отрицательное число, устанавливаем на выходе частоту меандра равную измеренной, т.е. Х. Если = положительное, то б) вычитаем Х-9 (типа обманываем и ждём пока не увеличатся обороты до 43). Уже этот результат запоминаем. Затем сравниваем (вычитаем) (Х-9)-43= Если отрицательное, то устанавливаем частоту на выходе (Х-9). Проц деу будет получать уже частоту ниже на 9Гц, чем на входе. Если разница положительна, то из полученных (Х-9)вычитаем 13, запоминаем, и на выходе устанавливаем (Х-9)-13. Это и будет 1 цикл программы, равный примерно 1 сек. Выход сделать бит ориентированной командой bsf и bcf через равные промежутки времени, которые будут определяться переменной из регистра, в котором лежит Х или (Х-9) или (Х-9)-13. Как то так я себе представляю. P.S. Все эти вычисления займут малое время, проскочит лишь один период от датчика, что совершенно не страшно. А вот частота на выходе будет меняться 1 раз в секунду.
Отправлено: 29.01.13 13:04. Заголовок: Вот удобная программ..
Использовать два таймера. Один таймер в режиме счетчика запускается при фронте имп. на входе. и выключается при заднем фронте. Получили длительность. х2 Получаем период. 1/T получаем частоту. Но частоту можно не получать и период по сути не нужен. Нам индикация не нужна. Нам достаточно программного компаратора. в котором по длительности ( конкретное значение) сравнить с ранее рассчитанными значениями длительности для нужных частот. В зависимости от полученного результата по таблице мы получаем значение для предустановки 2 таймера, который формирует длительность импульса выходного сигнала. Очень быстрая реакция. Так при частоте 60Гц это 8мс это мы уже измерили входную частоту. И максимум через 100мкс ( при кварце 4МГц) сформировали выходную последовательность
Пост N: 598
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг:
1
Отправлено: 29.01.13 14:18. Заголовок: MAZ пишет: Один тай..
MAZ пишет:
цитата:
Один таймер в режиме счетчика запускается при фронте имп. на входе. и выключается при заднем фронте. Получили длительность. х2 Получаем период. 1/T получаем частоту.
Но это при условии что с холла идёт меандр, автор так и не уточнил. Если это так, то полностью согласен с тобой, и задача (а так же и скорость реакции) упрощается (ускоряется). Если бы их увидеть хотя бы на стандартных частотах 40, 43 и 45 Гц, уже можно сделать вывод о методе измерения частоты, или считать период от фронта к фронту и сравнивать с константами. Но при этом замеры делать через период, в одном замерять, в другом делать вычисления и устанавливать выход. И так по кругу.
Отправлено: 29.01.13 15:12. Заголовок: igor пишет: 1) орга..
igor пишет:
цитата:
1) организовать учёт импульсов за 1 сек. подавайте импульсы на RB0, и считайте их по прерываниям. 2) задать соответствие: если на входе X, то на выходе Y Проще некуда. Вычисляемый переход по таблице. 3) выдать на выход количество импульсов Y Взяли из таблицы значение и Y и дёрнули ногой контроллера Y раз.
пункт 2 и 3 я в принципе так и планировал. Вот с п.1 сложнее
Я сегодня прицепил Tmr0 на вход RA4 и таким образом планировал посчитать импульсы за 1 сек. и потом к этим 0-67Гц привязываться, сейчас понял, что это долго (целая 1 сек) А теперь вижу, что можно гораздо проще: просто считать длительность импульса. Датчик Холла на выходе даёт лог 1 или 0, а скважность зависит от того, как на заводе придумали, но в принципе, я думаю это не важно, длительность импульса всегда будет связана с оборотами. Таким образом можно всего за один импульс измерить частоту (посчитав время от переднего до заднего фронта) Ну, если так нельзя, то прийдётся считать, как SanSanich сказал, от фронта к фронту... Я правильно понимаю?
Вообще желательно сделать не три частоты на выходе, а зависимость частот, с "прилепелнеим" с этим трём опорным, т.е. вообще хорошо, если 40 Гц и ниже частота вход->выход будет идти 1:1
PS. К сожалению "на меандр" посмотреть не могу, осциллографа нет (всё хожу облизуюсь, да цена кусается)
Вообще желательно сделать не три частоты на выходе, а зависимость частот, с "прилепелнеим" с этим трём опорным, т.е. вообще хорошо, если 40 Гц и ниже частота вход->выход будет идти 1:1
Ну я так и написал в алгоритме, а вот далее от исходной частоты просто сдвигаемся на константу, при этом динамика остаётся связанной со входной. Пропорциональность не нужна, растёт на входе, растёт и на выходе, только на константу ниже. А что за МК? Чтоб в протеусе проект сделать!
Отправлено: 29.01.13 18:00. Заголовок: тип мк в заголовке. ..
тип мк в заголовке. Разве сдвиг на константу подойдет? Разве вычисляемый переход не лучше будет? Прийду домой - попробую осмыслить, что значит сдвиг на константу, блин, писать с телефона - извращение.
Пост N: 600
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг:
1
Отправлено: 29.01.13 18:14. Заголовок: Вот что получилось в..
Вот что получилось в расчётах, только МК я предпочёл другой, но это не важно. Вполне подойдёт PIC12F629 по цене в 1$. На вход GP2/INT (5 нога) подаём импульсы с холла. Разрешаем прерывания по переднему фронту и запускаем таймер. Останавливаем его опять же по переднему фронту. Если использовать TMR0 с внутренним тактированием, а МК на 4Мгц, то 1 м.ц. будет 1мкс. Максимальное время подсчёта без переполнения будет 256*256=65536 мкс, или 15.26Гц. Если не критично считать, что до 16Гц (а не 10 Гц как планировалось) будут начальными, с которых начнётся анализ входной частоты и до этого значения на выходе будет 0, то это только на руку. По переполнению TMR0 мы просто будем блокировать выход. Далее значение частоты определяем числом в таймере с шагом в 256 мкс, что весьма не плохо для нашей задачи. Допустим для 40Гц это будет число (1/40)/0.000256=97.66, а для частоты 70Гц (1/70)/0.000256=55.8. Так как числа у нас будут только целые, соответственно 97 и 55. При обратном преобразовании этих значений получаем задержки для полупериода и частоту на выходе. Допустим 90 это 90*128=11520 + 11520 = 43.4Гц, 96 это 96*128*2=24576 мкс или 40.69Гц, 97 это 40.27Гц,98 это 39.86Гц. Если надо очень точно частоту на выходе устанавливать, то по таблице можно, правда значений много будет. А вообще проверка покажет, устойчивы ли будут обороты. Единица в таймере на разной частоте будет иметь разный вес, но если взять нужные нам, 52Гц это (1/52)/0.000256=75, а нам нужна частота на выходе 43Гц, что соответствует числу (1/43)*1000000/256=90.84, округляем до 91. Так как зависимость частоты на входе и числа в таймере у нас обратная, то после значения в таймере 97 мы прибавляем нужную нам разницу 16 (91-75) и получам 97+16=113, выдавая на выходе 1/(113*256/1000000)= 34.5Гц. Дэу соответственно будет подымать обороты до нужных ей 43Гц, что в реале с датчика соответствует 52Гц или 75 в таймере, 75+16=91 для формирования выхода. Тоже самое для второго порога. Надо проверить в протеусе и в железе, датчик у меня есть из вентилятора, благодаря MAZу!!!
Вы написали, а мне всё это надо "сквозь себя" пропустить, чтобы усвоить, потому и переписываю. как вижу и понял я.
цитата:
Надо проверить в протеусе и в
Ой-ой-ой :-) вы так за меня всё домашнее задание сделаете
А теперь, что я понял, проверьте пжлста... 1) 65536 мкс это максимальная длительность ОДНОГО импульса, которую мы сможем измерить и соответственно самая минимальная частота?
2) Таймер, как я понял через предделитель? Значит в итоге в таймере будет лежать число до 255? при переполнении можем выдавать на ВЫХОД команду НОЛЬ? (с "блокировкой" дальнейшего счёта) считая, что оборотов нет.
3) Может тогда полученное в таймере число использовать для addwf,PC? Правда прийдётся много строк писать (или прикинуть минимальную длительность и потом перед переходом в ПП addwf,PC отминусовывать это число от таймера?) Я не знаю, как применять таблицу.
4) Если использовать addwf,PC, то оттуда мы можем получить (вписать там) любую константу, которую и можно использовать для формирования частоты выхода
В таком случае не будет порогов, за исключением ухода в ПП "ноль оборотов" при переполнении таймера.
Завтра на работе вычислю сколько импульсов на один оборот (хотя-бы +/-) и может и скважность. Для датчика холла динамика ведь значения не имеет.
А вообще мне самому надо пытаться допереть как такую программу писать. Буду пока этим заниматься.
Остался вопрос: может ли таймер работать параллельно с основной программой или он должен быть включён в общее кольцо (в общий. полный цикл)?
Отправлено: 29.01.13 19:04. Заголовок: датчик у меня есть и..
датчик у меня есть из вентилятора, благодаря MAZу Не надо на меня наговаривать. Думаю что с датчика Холла будет меандр. Частота относительно высока. Фронты по длительности терпимые. И предусмотреть проверку,что длительность импульса не может быть больше какого то значения. А то будет 0,005Гц и измерять нечего 1. пункт 65535 там еще 0 надо учитывать. Переведите FFFF в 10-ю. После этого таймер переполнится. И никто не мешает в какой то счетчик + 1 и считать дальше до переполнения. Так что максимально, можно посчитать много.
2) не понял в чем вопрос. конечно по переполнения таймера поднимается флаг или происходит прерывание (если включено) а дальше что душе угодно вкл или выкл.
3) для addwf,PC? Это я догадываюсь название вычисляемого перехода (ВП)? Правда прийдётся много строк писать вам их разве жалко? Строк не сильно много. Главное определиться, как привязать к числам от 0 до N входную длительность. И при переходе по ВП на это число вернуть в программу новое значение. 4) Это надо обдумать и рассчитать на бумаге. Про пороги. Ну например. Мы получаем частоту 40 а порог 45. если меньше порога, присваиваемым число 0 и уходим в ВП где грузим в прогу константу. Как только больше 45 , присваиваемым число 1 и уходим в ВП где грузим в прогу новую константу . Вот и таблица простенькая. Это типа методика. Но с ней интересные вещи можно делать.
Остался вопрос: Таймер работает независимо от программы. PS. 629 - можно купить в Тритоне. 35р. Ну и за 60( пачка сигарет) на мой взгляд терпимо
1/0.065535=15Гц Частота ниже не требуется, потому, думаю заморачиваться с +1 смысла нет, лучше переполнение таймера привязать к отсутствию импульсов, я в посте выше об этом писал. MAZ пишет:
цитата:
Правда прийдётся много строк писать вам их разве жалко?
вот и я о том... что не жалко.. зато можно каждой сторочке - свою частоту.
Отправлено: 29.01.13 19:35. Заголовок: А программка поможет..
А программка поможет? потому как, как ВП оформить это не проблема, я делал
Мне кажеться проще много строк написать (впрочем действительно не так и много) для разных частот
изначально надо измерить минимальную длительность импульса (на максимальных оборотах) или просто вычислить. Пример: допустим измерили и получили минимальную длительность 135 (берём запас 15 = 150) Значи если: 1) получаем в таймере 160, то 160 минус 150 = 10, значит копируем 10 в W и идём в ВП в которой максимальная частота 2) получаем в таймере 250, то 250 минус 150 = 100, movfw .100 -> call ВП (на строчку 100) в которой вписана минимальная частота
ВП это и есть таблица или нет?
цитата:
Разрешаем прерывания по переднему фронту и запускаем таймер. Останавливаем его опять же по переднему фронту.
как это реализовать? и ещё, ну написал я прогу, куда и каким образом выкладывать, чтобы показать?
цитата: Разрешаем прерывания по переднему фронту и запускаем таймер. Останавливаем его опять же по переднему фронту. как это реализовать? и ещё, ну написал я прогу, куда и каким образом выкладывать, чтобы показать?
Самому интересно! Кто кодом может кинуть?!!! Чтоб вставить асм надо нажать 7-ю слева кнопку с циферками 123 и вставить
123 456 789
А зачем эти ВП? Константами мне кажется проще, но решать автору
Отправлено: 29.01.13 22:15. Заголовок: Нет такой команды. Н..
Нет такой команды. Но придумать что нибудь можно. Хотя лучше воспользоваться TMR1. Если TMR0. Он тактируется тактовыми импульсами мк или внешними. Я думаю если переключить в режим внешнего тактирования. А в нужный момент в режим внутреннего, то это и будет его включение и выключение. Зачем использовать предделитель, который не доступен для чтения? Вам же нужна информация. Я намекал, что после прерывания (255) +1 к программному счетчику а он может быть и двухбайтный. вот Вам и предделитель. Да ВП на амсе это работа с таблицами
Пост N: 17
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 29.01.13 22:27. Заголовок: О как... Придумать? ..
О как... Придумать? Я например придумал так:
при первом фронте импульса на входе INT 1. вход в ПП прерывания 2. ветвление 3. clrf Tmr0 4. return
при следующем фронте (при прерывании) 1. вход в ПП прерывания 2. ветвление 3. movf Tmr0,W (получили результат в W для использования) 4. return ******************* предделитель позволит не задействовать программу и получать результат, при этом 255 градаций более чем достаточно ***************** Я учился на 84 ПИКе (по КЕА), он же есть в распоряжении для экспериментов, но в нём лишь один Tmr0
Сижу. вот кумекаю с моими скудными познаниями наперевес :-)
Отправлено: 29.01.13 22:40. Заголовок: Нормально. А что за ..
Нормально. А что за ветвление? 1. Настраиваем прерывание от INT (по переднему фронту) и от TMR0 по переполнению
2 В обработчике прерывания Если от INT: - проверить какой флаг прерывания по переднему фронту или по заднему - если по переднему, clrf TMR0; clrf счетчик; настроить прерывание по заднему - если по заднему то скопировать TMR0 в буфер TMR0, счетчик скопировать в буфер счетчика, настроить прерывание по переднему. - сбросить флаг прерывания от INT Если от TMR0: - +1 к счетчику ( можно двухбайтному) - сбросить флаг прерывания TMR0 retfie Пока идет счет следующей длительности обрабатываем данные из буфер TMR0 и буфер счетчика по времени это целый период 12F629 встроенный генератор 4МГц (кварц не нужен) есть и TMR1. 8 выводов
Пост N: 18
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 29.01.13 23:08. Заголовок: В принципе я уже поч..
В принципе я уже почти дописал, завтра мож кусок кода ПП прерывания покажу, доделать надо.. Спокойной ночи! И спасибо за помощь! *************** не терпиться ;-)
Int movwf W_Temp ; Скопировать содержимое регистра W в регистр W_Temp. movf Status,W ; Скопировать содержимое регистра Status в регистр W. movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.
btfsc Zm,0 ; проверка состояния нулевого байта рег. Zm и выбор двух сцен. goto Int_Out
Int_Out bcf Zm,0 ; ноль в нулевой регистр Zm movfw Tmr0 ; копируем содержимое таймера (сколько он там насчитал?) movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП) clrf Tmr0 ; ещё раз сбрасываем таймер (чтоб не переполнился)
;****************************************** ; Возврат из ПП прерывания ;**********************************************
EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.
movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp в регистр W. movwf Status ; Скопировать содержимое регистра W в регистр Status. swapf W_Temp,F ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в нем же. swapf W_Temp,W ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в регистре W. retfie ; Возврат из прерывания по стеку.
пояснения: Zm,0 используется для переключения между двумя сценариями, не знаю, мож есть способ лучше, этот я надумал сам В результате, начало отсчёта происходит при первом прерывании, окончания счёта нет, есть снятие результата при втором прерывании. Надо в МПЛабе погонять посмотреть на регистр Tmr0 (если получиться ;-))
Отправлено: 30.01.13 00:23. Заголовок: Мне кажется я Вам лу..
Мне кажется я Вам лучше выше предложил вариант. Во первых, непрерывно. Во вторых, всегда измеряем импульс.
movfw Tmr0 ; копируем содержимое таймера (сколько он там насчитал?) movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП) Вам разве хватит длительность 255мкс? movfw Tmr0 лучше записывать так movf TMR0,W более явная запись
Пост N: 602
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг:
1
Отправлено: 30.01.13 01:31. Заголовок: MAZ пишет: movwf Co..
MAZ пишет:
цитата:
movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП) Вам разве хватит длительность 255мкс?
Это если с предделителем 256 Сань, а если там не меандр? Как счётчик заставить считать от фронта к фронту? Что если запустить счётчик и пусть считает. Настроить прерывание по переднему фронту, уйти в прерывание, считать данные счётчика и флага переполнения, обнулить счётчик и флаги переполнений, отсчёт пошёл. Сброс прерываний и опять настройка на передний фронт. Далее математика и тд, настройка выхода.
Пост N: 20
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 30.01.13 09:55. Заголовок: тогда выходит где-то..
тогда выходит где-то так...
Int movwf W_Temp ; Скопировать содержимое регистра W в регистр W_Temp. movf Status,W ; Скопировать содержимое регистра Status в регистр W. movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.
btfss IntCon,2 ; проверяем бит переполнения таймера goto NoPPT ; если нет, то обходим след. 4 строки
clrf Const_Y ; очищаем регистр bcf IntCon,2 ; сбрасуем флаг переполнения таймера clrf Tmr0 ; обнуляем таймер goto EndInt ; обходим следующие неск. строк - идём на выход
NoPPT movf Tmr0,W ; копируем содержимое таймера (сколько он там насчитал?) movwf Const_Y ; вписуем во временный регистр (оттуда потом в ВП) clrf Tmr0 ; обнуляем таймер
EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.
movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp в регистр W. movwf Status ; Скопировать содержимое регистра W в регистр Status. swapf W_Temp,F ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в нем же. swapf W_Temp,W ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в регистре W. retfie ; Возврат из прерывания по стеку.
Пост N: 603
Зарегистрирован: 16.03.09
Откуда: Родина, Севастополь
Рейтинг:
1
Отправлено: 30.01.13 10:11. Заголовок: fugi1 пишет: В обще..
fugi1 пишет:
цитата:
В общем проверил на моторе: там чёткий меандр
А как без осцела узнали? Если это так, то проще будет как Александр (MAZ) предложил. Но универсальнее всё же период мерить. Если с таблицей, то можно вообще на выходе фиксированные частоты получать, Гц в Гц. В протеусе будете модулировать? Интересно будет пощупать! Но мне ещё покоя не даёт вариант с вычитанием, но это уже потом попробую как альтернативу. Ждём пилотного листинга на тест-драйв!
Пост N: 21
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 30.01.13 10:23. Заголовок: без осцила повесил с..
без осцила повесил светодиод через резюк на выход мотора и считал по лопастям вентилятора их там 30 штук, точности достаточно, 5 лопастей=один полупериод.
если применять вышенаписанный код, то на весь процесс анализа уйдёт грубо говоря 16 мкс. с которыми можно не считаться
Отправлено: 30.01.13 11:25. Заголовок: это MAZ ? тут все Са..
fugi1 пишет:
цитата:
это MAZ ? тут все Сани?
Есть еще и Сан Санычи
Давайте пока опустим стандартную процедуру сохранения и восстановления в прерывании. По тексту. Мне кажется я хорошо написал типа алгоритма выше. Ну ладно напишу обработчик. Еще раз напомню. Мы используем TMR0 и не используем предделитель. Потому что, предделитель не доступен для чтения. Поэтому используем дополнительный регистр chethik. в котором считаем сколько было переполнений TMR0 во время счета длительности импульса. Таки образом мы можем посчитать грубо длительность 65мс или до 7,6Гц . Пусть у нас минимальная частота (контроль) 40Гц. 12,5мс Что даже очень с запасом. Будем использовать: OPTION_REG, INTEDG ; разрешаем от INT 1-прерывание по переднему фронту 0- по заднему INTCON,T0IF ; флаг прерывания (переполнения) от TMR0 INTCON,INTF ; флаг прерывания от INT
org 0x04 ; вектор прерывания ; стандартная процедура сохранения ; проверяем от чего прерывание. btfsc INTCON,INTF ; прерывание от INT? call obrab_INT ; да обрабатываем прерывание от INT btfsc INTCON,T0IF ; прерывание (переполнение) от TMR0? call obrab_TMR0 ; да обрабатываем прерывание от TMR0 ; стандартная процедура восстановления retfie
obrab_INT ; обрабатываем прерывание от INT
btfsc OPTION_REG, INTEDG ;1-прерывание по переднему фронту 0- по заднему goto n1 ; если 1 поставить INTEDG в 0 ( пошло измерение длительности) bsf OPTION_REG, INTEDG ; если 0 поставить INTEDG в 1 (окончили измерять длительность) movf TMR0,W ;копируем TMR0 в byf_TMR0 movwf byf_TMR0 movf chethik,W ;копируем chethik в byf_chethik movwf byf_chethik bcf INTCON,INTF return
obrab_TMR0 ; обрабатываем прерывание от TMR0 incf chethik bcf INTCON,T0IF ; флаг прерывания (переполнения) от TMR0 return
(можно сделать еще проверку переполнения chethik)
В результате мы получаем, через время равное периоду, длительность импульса (при кварце 4МГц уже в мкс. ) пропорциональную частоте в регистрах byf_chethik( старший)byf_TMR0 (младший)
Если ни чего не забыл. Ну и программа проверяет число в byf_chethik; byf_TMR0 в каком оно диапазоне от заранее рассчитанного.
Пост N: 22
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 30.01.13 11:58. Заголовок: брр.. надо сидеть вт..
брр.. надо сидеть втыкать... (в смысле мне)
а про предделитель... его чтение и не требуется, пусть себе делит, а использовать лишь результат деления, т.е. результат в Tmr0, такой точности вполне хватит
а про предделитель... его чтение и не требуется, пусть себе делит, а использовать лишь результат деления, т.е. результат в Tmr0
Мысли сходятся! А вообще приведённый пример MAZ более правильный и точный. При желании можно очень точно вычислить период, с точностью 1мкс. Ну а регистров хватает, жрать не просят. Да и далее уже более гибко частоту на выходе можно устанавливать. Пора инициализировать МК и запускать проект, чтоб куски кода не расползлись! Кстати, сторожевой стоит использовать? Вот там предделитель может и понадобиться.
миллисекунд. Сторожевой таймер в принципе не нужен. На нём Корабельников Е. очень заострил внимание. Якобы без него-кранты. Ничего подобного. Если программа написана правильно то она и сбоить не должна. А если нет, то и WDT не поможет.
Пост N: 24
Зарегистрирован: 28.01.13
Откуда: Россия, Белореченск
Рейтинг:
0
Отправлено: 30.01.13 14:13. Заголовок: В принципе, я уже на..
В принципе, я уже начал, потому попробую сделать сперва так, а потом можно и другие варианты попробовать Получилось примерно так: (определение регистров сюда не включал, и так много) осталось Таблицу рассчитать и дописать
================== ============ С Т А Р Т =============== ========================= ;=============================================================================================
Start clrf IntCon ; Запрет всех прерываний. clrf Tmr0 ; Сброс в 0 содержимого регистра TMR0.
bsf Status,5 ; банк 1
movlw b'11010111' ; Предделитель 256 перед TMR0 movwf OptionR ; внутренний такт CLKOUT ; прерывание INT по переднему фронту
movlw b'00000001' movwf TrisB ; определение выходы и вход прерываний RNB0/INT
bcf Status,5 ; банк 0
movlw b'10010000' movwf IntCon ; разрешение прерываний по RB0/INT
;************************************************************************** ; ; получение константы для задания частоты на выходе ; ;***************************************************************************
Cicle bsf Status,0 ; в единицу бит С регистра Статус movlw .57 ; subwf Const_Y,W ; константу в регистр для ВП
btfss Status,0 ; проверяем бит С, если 0, то след.строка clrf W ; очистка аккумулятора call Table ; переход в ВП
Int movwf W_Temp ; Скопировать содержимое регистра W в регистр W_Temp. movf Status,W ; Скопировать содержимое регистра Status в регистр W. movwf Stat_Temp ; Скопировать содержимое регистра W в регистр Stat_Temp.
btfss IntCon,2 ; проверяем бит переполнения таймера goto NoPPT ; если нет, то обходим след. 4 строки
movlw .255 movwf Const_Y ; вписываем максимальное число bcf IntCon,2 ; сбрасуем флаг переполнения таймера clrf Tmr0 ; обнуляем таймер goto EndInt ; обходим следующие неск. строк - идём на выход
NoPPT movfw Tmr0 ; копируем содержимое таймера (сколько он там насчитал?) movwf Const_Y ; вписуем во временный регистр clrf Tmr0 ; обнуляем таймер
EndInt bcf IntCon,1 ; Сброс флага прерывания по INT.
movf Stat_Temp,W ; Скопировать содержимое регистра Stat_Temp в регистр W. movwf Status ; Скопировать содержимое регистра W в регистр Status. swapf W_Temp,F ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в нем же. swapf W_Temp,W ; Поменять местами старший и младший полубайты регистра W_Temp ; с сохранением результата операции в регистре W. retfie ; Возврат из прерывания по стеку.
Подправил программу,(снова код выкладывать не буду, много места занимает) завтра буду проверять, сегдоня устал и ещё дела есть, и так много времени убил Спасибо Вам, может я и не по Вашему сделал, но благодаря Вам понял многие отправные точки и алгоритм работы, т.е. камни преткновения разрушены ;-) Прогнал в МПЛабе пошагово, вроде правильно, а железо затра покажет. Таблицу тоже сделал, ..даа не такая уж и простая эта таблица, много букф получилось. Ещё раз спасибо!
Все даты в формате GMT
3 час. Хитов сегодня: 8
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет