Создание собственной системы стабилизации

SergDoc

собрал прошивку autoquad блин 430 с гаком килобайт флеши надо, ладно ещё над чемнибудь поиздеваюсь…

Alexsis1109
oleg70:

Немного не понял, что значит 0.5 мкс (частота тактирования чтоль?)
А вообще в ATmega-х пред/делитель (от тактовой частоты) очень “дешевый”
т.е. коэфициенты фиксированные (8/16/32/64) смотрите даташит он на 128-ю даже на русском есть.

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

Geniok
Alexsis1109:

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

Ну в принципе меряете (а точнее отсчитываете) правильно. Смотрите какие предделители у вас есть. От чего тактируете таймер?

У меня вот какой вопрос возник по работе с I2C в stm32.
Есть ли смысл использовать DMA вместо прерываний?
Может кто использовал?

Alexsis1109
Geniok:

Ну в принципе меряете (а точнее отсчитываете) правильно. Смотрите какие предделители у вас есть. От чего тактируете таймер?

предделители все выключил. тактируется таймер от регистра OCR. допустим присваиваем регистру OCR = 100, тогда частота таймера будет f = Fкварца/1+OCR = 14745600/1+100 = 145996 т.е. Т=1/f = 6.85мкс. Т.е. эти 6.85 мкс и есть точность с которой я могу отсчитать шим. Но это слишком грубо, нужно хотябы 1мкс. Но когда я начинаю уменьшать значение OCR, почему то меньше 5.2 мкс период не хочет снижаться. Теоритически при OCR= 10, Т должен = 0,685мкс, а по факту он все ровно 5,2мкс. Вы наверно спросите что нахотся в самом теле таймера, для частоты эксперемента туда помещена всего дна команда на вкл/ светодиода. В чем тут дело?

oleg70
Alexsis1109:

ну для того чтобы посчитать длительность ШИМа

Правильно нужен таймер но надо сначала выбрать какой (8-ми или 16-битный), далее “понеслось”… :
при 8-ми битах он считает макс. до 256, если устраивает Вас эта дискретность на канал (вполне неплохо) делаете расчет тактовой частоты так чтобы не было переполнения за 1м/сек (стандартная длительность импульса аппы), в данном случае 16Mhz/64=250 Khz= 4 мк/с.
На 16-ти битном можно считать уже до 65535 и можно сделать круче…
По моему понятно объяснил: частота такта счетчика=дискретность канала (с учетом емкости самого счетчика)
Все зависит уже от Вашего желания…

Alexsis1109:

тактируется таймер от регистра OCR

Дело в том что от OCR таймер не тактируется, это регистр сравнения (Вы вообще хотите мерять ШИМ или генерить?)
Не пойму…

Alexsis1109
oleg70:

Правильно нужен таймер но надо сначала выбрать какой (8-ми или 16-битный),

конечно, таймер у меня 8-ми битный. Мне и надо считать то в идеале до 10))) я же говорю что ставлю 100 в регистр OCR, т.е. он считает до 100 и при этом выдает длительность в 6,85мкс.

oleg70:

делаете расчет тактовой частоты так чтобы не было переполнения за 1м/сек (стандартная длительность импульса аппы), в данном случае 16Mhz/64=250 Khz= 4 мк/с.

а вот это не совсем понял. вы хотите сказать, что точность отсчитывания шима достаточна в 4мкс?

oleg70:

16Mhz/64=250

что такое 64?

oleg70:

Дело в том что от OCR таймер не тактируется, это регистр сравнения (Вы вообще хотите мерять ШИМ или генерить?)
Не пойму…

хочу мерить ШИМ

oleg70

Тогда так: имеем длительность ШИМ импульса от 1 милисек. до 2-милисек. (стандарт!) итого 1 милисек.
В одну миллисекунду “влазит” 250 импульсов по 4 микросекунды (не так ли?)
Вот Вам и дискрет. на канал, и частота тактирования счетчика (250 кГц)
Что значит " считать то в идеале до 10 " ? ВЫ что количество что ль посчитать хотите?

Alexsis1109
oleg70:

