Делаю одну поделочку, хотел помощи попросить чтобы ненароком не изобрести велосипед.
Может у кого есть пример кода (желательно асм) как декодировать два-три одновременно поступающих ШИМ сигнала на контроллер?
В инете куча примеров как генерировать ШИМ, но не нашел ни одного как этот
ШИМ распознавать.
В зависимости от сигнала контроллер будет выполнять несколько действий.
Ага, тут все знают алгоритм именно вашей радиоуправляемой машинки.
МК может только с помощью АЦП или логических уровней получать данные ну а дальше уже дело программиста что с этим делать...
нда, глянул тиньку 13-ю. там один 8-ми разрядный таймер, фронты ловить придется считывая значения таймера влет по прерыванию int0.
в меге16 тоже самое изящно реализуется через захват фронтов на таймере1 - тупо втыкаешь ppcm сигнал в icp0/1 пускаешь таймер и сидишь считываешь данные с
регистров по прерываниям.
хотя у тини есть прерывание по смене состояния линий. Варианты алгоритмов:
Таймер 0 - нормальный режим (счет от 0 до 255), по переполнению в прерывании инкрементируем переменную TimeH
1. вариант выхода с декодера шим подцеплены к разным
ногам тиньки - импульсы разведены по каналам, в этом случае:
ловим прерывания по изменению состояния линий PCIE (Pin Change Interrupt Enable).
алгоритм обработчика прерывания:
1) считываем влет таймер0 и TimeH: Time1=TimeH.TCNT0
2) расчитываем длительность импульса:
T=Time1-Time0
если T<0, то T=-T;
3) сохраняем длительность импульса T в буф. каналов (номер канала определяется кодом EXCODE)
4) Time0=Time1;
5) EXCODE=PINB&(маска каналов)
6) выход
2. вариант выхода на прямую с приемника - все импульсы в
одном проводе, воткнуты в int в этом случае:
ловим прерывания по фронту(или спаду, хз чего на декодер приходит) на INT0 External Interrupt Request 0.
алгоритм обработчика прерывания:
1) считываем влет таймер0 и TimeH: Time1=TimeH.TCNT0
2) расчитываем длительность
импульса:
T=Time1-Time0
если T<0, то T=-T;
3) если T>2000мкс (обнаружена пауза - конец передачи)
то: номер канала=0
иначе: сохраняем T в буф. каналов, номер канала++
4) Time0=Time1;
6) выход
в итоге в массиве каналов
получаем длительности импульсов с ценой мл. разряда = тактовому периоду таймера 0.
примечание: период ppm сигнала (20мс) должен полностью укладываться в 256*(2^[разрядность TimeH]), иначе длительности импульсов могут считаться с ошибкой.
ps вариант 1 делал на меге16
через захват фронтов/спадов на пине icp*, только при этом дополнительно каналы пришлось цеплять через диоды по монтажному или к icp*
таймера в любом случае одного хватит.
а тинька не то что бы унылее меги, у нее таймера нормального нету просто, но + в том что есть прерывание по смене состояния пинов, чего у меги нету. вобщем везде +/- есть
нет, я вобще планировал не PIC16F делать, но случайно увидал даташит на STM32F102/103 и он я вам скажу, по встроенной переферии и цене гораздо больше устраивает. :-)
а если надо что-то мелкое, то
мне нравится pic10f200. опять же - ценой.
от avr стало подташнивать после сношания с usb в atmega32u4. даташит - полный шит. ну и с перефереией там херня какая-то, например долбанутое ограничение на конфигурацию мультиплексора в дифференциальном режиме с усилителем.
Внимание! сейчас Вы не авторизованы и не можете подавать сообщения как зарегистрированный пользователь.
Чтобы авторизоваться, нажмите на эту ссылку (после авторизации вы вернетесь на
эту же страницу)