|
генератор импульсов на ATmega16 |
|
|
|
Jan 21 2009, 08:39
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638

|
Доброго времени суток. Обращаюсь к вам с такой задачкой:
Необходимо изготовить генератор импульсов на ATmega16. Частота импульсов задается динамически с клавиатуры и отображается на ЖК дисплее.
Что сделал я:
1.Интерфейс я сделал, число отображается и по нажатию кнопок изменяется. (одна кнопка перелистывает единицы, вторая десятки, третья сотни и т.д.)
2.Мега тактируется от внешнего кварца на 10Mhz. На porta дисплей, на portb кнопки.
Что мне не понятно:
1.Думаю для отсчета периода между импульсами разумно использовать 16ти разрядный таймер... да?
2.Можно ли добиться приемлемой точности в моём случае? Мне необходимо генерировать импульсы с частотой в диапазоне от 1Гц до 10000Гц. (Ну или хотя бы до 5000Гц)
3.Как реализовать генерацию импульсов? (В теории кажется понятным а на практике что-то не врубаюсь). Поделитесь опытом, пожалуйста? А если добавите выкладку на С то буду вообще счастлив.
Сообщение отредактировал neurox - Jan 21 2009, 08:44
|
|
|
|
|
Jan 21 2009, 12:27
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(GDI @ Jan 21 2009, 14:52)  С FastPWM попутал Ну, вот... Другое дело: автор вопроса невнятно сформулировал требования по точности генерируемой частоты... Если желает генерить 10 000 Гц с точностью плюс/минус 0,5 Гц (а, может быть и точнее), то это уже 500ppm, добрая часть из которых, возможно, прийдется на погрешность округления делителя до ближайшего целого. Возможны проблемы с точностью задающего генератора: кроме "точности" изготовления кварца, на частоту задающего генератора будут оказываться и другие воздействия (изменение температуры, напряжения питания и др). Возможно, при проектировании прийдётся очень ответственно отнестись к этой части прибора...
|
|
|
|
|
Jan 22 2009, 07:37
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638

|
Цитата(Палыч @ Jan 21 2009, 16:51)  Уточните: точность какая нужна? Плюс/минус 1 Гц во всём диапазоне? Желательная точность действительно +/- 1Гц. Возможно ли её при 10 000 Гц достичь? В вычислениях получается уж слишком большая погрешность.. О_о Получается так... задающая частота 10 МГц... Через prescaler делю её на 1024, получается 9765,625 Гц - это частота с которой будет работать таймер. Далее мне нужно, например, чтобы он махал ногой с частотой 1 Гц. Т.е. я должен вычислить число, с которым будет сравниваться значение таймера и по совпадению инвертировать уровень на ноге. Как мне вычислить это значение?
|
|
|
|
|
Jan 22 2009, 07:52
|
Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425

|
Цитата(neurox @ Jan 22 2009, 09:37)  Желательная точность действительно +/- 1Гц. Возможно ли её при 10 000 Гц достичь? В вычислениях получается уж слишком большая погрешность.. О_о
Получается так... задающая частота 10 МГц... Через prescaler делю её на 1024, получается 9765,625 Гц - это частота с которой будет работать таймер. Далее мне нужно, например, чтобы он махал ногой с частотой 1 Гц. Т.е. я должен вычислить число, с которым будет сравниваться значение таймера и по совпадению инвертировать уровень на ноге. Как мне вычислить это значение? точность будет зависить от того, что Вы можете показать на индикаторе. Я получал точность 0,005% для определенной сетки частот - круглые значения, если можно так выразиться.
|
|
|
|
|
Jan 22 2009, 08:12
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638

|
Цитата(yarunt @ Jan 22 2009, 15:44)  А форма импульсов? прямоугольные
|
|
|
|
|
Jan 22 2009, 08:14
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638