В одну миллисекунду “влазит” 250 импульсов по 4 микросекунды (не так ли?)
Вот Вам и дискрет. на канал, и частота тактирования счетчика (250 кГц)
Что значит " считать то в идеале до 10 " ? ВЫ что количество что ль посчитать хотите?

да, если 1мс разбить на 250 импульсов то будет 4мкс. Вы считаете этого будет достаточно? сейчас у меня дискретность 10мкс, это очень грубо получается.
если я присвою регистру сравнения OCR число 10, то по идее, по формуле, дискретность должна стать 0,68мкс.

Geniok
Alexsis1109:

предделители все выключил. тактируется таймер от регистра OCR. допустим присваиваем регистру OCR = 100, тогда частота таймера будет f = Fкварца/1+OCR = 14745600/1+100 = 145996 т.е. Т=1/f = 6.85мкс. Т.е. эти 6.85 мкс и есть точность с которой я могу отсчитать шим. Но это слишком грубо, нужно хотябы 1мкс. Но когда я начинаю уменьшать значение OCR, почему то меньше 5.2 мкс период не хочет снижаться. Теоритически при OCR= 10, Т должен = 0,685мкс, а по факту он все ровно 5,2мкс. Вы наверно спросите что нахотся в самом теле таймера, для частоты эксперемента туда помещена всего дна команда на вкл/ светодиода. В чем тут дело?

Мне кажется вы немного плаваете в понятиях и пока плохо себе представляете как получается ШИМ.
Таймер не может тактироваться от своего регистра, согласитесь что это глупо. Так как регистр не имеет частоты… ))
Тактируетесь вы от кварца, как написали ниже.
Вы генерировать или мерить ШИМ хотите ?

Alexsis1109:

да, если 1мс разбить на 250 импульсов то будет 4мкс. Вы считаете этого будет достаточно? сейчас у меня дискретность 10мкс, это очень грубо получается.
если я присвою регистру сравнения OCR число 10, то по идее, по формуле, дискретность должна стать 0,68мкс.

Если измеряете сигнал с АППЫ, то по стандарту 1000 мкс - 0% (например газа), 2000 мкс - 100% (например газа). То есть диапазон имеем 1000 мкс.
Если свой таймер вы тактируете с частотой 1мкс, то имеете дискетность 1000. теперь вопрос, дискресность самих осей аппы сколлько ? Нужна ли вам такая точность ?

Тут 250 вроде должно быть за глаза…

oleg70
Alexsis1109:

250 импульсов то будет 4мкс. Вы считаете этого будет достаточно?

Это 250 положений “сервы” на ее 60 градусов (недостаточно?)
И ни при чем тут OCR.
Читайте про ШИМ (хотя бы в википедии), а то не поймем друг друга…

Alexsis1109
Geniok:

Мне кажется вы немного плаваете в понятиях и пока плохо себе представляете как получается ШИМ.

