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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Временные интервалы
=GM=
сообщение Jun 21 2010, 15:26
Сообщение #16


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Можно вот так оптимизировать
Код
tt=GetSystemTimeMS()-ms;
for(unsigned char i=0;i<MAX_CHANEL;i++)
{
if(imageC & (1<<i))
{
  if(tt > tTiming1[i]) imageС |=(1<<i);
}
else
{
  if(tt > tTiming0[i]) imageС &=~(1<<i);
}
}
PORTC=imageC;
ms=GetSystemTimeMS();
Думаю джиттер существенно сократится, ещё можно цикл развернуть.



--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 22 2010, 10:02
Сообщение #17





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Цитата(=GM= @ Jun 21 2010, 18:26) *
Можно вот так оптимизировать
Думаю джиттер существенно сократится, ещё можно цикл развернуть.


А как такой цикл можно развернуть?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 22 2010, 11:00
Сообщение #18


Гуру
******

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



Цитата(Andruxa-1 @ Jun 22 2010, 14:02) *
А как такой цикл можно развернуть?
В Вашем случае - вместо цикла записываете его тело восемь раз, подставляя вместо параметра цикла (i) константы (0,1,2,...7) в соответствующие части. Выполнятся это будет быстрее - константные выражения посчитаются на этапе трансляции.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 22 2010, 11:26
Сообщение #19


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Совершенно верно.

Андрукса, какой у вас джиттер получается с вариантом из поста #16?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 22 2010, 12:32
Сообщение #20





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Цитата(=GM= @ Jun 22 2010, 14:26) *
Совершенно верно.

Андрукса, какой у вас джиттер получаетсся с вариантом из поста #16?


джиттера нет, но получается меандр
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 22 2010, 12:33
Сообщение #21


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Andruxa-1 @ Jun 22 2010, 16:32) *
джиттера нет, но получается меандр

smile.gif
- Алло! Это баня?
- Нет, это Балера!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 22 2010, 12:58
Сообщение #22


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Andruxa-1 @ Jun 22 2010, 11:32) *
джиттера нет, но получается меандр

Похоже, это я лоханулся, переменная MS должна быть для каждого канала своя, т.е. массив MS(i). Возвращайте взад присвоение MS(i) в обоих ветвях цикла.

И лучше не вызывайте GetSystemTime, а просто где требуется вставьте тело подпрограммы.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 22 2010, 13:13
Сообщение #23





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Цитата(=GM= @ Jun 22 2010, 15:58) *
Похоже, это я лоханулся, переменная MS должна быть для каждого канала своя, т.е. массив MS(i). Возвращайте взад присвоение MS(i) в обоих ветвях цикла.

И лучше не вызывайте GetSystemTime, а просто где требуется вставьте тело подпрограммы.


Я пробовал этот вариант, сути не меняет
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 22 2010, 13:32
Сообщение #24


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Сути чего?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 22 2010, 13:35
Сообщение #25





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Цитата(=GM= @ Jun 22 2010, 16:32) *
Сути чего?

сори, не правильно выразился, джиттер остается и в этом варианте
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 22 2010, 15:24
Сообщение #26


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Ну, при программном подходе джиттер будет всегда, вопрос состоит в том, удовлетворяет величина джиттера или нет?

Чтобы ваш вариант привести в божеский вид, надо работать и работать, например можно вычислять не длительность текущего периода 1 или 0, а сразу время его завершения. Тогда в цикле будет только сравнение, а не вычисление и сравнение. А это ого-го сколько времени для 8 каналов. Вот как-то так:

Код
if(PORTC & _BV(i))                    //if(PORTC & (1<<i))
{
  sysTime=(ulsysTime<<16)+TCNT1;
  if(sysTime>endTime[i])
  {
   PORTC &=~_BV(i);                    //PORTC &=~(1<<i);
   endTime[i]=sysTime+tLow[i];            //новое время завершения 0
  }
}
else
{
  sysTime=(ulsysTime<<16)+TCNT1;
  if(sysTime>endTime[i])
  {
   PORTC |=_BV(i);                    //PORTC |=(1<<i);
   endTime[i]=sysTime+tHigh[i];            //новое время завершения 1
  }
}


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
xemul
сообщение Jun 22 2010, 16:18
Сообщение #27



*****

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



Завести таймер на 5 мкс, в его прерывании делать только
Код
PORTC = tmpC;
Flag_5us = 1;

В основном цикле
Код
uint24_t ch1_cnt, ..., ch8_cnt; // uint24_t придумать, для счётчиков при 0.1 Гц и 5 мкс нужен 21 бит
                                // с uint32_t будут лишние считания
if(Flag_5us)
{
   if(!--ch1_cnt) { tmpC ^= 1; ch1_cnt = (tmpC & 1)? ch1_high_time: ch1_low_time; }
   if(!--ch2_cnt) { tmpC ^= 2; ch2_cnt = (tmpC & 2)? ch2_high_time: ch2_low_time; }
...
   if(!--ch8_cnt) { tmpC ^= 128; ch8_cnt = (tmpC & 128)? ch8_high_time: ch8_low_time; }
   Flag_5us = 0;
}

Но в 5 мкс (100 тактов на 20 МГц) if(Flag_5us) {...} всё равно не уложится, так что урезайте осетра по разрешению.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 23 2010, 18:26
Сообщение #28


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(xemul @ Jun 22 2010, 20:18) *
uint24_t ch1_cnt, ..., ch8_cnt; // uint24_t придумать, для счётчиков при 0.1 Гц и 5 мкс нужен 21 бит
это тока АСМ
Цитата
Но в 5 мкс (100 тактов на 20 МГц) if(Flag_5us) {...} всё равно не уложится, так что урезайте осетра по разрешению.
А мне вот кажется что на АСМ такое можно изобразить,
при этом осетра нужно урезать только в части возможности менять времена Ton Toff не на каждом цикле.
Ну и конечно все 8 каналов за 5мкс считать невозможно, нужно буферирование на 16 тиков по 5мкс
и рассчет не более 2х каналов за прерывание/тик.
Go to the top of the page
 
+Quote Post
Andruxa-1
сообщение Jun 24 2010, 14:33
Сообщение #29





Группа: Участник
Сообщений: 14
Регистрация: 28-05-10
Пользователь №: 57 586



Спасибо за ответы и подсказки, буду пробовать.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 24 2010, 21:04
Сообщение #30


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Кстати, задачка на самом деле очень интересная, и вполне решаемая...
Не забываем что Ton+Toff >= 100 тиков для каждого канал и такта 5мкс,
а всего смен значения порта за 100тиков не более 16
Ну и..., помойму это тот редкий случай когда вложенные прерывания могут быть очень даже к месту...
По моим прикидкам можно получить джиттер на каналах около 1-2мкс
ну и еще останется время на получение новых значений Ton/Toff сверху по уарту на 115200

Как-то так...
Go to the top of the page
 
+Quote Post

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

 


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


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