|
Цитата(swisst @ Jan 22 2009, 15:52)  точность будет зависить от того, что Вы можете показать на индикаторе. Я получал точность 0,005% для определенной сетки частот - круглые значения, если можно так выразиться. примеры значений: 1hz, 283hz, 1000hz, 8582hz
|
|
|
|
|
Jan 22 2009, 08:22
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(neurox @ Jan 22 2009, 10:37)  Желательная точность действительно +/- 1Гц. Возможно ли её при 10 000 Гц достичь? В вычислениях получается уж слишком большая погрешность.. О_о Достичь можно, и погрешность, скорее всего, будет небольшой... Цитата(neurox @ Jan 22 2009, 10:37)  ... Через prescaler делю её на 1024, получается 9765,625 Гц ......... Как мне вычислить это значение? Для того, чтобы погрешность округления делителя до ближайшего целого была минимальна, необходимо, чтобы деление в прескалере было бы минимальным. Исходя из этого идеально использовать пределитель равнй единице. Но, для всего диапазона единица пределителя неподходит - иначе значение OCR выходит за 16 бит. Весь диапазон необходимо разбить на несколько частей - в каждом поддиапазоне своё значение пределителя. Как определить пределитель и значение OCR? Если заглянуть в DS, то легко найти формулу определения частоты на ноге ОС в режиме СТС. Несложными преобразованиями получаем: OCR= Fclk/(Foc*2*N)-1 В этой формуле Fclk- частота задающего генератора; Foc- частота, которую необходимо получить на выходе; N- значение пределителя; OCR- значение, которое необходимо поместить в регистр для получения нужной частоты на выходе. Вспомним что N - имеет значение степени двойки и что деление на 2 (или степень двойки) - это сдвиг вправо. Попробуем вычислить OCR при этом подбирая значение пределителя такое - чтобы результат помещался в 16 бит. 1. Делим Fclk на Foc (обозначим результат как Х). Результат надо получить типа unsigned long (надеюсь, программируете на Си) 2. Проверяем насколько Х превышает размер 17 (!) бит. Именно 17 бит, т.к. осталось ещё деление на 2, но мы прибережем его (деление) для округления до ближайшего целого. Если Х помещается в 17 бит - то пределитель = 1, и Y=X иначе, если Х помещается в 20 бит - то делитель = 8, и Y=X>>3 иначе, если Х помещается в 23 бита - то делитель = 64, и Y=X>>6 иначе, если Х помещается в 25 бит - то делитель = 256, и Y=X>>8 иначе делитель = 1024, и Y=X>>10 3. Делим на 2 с округлением до ближайшего целого и вычитаем единицу Z=(Y+1)>>1 - 1 (это и будет вычисленное значение для OCR) Ну, вот... Для заданной частоты генерации импульсов определили пределитель и значение OCR
|
|
|
|
|
Jan 22 2009, 08:22
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638

|
memphis_, внутренний RC подойдет для этой цели? Т.З. можно поменять... отсутствие частот от 1 до 10 Герц не критично.
|
|
|
|
|
Jan 22 2009, 08:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата Получается так... задающая частота 10 МГц... Через prescaler делю её на 1024, получается 9765,625 Гц - это частота с которой будет работать таймер. Далее мне нужно, например, чтобы он махал ногой с частотой 1 Гц. Т.е. я должен вычислить число, с которым будет сравниваться значение таймера и по совпадению инвертировать уровень на ноге. Как мне вычислить это значение? Fсист - системная тактовая частота, Кдел - коэф. деления предделителя Fтс=Fсист/Кдел - тактовая частота ТС Fуст - необходимая частота Fтс/Fуст=Кпер (Кпер - коэф. пересчёта в режиме СТС) N=Кпер/2=Fтс/(2*Fуст)=Fсист/(2*Кдел*Fуст) - число заносимое в регистр сравнения для заданной частоты N=Fсист/(2*Кдел*Fуст) N=10000000/(2*512*1)=9765,625 N=9765 - занеся такое число в регист сравнения при 10МГц и Кдел=512 получите 1,000064 Гц на выходе Цитата(neurox @ Jan 22 2009, 11:22)  memphis_, внутренний RC подойдет для этой цели? Т.З. можно поменять... отсутствие частот от 1 до 10 Герц не критично. Лучше используйте внешний кварц. Внутренний RC-генератор врятли подойдёт. Его нужно калибровать, параметры могут плавать от температуры. Но можете проверить опытным путём.
|
|
|
|
|
Jan 22 2009, 08:45
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 30-06-08
Пользователь №: 38 638

|
Палыч, mempfis_ спасибо!  сижу вникаю...
|
|
|
|
|
Jan 22 2009, 13:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008

|
Цитата А вот, попробуйте представить (записать) все двадцатичетырёхразрядные числа в виде произведения двух чисел - одного 8-ми, а второго 16-ти разрядных. А если представить(а так оно и есть) что на вход 8битного таймера-счетчика поступает частота деленная на 2^16(максимальное значение 16битного таймера)? Мы опустим возможность получения некоторых промежуточных значений несколькими комбинациями обоих таймеров - нам ни к чему лишние сложности. Другое дело, что меняя период первого таймера мы на выходе второго будем получать частоту первого таймера деленную пополам, т.к. второй таймер нам даст минимальное деление на 2, т.о. мы не получим чистые 24 бита, будет только 23, но это все равно лучше чем 16 с программным последующим делением, т.к. решение будет аппаратное и не будет большого дрожания фазы. Может мы из-за бита спорим?
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|