согласен, немного плаваю) Я хочу измерить ШИМ который поступает от RC приемника. Для этого использую счетчик (таймер). с помощью регистра сравнени “завожу” его на нужный мне период. когда регистр сравнения равен 100, таймер тикает с периодом 6,85мкс, т.е. с этой точностью я могу посчитать (измерить) ШИМ. но я хочу мерить ШИМ с точностью ну хотябы 1мкс, в идеале 0,5мкс. но таймер отказывается так быстро работать(((

Geniok
Alexsis1109:

согласен, немного плаваю) Я хочу измерить ШИМ который поступает от RC приемника. Для этого использую счетчик (таймер). с помощью регистра сравнени “завожу” его на нужный мне период. когда регистр сравнения равен 100, таймер тикает с периодом 6,85мкс, т.е. с этой точностью я могу посчитать (измерить) ШИМ. но я хочу мерить ШИМ с точностью ну хотябы 1мкс, в идеале 0,5мкс. но таймер отказывается так быстро работать(((

Ммм…
Для того, чтобы было чуть яснее, задам вопрос, генерировать ШИМ у вас получалось?

Alexsis1109
Geniok:

Для того, чтобы было чуть яснее, задам вопрос, генерировать ШИМ у вас получалось?

пока не дошел до генерации, хочу сперва прием наладить…

Geniok
Alexsis1109:

Для этого использую счетчик (таймер). с помощью регистра сравнени “завожу” его на нужный мне период. когда регистр сравнения равен 100, таймер тикает с периодом 6,85мкс, т.е. с этой точностью я могу посчитать (измерить) ШИМ.

Признаюсь честно, я не очень силен в АВР, но что-то мне подсказывает, что в регистре сравнения как раз должен лежать период, это то, что вы измеряете, а не задаете.
Например, в СТМ32 для захвата ШИМ я завожу 2 канала. Первый канал ловит фронты, второй - спады. таким образом в первом канале в регистре сравнения у меня будет значение периода, а во втором - значение заполнения.
Это то, что вам нужно.

Alexsis1109:

пока не дошел до генерации, хочу сперва прием наладить…

Советую начать с генерации, там проще тем, что нужен всего 1 канал, да и с регистрами заодно разберетесь, чтобы не путаться какой для чего.
Заводите таймер. В регистр сравнения помещаете величину, до которой хотите чтобы таймер считал. На выходе получаете ШИМ.

Alexsis1109
Geniok:

в регистре сравнения как раз должен лежать период, это то, что вы измеряете, а не задаете.

в АВР по такой формуле счтается частота таймера: f = Fкварца/1+OCR. Где OCR это регистр сравнения. соответсвенно период будет равен 1/f.

Geniok:

Например, в СТМ32 для захвата ШИМ я завожу 2 канала. Первый канал ловит фронты, второй - спады. таким образом в первом канале в регистре сравнения у меня будет значение периода, а во втором - значение заполнения.
Это то, что вам нужно.

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

oleg70
Alexsis1109:

хочу сперва прием наладить…

Сделайте следующее:
Настройте таймер на 250 Кгц (регистр TCCR)
Запустите его в программе по нарастающему фронту.
Остановите счет по спадающему фронту.
Получите значение длительности из регистра TCNT.
Обнулите TCNT для начала следующего отсчета.
Все!

Alexsis1109
oleg70:

Сделайте следующее:
Настройте таймер на 250 Кгц (регистр TCCR)

спасибо большое за дельный совет! попробую, о результатах отпишусь)

Geniok
Alexsis1109:

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

Почему без таймеров? таймер себе отлично ведет счет.
Ну вот например, таймер считает с периодом 1 мкс.
Начало отсчета:
CCR1 = 0; (регистра сравнения первого канала - ловит фронты)
CCR2 = 0; (регистр сравнения второго канала - ловит спады)
допустим, через 250 мкс после начала отсчета ловим спад.
Значит в CCR2 заносим число 250.
Через 500 мкс ловим фронт.
Значит в CCR1 заносим число 500.
Скважность будет CCR2/CCR1 = 250/500 = 0,5 = 50%.

Вот у вас есть все данные для измерения ШИМ.

Сбрасываем CCR1 и CCR2 и начинаем счет сначала.

Alexsis1109
Geniok:

Ну вот например, таймер считает с периодом 1 мкс.

вот в этой фразе самое интересное! Не получается у меня завести таймер быстрее чем 5,2 мкс. сегодня 2 часа бился вокруг этого таймера, никак не хочет. хотя теоретически считая по формуле, он вообще с 0,1мкс должен точно тикать.

SergDoc
Alexsis1109:

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

а часом не работает ли микросхеа от внутреннего генератора с делителем на 8, или вообще на килогерцах, фьюзы выставлены правильно?

Geniok
Alexsis1109:

вот в этой фразе самое интересное! Не получается у меня завести таймер быстрее чем 5,2 мкс. сегодня 2 часа бился вокруг этого таймера, никак не хочет. хотя теоретически считая по формуле, он вообще с 0,1мкс должен точно тикать.

А можно глянуть код, как вы настраиваете частоту таймера?
Сейчас глянул даташит на Атмегу8, там фиксированные предделители (8, 64, 256, 1024) или без него, той формулы, которую вы писали выше, не нашел.