реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> генератор импульсов на ATmega16
neurox
сообщение Jan 21 2009, 08:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 21 2009, 08:51
Сообщение #2


Гуру
******

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



1.Да
2.Да
3.Режим СТС. C выводом импульсов на вывод ОС. Посмотрите в DS. Будут вопросы - задавайте.

P.S. Ответил плохо подумавши на второй вопрос... Уточните: точность какая нужна? Плюс/минус 1 Гц во всём диапазоне?
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 21 2009, 09:56
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



С 16 битным таймером вы получите только 151Гц максимальную частоту, надо использовать только 10 бит, тогда получится 9765Гц, с точностью установки порядка 9,5Гц. Если поставить кварц 10,48МГц тогда можно получить шаг частоты 10Гц


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
muravei
сообщение Jan 21 2009, 10:44
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591



Не подойдет? h__p://www.telesys.ru/electronics/projects.php?do=p072
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 21 2009, 11:04
Сообщение #5


Гуру
******

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



Цитата(GDI @ Jan 21 2009, 12:56) *
С 16 битным таймером вы получите только 151Гц максимальную частоту...
Это - ещё почему? В режиме СТС частота на ОС:
Fос= Fclk/(2*N*(1+OCR)), где N=1,8,64,1024; OCR=0...65535; Fclk=10 000 000 Гц
Откуда Вы получили такое ограничение?
Go to the top of the page
 
+Quote Post
GDI
сообщение Jan 21 2009, 11:52
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



С FastPWM попутал smile.gif


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 21 2009, 12:27
Сообщение #7


Гуру
******

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



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


Участник
*

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



Цитата(Палыч @ Jan 21 2009, 16:51) *
Уточните: точность какая нужна? Плюс/минус 1 Гц во всём диапазоне?


Желательная точность действительно +/- 1Гц. Возможно ли её при 10 000 Гц достичь? В вычислениях получается уж слишком большая погрешность.. О_о

Получается так... задающая частота 10 МГц... Через prescaler делю её на 1024, получается 9765,625 Гц - это частота с которой будет работать таймер. Далее мне нужно, например, чтобы он махал ногой с частотой 1 Гц. Т.е. я должен вычислить число, с которым будет сравниваться значение таймера и по совпадению инвертировать уровень на ноге. Как мне вычислить это значение?
Go to the top of the page
 
+Quote Post
yarunt
сообщение Jan 22 2009, 07:44
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 215
Регистрация: 13-12-06
Из: fghgfh
Пользователь №: 23 476



Цитата(neurox @ Jan 21 2009, 12:39) *
Доброго времени суток. Обращаюсь к вам с такой задачкой:

Необходимо изготовить генератор импульсов на ATmega16. Частота импульсов задается динамически с клавиатуры и отображается на ЖК дисплее.

Что сделал я:

1.Интерфейс я сделал, число отображается и по нажатию кнопок изменяется. (одна кнопка перелистывает единицы, вторая десятки, третья сотни и т.д.)

2.Мега тактируется от внешнего кварца на 10Mhz. На porta дисплей, на portb кнопки.

Что мне не понятно:

1.Думаю для отсчета периода между импульсами разумно использовать 16ти разрядный таймер... да?

2.Можно ли добиться приемлемой точности в моём случае? Мне необходимо генерировать импульсы с частотой в диапазоне от 1Гц до 10000Гц. (Ну или хотя бы до 5000Гц)

3.Как реализовать генерацию импульсов? (В теории кажется понятным а на практике что-то не врубаюсь). Поделитесь опытом, пожалуйста? А если добавите выкладку на С то буду вообще счастлив.

А форма импульсов?


--------------------
Нельзя впихнуть,невпихуемое?МОЙ БЛОГ
Go to the top of the page
 
+Quote Post
swisst
сообщение Jan 22 2009, 07:52
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425



Цитата(neurox @ Jan 22 2009, 09:37) *
Желательная точность действительно +/- 1Гц. Возможно ли её при 10 000 Гц достичь? В вычислениях получается уж слишком большая погрешность.. О_о

Получается так... задающая частота 10 МГц... Через prescaler делю её на 1024, получается 9765,625 Гц - это частота с которой будет работать таймер. Далее мне нужно, например, чтобы он махал ногой с частотой 1 Гц. Т.е. я должен вычислить число, с которым будет сравниваться значение таймера и по совпадению инвертировать уровень на ноге. Как мне вычислить это значение?


точность будет зависить от того, что Вы можете показать на индикаторе. Я получал точность 0,005% для определенной сетки частот - круглые значения, если можно так выразиться.
Go to the top of the page
 
+Quote Post
neurox
сообщение Jan 22 2009, 08:12
Сообщение #11


Участник
*

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



Цитата(yarunt @ Jan 22 2009, 15:44) *
А форма импульсов?


прямоугольные
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Jan 22 2009, 08:12
Сообщение #12


Профессионал
*****

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



В вашем случае надо использовать как уже сказали выше 16-битный таймер в режиме СТС с инвертированием вывода МК управляемого этим мк. Но нужно определится с его входной тактовой частотой. Используя например 8МГц кварц и 8 делитель можно получить 1МГц. Тогда минимальный возможный период отсчёта составит 1мкс. Значит раз в 1мкс вы сможете инвертировать вывод соотв. период будет в 2 раза больший от 1*2 до 65536*2 мкс (500000 Гц до 7,6 Гц). Чтобы получить мин частоту 1Гц вам надо понизить входную частоту ТС ещё в 8 раз или изменить ТЗ и поднять нижнюю частоту скажем до 10 Гц. Либо другой вариант - ввесести дополнительную переменную и считать её по прерыванию СТС и самостоятельно инвертировать вывод МК тогда вы точно сможете получить 1Гц но у этого метода есть недостаток - вам придётся вводить прерывания СТС, занимать процессор на его обслуживание. Это может привести к плаванию фронта. Первый вариант обеспечит вам стабильную работу независящую от хода исполнения программы вплоть до Fсист/2 так как управление ножкой будет осуществлятся аппаратно без использования прерываний (друг таким способом выводил стабильную тактовую частоту для симки 4МГц при 8МГц системной тактовой частоты).
P.S. не хватает в меге 32-битного таймера для таких случаев smile.gif
Go to the top of the page
 
+Quote Post
neurox
сообщение Jan 22 2009, 08:14
Сообщение #13


Участник
*

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



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


примеры значений: 1hz, 283hz, 1000hz, 8582hz
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 22 2009, 08:22
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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, но мы прибережем его (деление) для округления до ближайшего целого. rolleyes.gif
Если Х помещается в 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
Go to the top of the page
 
+Quote Post
neurox
сообщение Jan 22 2009, 08:22
Сообщение #15


Участник
*

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



memphis_, внутренний RC подойдет для этой цели? Т.З. можно поменять... отсутствие частот от 1 до 10 Герц не критично.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 09:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016