Декодер ШИМ на Atmel AVR
t
timsa™
Делаю одну поделочку, хотел помощи попросить чтобы ненароком не изобрести велосипед.
Может у кого есть пример кода (желательно асм) как декодировать два-три одновременно поступающих ШИМ сигнала на контроллер?
В инете куча примеров как генерировать ШИМ, но не нашел ни одного как этот ШИМ распознавать.
В зависимости от сигнала контроллер будет выполнять несколько действий.
это для RC машинки.
[Сообщение изменено пользователем 22.04.2011 19:35]
Может у кого есть пример кода (желательно асм) как декодировать два-три одновременно поступающих ШИМ сигнала на контроллер?
В инете куча примеров как генерировать ШИМ, но не нашел ни одного как этот ШИМ распознавать.
В зависимости от сигнала контроллер будет выполнять несколько действий.
это для RC машинки.
[Сообщение изменено пользователем 22.04.2011 19:35]
d
dmq
Ага, тут все знают алгоритм именно вашей радиоуправляемой машинки.
МК может только с помощью АЦП или логических уровней получать данные ну а дальше уже дело программиста что с этим делать...
МК может только с помощью АЦП или логических уровней получать данные ну а дальше уже дело программиста что с этим делать...
х
0хCB
шим с приемника идет, после «декодера» импульсы с длительностью от 800 до 1500мкс и периодом 20мс? или напрямую?
х
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]
в меге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]
t
timsa™
спасибо.
это я почитаю повникаю...
сигналы идут по разным проводам, я сказал что их три для того чтобы сразу сориентироваться сколько надо таймеров.
если тинька такая унылая, то не проблема переиграть на более другой... ту же мегу 16
это я почитаю повникаю...
сигналы идут по разным проводам, я сказал что их три для того чтобы сразу сориентироваться сколько надо таймеров.
если тинька такая унылая, то не проблема переиграть на более другой... ту же мегу 16
х
0хCB
таймера в любом случае одного хватит.
а тинька не то что бы унылее меги, у нее таймера нормального нету просто, но + в том что есть прерывание по смене состояния пинов, чего у меги нету. вобщем везде +/- есть
а тинька не то что бы унылее меги, у нее таймера нормального нету просто, но + в том что есть прерывание по смене состояния пинов, чего у меги нету. вобщем везде +/- есть
Про это есть аппнот AVR135 atmel.com/dyn/resources/prod_documents/doc8014.pdf
И код к нему: http://www.atmel.com/dyn/resources/prod_documents/...
И код к нему: http://www.atmel.com/dyn/resources/prod_documents/...
х
0хCB
Про это есть аппнот AVR135
ага. вот был бы на тиньке еще Timer Capture Unit цены б ему не было
t
timsa™
а можно ШИМ завести через RC цепочку на АЦП и тупо мерить напряжение?
х
0хCB
можно, тока но нафига? + период ппм не факт что постоянен, плыть будет
t
timsa™
в моей задаче период постоянен - 50 герц.
длительность импульса меняется от 10 до 20мс
длительность импульса меняется от 10 до 20мс
в моей задаче период постоянен - 50 герц.
Дыть тогда можно тупо длительность щетать таймером.
х
0хCB
длительность импульса меняется от 10 до 20мс
эт как, один канал шо ли?
х
0хCB
дык среди tiny дофига с Input Capture.
хз. на 8-ми ногих типа 1х нет ни на одной
да и вобще у тинек есть тока у одной: ATtiny2313, у которой 16ти битный таймер имеется
[Сообщение изменено пользователем 20.04.2011 22:22]
М
Мoзгoпрaв и мoзгoвeд©
хотя я ушел на PIC и STM32.
А STM8 щупали?
t
timsa™
ATtiny2313
о! у меня как раз такая валяется :-)
эт как, один канал шо ли?
да.
задача то простейшая, вот только я с института с контроллерами дела не имел
х
0хCB
бррррр.
чего то не понимаю видимо. канал один, а провода нафига три тогда?
чего то не понимаю видимо. канал один, а провода нафига три тогда?
чего то не понимаю видимо. канал один, а провода нафига три тогда?
петание, граунд, сигнал
если тинька такая унылая, то не проблема переиграть на
более другой... ту же мегу 16
если про AVR...
то зачем
(желательно асм)
?
avr-gcc, Си. намного понятнее, по-моему... чем писать на асме...
да и вобще у тинек есть тока у одной: 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
А STM8 щупали?
нет, я вобще планировал не PIC16F делать, но случайно увидал даташит на STM32F102/103 и он я вам скажу, по встроенной переферии и цене гораздо больше устраивает. :-)
а если надо что-то мелкое, то мне нравится pic10f200. опять же - ценой.
от avr стало подташнивать после сношания с usb в atmega32u4. даташит - полный шит. ну и с перефереией там херня какая-то, например долбанутое ограничение на конфигурацию мультиплексора в дифференциальном режиме с усилителем.
[Сообщение изменено пользователем 21.04.2011 01:22]
х
0хCB
....
ого, сколько их развелось :-)
тока у тини 10 icp помоему всетаки нету
х
0хCB
ага, это все три шим модулированых сигнала? :-)
вобщем пока неясно чего треба и на чем хотят ваять толи тиня13 толи 2313...
t
timsa™
чего то не понимаю видимо. канал один, а провода нафига три тогда?
три канала.
газ, руль, коробка скоростей
но идут каждый по своему отдельному проводку.
avr-gcc, Си. намного понятнее, по-моему... чем писать на асме...
просто я не пробовал работать с прерываниями на С.
щас как раз изучаю этот момент. может действительно будет проще.
2313
эта есть в наличии
тиня13
эту можно купить
отлаживать вообще планирую на mega16 - есть на демо плате
Авторизуйтесь, чтобы принять участие в дискуссии.