Декодер ШИМ на Atmel AVR

Делаю одну поделочку, хотел помощи попросить чтобы ненароком не изобрести велосипед.
Может у кого есть пример кода (желательно асм) как декодировать два-три одновременно поступающих ШИМ сигнала на контроллер?
В инете куча примеров как генерировать ШИМ, но не нашел ни одного как этот ШИМ распознавать.
В зависимости от сигнала контроллер будет выполнять несколько действий.

это для RC машинки.

[Сообщение изменено пользователем 22.04.2011 19:35]
0
dmq
Ага, тут все знают алгоритм именно вашей радиоуправляемой машинки.
МК может только с помощью АЦП или логических уровней получать данные ну а дальше уже дело программиста что с этим делать...
0 / 3
0хCB
шим с приемника идет, после «декодера» импульсы с длительностью от 800 до 1500мкс и периодом 20мс? или напрямую?
0
0хCB
нда, глянул тиньку 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*

[Сообщение изменено пользователем 20.04.2011 12:45]
1 / 0
timsa™
спасибо.
это я почитаю повникаю...

сигналы идут по разным проводам, я сказал что их три для того чтобы сразу сориентироваться сколько надо таймеров.

если тинька такая унылая, то не проблема переиграть на более другой... ту же мегу 16
0
0хCB
таймера в любом случае одного хватит.
а тинька не то что бы унылее меги, у нее таймера нормального нету просто, но + в том что есть прерывание по смене состояния пинов, чего у меги нету. вобщем везде +/- есть
0
Про это есть аппнот AVR135 atmel.com/dyn/resources/prod_documents/doc8014.pdf

И код к нему: http://www.atmel.com/dyn/resources/prod_documents/...
0
0хCB
От пользователя ITihonov
Про это есть аппнот AVR135

ага. вот был бы на тиньке еще Timer Capture Unit цены б ему не было :-D
0
timsa™
а можно ШИМ завести через RC цепочку на АЦП и тупо мерить напряжение?
0
Можно. Но это пошло.
0
0хCB
можно, тока но нафига? + период ппм не факт что постоянен, плыть будет
0
timsa™
в моей задаче период постоянен - 50 герц.
длительность импульса меняется от 10 до 20мс
0
От пользователя timsa™
в моей задаче период постоянен - 50 герц.

Дыть тогда можно тупо длительность щетать таймером.
0
0хCB
От пользователя timsa™
в моей задаче период постоянен - 50 герц.
длительность импульса меняется от 10 до 20мс

эт как, один канал шо ли?
0
От пользователя FGV
ага. вот был бы на тиньке еще Timer Capture Unit цены б ему не было :-D


дык среди tiny дофига с Input Capture. хотя я ушел на PIC и STM32. :-)
0
0хCB
От пользователя ITihonov
дык среди tiny дофига с Input Capture.

хз. на 8-ми ногих типа 1х нет ни на одной :-D
да и вобще у тинек есть тока у одной: ATtiny2313, у которой 16ти битный таймер имеется

[Сообщение изменено пользователем 20.04.2011 22:22]
0
Мoзгoпрaв и мoзгoвeд©
От пользователя ITihonov
хотя я ушел на PIC и STM32.

А STM8 щупали?
0
timsa™
От пользователя FGV
ATtiny2313

о! у меня как раз такая валяется :-)


От пользователя FGV
эт как, один канал шо ли?

да.
задача то простейшая, вот только я с института с контроллерами дела не имел
0
0хCB
бррррр.
чего то не понимаю видимо. канал один, а провода нафига три тогда?
0
От пользователя FGV
бррррр.
чего то не понимаю видимо. канал один, а провода нафига три тогда?

:-D петание, граунд, сигнал :lol:

От пользователя timsa™
если тинька такая унылая, то не проблема переиграть на более другой... ту же мегу 16

если про AVR...
то зачем
От пользователя timsa™
(желательно асм)

?

avr-gcc, Си. намного понятнее, по-моему... чем писать на асме...
0
От пользователя FGV
хз. на 8-ми ногих типа 1х нет ни на одной :-D
да и вобще у тинек есть тока у одной: ATtiny2313, у которой 16ти битный таймер имеется


да нифига, он есть у:

ATtiny2313
ATtiny24
ATtiny44
ATtiny84
ATtiny261
ATtiny461
ATtiny861
ATtiny48
ATtiny88
ATtiny24A
ATtiny44A
ATtiny10
ATtiny4
ATtiny5
ATtiny9
ATtiny261A
ATtiny461A
ATtiny861A
ATtiny2313A
ATtiny4313
ATtiny167
ATtiny87
ATtiny20
ATtiny40
0
От пользователя Мозгоправ и мозговед
А STM8 щупали?


нет, я вобще планировал не PIC16F делать, но случайно увидал даташит на STM32F102/103 и он я вам скажу, по встроенной переферии и цене гораздо больше устраивает. :-)

а если надо что-то мелкое, то мне нравится pic10f200. опять же - ценой.

от avr стало подташнивать после сношания с usb в atmega32u4. даташит - полный шит. ну и с перефереией там херня какая-то, например долбанутое ограничение на конфигурацию мультиплексора в дифференциальном режиме с усилителем.

[Сообщение изменено пользователем 21.04.2011 01:22]
0
0хCB
От пользователя ITihonov
да нифига, он есть у:
....

ого, сколько их развелось :-)
тока у тини 10 icp помоему всетаки нету
0
0хCB
От пользователя mainroot
петание, граунд, сигнал

ага, это все три шим модулированых сигнала? :-)
вобщем пока неясно чего треба и на чем хотят ваять толи тиня13 толи 2313...
0
timsa™
От пользователя FGV
чего то не понимаю видимо. канал один, а провода нафига три тогда?

три канала.
газ, руль, коробка скоростей
но идут каждый по своему отдельному проводку.

От пользователя mainroot

avr-gcc, Си. намного понятнее, по-моему... чем писать на асме...

просто я не пробовал работать с прерываниями на С.
щас как раз изучаю этот момент. может действительно будет проще.


От пользователя FGV
2313

эта есть в наличии

От пользователя FGV
тиня13

эту можно купить

отлаживать вообще планирую на mega16 - есть на демо плате
0
Авторизуйтесь, чтобы принять участие в дискуссии.