Создание собственной системы стабилизации
В одну миллисекунду “влазит” 250 импульсов по 4 микросекунды (не так ли?)
Вот Вам и дискрет. на канал, и частота тактирования счетчика (250 кГц)
Что значит " считать то в идеале до 10 " ? ВЫ что количество что ль посчитать хотите?
да, если 1мс разбить на 250 импульсов то будет 4мкс. Вы считаете этого будет достаточно? сейчас у меня дискретность 10мкс, это очень грубо получается.
если я присвою регистру сравнения OCR число 10, то по идее, по формуле, дискретность должна стать 0,68мкс.
предделители все выключил. тактируется таймер от регистра 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мкс. Вы наверно спросите что нахотся в самом теле таймера, для частоты эксперемента туда помещена всего дна команда на вкл/ светодиода. В чем тут дело?
Мне кажется вы немного плаваете в понятиях и пока плохо себе представляете как получается ШИМ.
Таймер не может тактироваться от своего регистра, согласитесь что это глупо. Так как регистр не имеет частоты… ))
Тактируетесь вы от кварца, как написали ниже.
Вы генерировать или мерить ШИМ хотите ?
да, если 1мс разбить на 250 импульсов то будет 4мкс. Вы считаете этого будет достаточно? сейчас у меня дискретность 10мкс, это очень грубо получается.
если я присвою регистру сравнения OCR число 10, то по идее, по формуле, дискретность должна стать 0,68мкс.
Если измеряете сигнал с АППЫ, то по стандарту 1000 мкс - 0% (например газа), 2000 мкс - 100% (например газа). То есть диапазон имеем 1000 мкс.
Если свой таймер вы тактируете с частотой 1мкс, то имеете дискетность 1000. теперь вопрос, дискресность самих осей аппы сколлько ? Нужна ли вам такая точность ?
Тут 250 вроде должно быть за глаза…
250 импульсов то будет 4мкс. Вы считаете этого будет достаточно?
Это 250 положений “сервы” на ее 60 градусов (недостаточно?)
И ни при чем тут OCR.
Читайте про ШИМ (хотя бы в википедии), а то не поймем друг друга…
Мне кажется вы немного плаваете в понятиях и пока плохо себе представляете как получается ШИМ.
согласен, немного плаваю) Я хочу измерить ШИМ который поступает от RC приемника. Для этого использую счетчик (таймер). с помощью регистра сравнени “завожу” его на нужный мне период. когда регистр сравнения равен 100, таймер тикает с периодом 6,85мкс, т.е. с этой точностью я могу посчитать (измерить) ШИМ. но я хочу мерить ШИМ с точностью ну хотябы 1мкс, в идеале 0,5мкс. но таймер отказывается так быстро работать(((
согласен, немного плаваю) Я хочу измерить ШИМ который поступает от RC приемника. Для этого использую счетчик (таймер). с помощью регистра сравнени “завожу” его на нужный мне период. когда регистр сравнения равен 100, таймер тикает с периодом 6,85мкс, т.е. с этой точностью я могу посчитать (измерить) ШИМ. но я хочу мерить ШИМ с точностью ну хотябы 1мкс, в идеале 0,5мкс. но таймер отказывается так быстро работать(((
Ммм…
Для того, чтобы было чуть яснее, задам вопрос, генерировать ШИМ у вас получалось?
Для того, чтобы было чуть яснее, задам вопрос, генерировать ШИМ у вас получалось?
пока не дошел до генерации, хочу сперва прием наладить…
Для этого использую счетчик (таймер). с помощью регистра сравнени “завожу” его на нужный мне период. когда регистр сравнения равен 100, таймер тикает с периодом 6,85мкс, т.е. с этой точностью я могу посчитать (измерить) ШИМ.
Признаюсь честно, я не очень силен в АВР, но что-то мне подсказывает, что в регистре сравнения как раз должен лежать период, это то, что вы измеряете, а не задаете.
Например, в СТМ32 для захвата ШИМ я завожу 2 канала. Первый канал ловит фронты, второй - спады. таким образом в первом канале в регистре сравнения у меня будет значение периода, а во втором - значение заполнения.
Это то, что вам нужно.
пока не дошел до генерации, хочу сперва прием наладить…
Советую начать с генерации, там проще тем, что нужен всего 1 канал, да и с регистрами заодно разберетесь, чтобы не путаться какой для чего.
Заводите таймер. В регистр сравнения помещаете величину, до которой хотите чтобы таймер считал. На выходе получаете ШИМ.
в регистре сравнения как раз должен лежать период, это то, что вы измеряете, а не задаете.
в АВР по такой формуле счтается частота таймера: f = Fкварца/1+OCR. Где OCR это регистр сравнения. соответсвенно период будет равен 1/f.
Например, в СТМ32 для захвата ШИМ я завожу 2 канала. Первый канал ловит фронты, второй - спады. таким образом в первом канале в регистре сравнения у меня будет значение периода, а во втором - значение заполнения.
Это то, что вам нужно.
к сожалению не перешел еще на STM32, но звучит такое измерение здорово. т.е. вы потом просто из периода вычитаете заполнение и получаете длительность ШИМа? получается вообще без всяких таймеров и подбора дискретности измерения?
хочу сперва прием наладить…
Сделайте следующее:
Настройте таймер на 250 Кгц (регистр TCCR)
Запустите его в программе по нарастающему фронту.
Остановите счет по спадающему фронту.
Получите значение длительности из регистра TCNT.
Обнулите TCNT для начала следующего отсчета.
Все!
Сделайте следующее:
Настройте таймер на 250 Кгц (регистр TCCR)
спасибо большое за дельный совет! попробую, о результатах отпишусь)
к сожалению не перешел еще на STM32, но звучит такое измерение здорово. т.е. вы потом просто из периода вычитаете заполнение и получаете длительность ШИМа? получается вообще без всяких таймеров и подбора дискретности измерения?
Почему без таймеров? таймер себе отлично ведет счет.
Ну вот например, таймер считает с периодом 1 мкс.
Начало отсчета:
CCR1 = 0; (регистра сравнения первого канала - ловит фронты)
CCR2 = 0; (регистр сравнения второго канала - ловит спады)
допустим, через 250 мкс после начала отсчета ловим спад.
Значит в CCR2 заносим число 250.
Через 500 мкс ловим фронт.
Значит в CCR1 заносим число 500.
Скважность будет CCR2/CCR1 = 250/500 = 0,5 = 50%.
Вот у вас есть все данные для измерения ШИМ.
Сбрасываем CCR1 и CCR2 и начинаем счет сначала.
Ну вот например, таймер считает с периодом 1 мкс.
вот в этой фразе самое интересное! Не получается у меня завести таймер быстрее чем 5,2 мкс. сегодня 2 часа бился вокруг этого таймера, никак не хочет. хотя теоретически считая по формуле, он вообще с 0,1мкс должен точно тикать.
Не получается у меня завести таймер быстрее чем 5,2 мкс. сегодня 2 часа бился вокруг этого таймера, никак не хочет
а часом не работает ли микросхеа от внутреннего генератора с делителем на 8, или вообще на килогерцах, фьюзы выставлены правильно?
вот в этой фразе самое интересное! Не получается у меня завести таймер быстрее чем 5,2 мкс. сегодня 2 часа бился вокруг этого таймера, никак не хочет. хотя теоретически считая по формуле, он вообще с 0,1мкс должен точно тикать.
А можно глянуть код, как вы настраиваете частоту таймера?
Сейчас глянул даташит на Атмегу8, там фиксированные предделители (8, 64, 256, 1024) или без него, той формулы, которую вы писали выше, не нашел.
может AeroQuad32 попробовать? он по идее мне в имеющийся проц влезет…
а часом не работает ли микросхеа от внутреннего генератора с делителем на 8, или вообще на килогерцах, фьюзы выставлены правильно?
фьюзы правильные и микруха настроена на внешний кварц. дело в том, то таймер нормально работает до периода 5,2мкс. т.е. например если я захочу выставить период 10мкс, то его расчет полностью совпадет с формулой. да и другие датчики настроены на частоту внешнего кварца и работаю правильно. Тут именно урунда какая то, почему то не хочет таймер работать быстрее 5.2 мкс, даже если я регистру сравнения присваиваю число, согласно которому период должен быть наприммер 1мкс. и понять в чем дело не могу…
Не получается у меня завести таймер
Давайте свою микросхему (марку), частоту кварца, щасс заведем…
(сброшу Вам значения регистров)
Сейчас глянул даташит на Атмегу8, там фиксированные предделители (8, 64, 256, 1024) или без него, той формулы, которую вы писали выше, не нашел.
да, полная форула конечно еще в знаменатель нужно предделитель ставить. но так как мне надо наоборот скорость увеличить, то предделители я выключил. формула которую я писал, она в книжке по АВР написана, в разделе таймеров) формула верная. я сегодня ее на осцилле проверял, все норм.
А можно глянуть код, как вы настраиваете частоту таймера?
код сегодня, к сожалению, на работе остался. завтра еще бороться буду, если не получиться, выложу код…
Давайте свою микросхему (марку), частоту кварца, щасс заведем…
микросхема Atmega128, кварц 14.7456МГц…
да, полная форула конечно еще в знаменатель нужно предделитель ставить. но так как мне надо наоборот скорость увеличить, то предделители я выключил
Ага, уже нашел что-то похожее… 😃
Ой забыл, номер таймера еще и желаемую частоту.
Ой забыл, номер таймера еще и желаемую частоту.
Timer2. Желаемая частота таймера 2МГц)