 |
|
|
|
| Автор |
Сообщение |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 24 Май 2007, 10:37 Заголовок сообщения: |
|
|
Ладно ... если Вы хотите скважность 1 то можно делать просто на таймере ...
Таймер ставим на минимальное время периода (2 кГц частота ... фронты 4 кГц -- период 250мкс.) -- на 250 мкс.
Дальшее вводим переменную(ПЕРИОД), которая указывает, "через сколько сработок таймера нужно сформировать фронт"
Каждое срабатывание таймера мы делаем декремент переменной(ПЕРИОД), если равна нулю. то загружаем в нее нужное число и формируем фронт.
Например. Нужна частота 1 Гц - значит фронты нужно формировать каждые 4000 сработки таймера (ПЕРИОД = 4000).
Так мы формируем нужный сигнал.
Дальше пытаемся его изменять ... вводим еще одну переменную(КАЧАНИЕ), которая будет указывать "через сколько сработок таймера нужно изменить частоту" ...
Кстати ... Вы поняли глюк с НЕРАВНОМЕРНЫМ изменением частоты в Вашем варианте с изменением периода таймера при каждом его срабатывании?
Попробуем определелится с переменной КАЧАНИЕ ... нужно изменить ее значение от 1 до 4000 за 15 сек, 15/4000 = 0,00375 сек.
У нас таймер настроен на 0,00025сек... значит изменять переменную нужно каждые 0,00375/0,00025 = 13 сработок.
... вот теперь только думается мне ... как будет происходить изменение частоты, если частота у нас "300 сработок таймера", а меняем мы ее каждые 13 сработок ....
Видать бред всё это ... надобно тут математику вспоминать посерьезней... _________________ AndryG |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 24 Май 2007, 11:12 Заголовок сообщения: |
|
|
Продолжаю думать ... не такая простая задача ...
Если Вам нужна скважность 1 и 2000 итераций ... то что получается ... по одному импульсу каждой частоты с дельтой частоты 1 Гц... получается 1Гц 2Гц 3Гц ... 2000Гц ... нужное время 1/1сек + 1/2сек + 1/3сек + ... + 1/2000сек -- надо вспоминать формулу суммы геометрической прогрессии ... то 100% процентов это больше 15 сек
дальше думаем ... для раномерного изменения частоты ее (частоту) нужно изменять через равные промежутки времени ... значит нелья изменять чатостоту просто после очередного периода - так-как время периода будет изменятся и вместе с ним время между изменениями частоты.
Хм. Конкретизируйте задачку ...
Попробуем сделать к-во итераций 100 (для спидометра 0-200км/ч -- это дельта 2км/ч получается ... вроде нормально)
Значит 15/100 = 0.15 сек - время, через которое мы изменяем частоту ... значит нужно умудриться в эти 150мс впихивать целые периоды определенных частот ... или по другому ... "каждые 150 мс начинать генерить новую частоту" ... тем самым последний период предыдущего периода будет у нас обрезанным.
и вообще ... при изменении скорости ... изменении частоты ... как можно вообще получить скважность 1 на всем промежутке?!
Кто еще что придумает?! _________________ AndryG |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 24 Май 2007, 11:32 Заголовок сообщения: |
|
|
Подкинули еще идею ... для красивой скважности изменять частоту сигнала после каждого периода ... НО для равномерного наростания изменять нужно кадый раз раз на разную частоту ...
Например ... генерим период на 1 гц ... н занял время 1 сек ... в это время уже дожна быть частота 2000* 1/15 = 133.3(3) Гц
Значит частоту ставим 133Гц ... отгенерили импульс - у нас прошло времени 1/133 сек ... в это время частота должна быть ?? гц ... ставим ее ... и т.д. _________________ AndryG |
|
| Вернуться к началу |
|
 |
AVL Знатный посетитель (>20)


Зарегистрирован: 20.09.2006 Сообщения: 52 Откуда: Коломыя UA
|
Добавлено: 24 Май 2007, 12:06 Заголовок сообщения: |
|
|
Кстати ... Вы поняли глюк с НЕРАВНОМЕРНЫМ изменением частоты в Вашем варианте с изменением периода таймера при каждом его срабатывании?
Ну, не глюк, оно так и планировалось, но я не ождидал, что будет столь большой дискомфорт на больших частотах... Так-то там всё красиво генерится
Да, думать тяжело, но я морально Вам помогаю...  |
|
| Вернуться к началу |
|
 |
AVL Знатный посетитель (>20)


Зарегистрирован: 20.09.2006 Сообщения: 52 Откуда: Коломыя UA
|
Добавлено: 25 Май 2007, 15:21 Заголовок сообщения: |
|
|
| Всё так плохо? |
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 25 Май 2007, 17:08 Заголовок сообщения: |
|
|
времени пока нет ... на работе конец месяца ... попробую позже с разбивкой на сотню шагов ... _________________ AndryG |
|
| Вернуться к началу |
|
 |
AVL Знатный посетитель (>20)


Зарегистрирован: 20.09.2006 Сообщения: 52 Откуда: Коломыя UA
|
Добавлено: 25 Май 2007, 17:26 Заголовок сообщения: |
|
|
ок.
И ещё.
Для увеличения частоты генерации я думал применить следующий код:
if (TCNT0==5 & ti==254) {TCNT0=4};
if (TCNT0==4 & ti==254) {TCNT0=3};
if (TCNT0==3 & ti==254) {TCNT0=2};
if (TCNT0==2 & ti==254) {TCNT0=1};
if (TCNT0==1 & ti==254) {TCNT0=5};
ti - тики таймера, от 0 до 255.
для изменения тастоты тактирования таймера. Но в жизни получил полный глюк. А именно, как видим, при наборе максимальной частоты TCNT0==1 должкн перейти на TCNT0=5. А в действительности частота генерации скачет как хочет. Причём это на реальном кристале, а в симуляторе всё ок. В чём может быть беда? Питается девайс от ЮЗБ порта, кондёры по питанию имеются. ДОГ таймер может тут воду муить? Хотя проц не сбрасывается, а прочто частота гуляет как себе хочет. |
|
| Вернуться к началу |
|
 |
AVL Знатный посетитель (>20)


Зарегистрирован: 20.09.2006 Сообщения: 52 Откуда: Коломыя UA
|
Добавлено: 26 Май 2007, 13:05 Заголовок сообщения: |
|
|
Или как ПРАВИЛЬНО мне генерить импульсы без лишних заморочек?
Может, сходу поставить TCNT0=1 и выдёргивать только нужные импульсы? Как? |
|
| Вернуться к началу |
|
 |
avr123.nm.ru Знатный посетитель (>20)

Зарегистрирован: 07.08.2006 Сообщения: 67
|
Добавлено: 27 Май 2007, 0:03 Заголовок сообщения: |
|
|
| не экономьте на скобках ! |
|
| Вернуться к началу |
|
 |
AVL Знатный посетитель (>20)


Зарегистрирован: 20.09.2006 Сообщения: 52 Откуда: Коломыя UA
|
Добавлено: 27 Май 2007, 12:36 Заголовок сообщения: |
|
|
Так:
if ((TCNT0==5) & (ti==254)) {TCNT0=4};
if ((TCNT0==4) & (ti==254)) {TCNT0=3};
if ((TCNT0==3) & (ti==254)) {TCNT0=2};
if ((TCNT0==2) & (ti==254)) {TCNT0=1};
if ((TCNT0==1) & (ti==254)) {TCNT0=5}; или маловато всё-таки? |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|