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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Генератор sin, mega8
Сергей Борщ
сообщение Jul 30 2009, 19:44
Сообщение #46


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(rezident @ Jul 30 2009, 13:42) *
Т.к. шаг приращения чаще всего представляет из себя дробное число. Лично я при расчете предпочитаю шаг приращения представлять целым числом. Соответственно вычисления индекса ведутся в целочисленной математике путем сложений, вычитаний и сдвигов.
Так что мешает использовать дробные числа с фиксированной точкой? У меня, например, фаза 16 бит, из старших восьми 6 используются как индекс таблицы и 2 старших как признаки инверсии индекса/выхода (квадрант).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Microwatt
сообщение Jul 30 2009, 20:43
Сообщение #47


Гуру
******

Группа: Почетный участник
Сообщений: 6 851
Регистрация: 25-08-08
Из: Запорожье
Пользователь №: 39 802



Впору Райкина вспоминать: "Столько образования на один бифштекс!!"
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 30 2009, 20:44
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Сергей Борщ @ Jul 31 2009, 01:44) *
Так что мешает использовать дробные числа с фиксированной точкой? У меня, например, фаза 16 бит, из старших восьми 6 используются как индекс таблицы и 2 старших как признаки инверсии индекса/выхода (квадрант).
В моих применениях максимальные выходные частоты небольшие, значение максимальной частоты известно, количество отсчетов (размер таблицы) тоже, поэтому устраивает тип long. Значение шага заранее умножено на требуемую степень двойки. Текущая фаза тоже в long хранится. Для вычисления индекса отсчета суммирую два long и делаю нужное количество сдвигов вправо. Вот и все вычисления. laughing.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 31 2009, 00:26
Сообщение #49


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(rezident @ Jul 30 2009, 23:44) *
Для вычисления индекса отсчета ... и делаю нужное количество сдвигов вправо.
Ну это же и есть "взять целую часть от числа с фиксированной точкой". Консенсус!


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Jan 29 2010, 18:25
Сообщение #50


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



Вери биг сенкс всем учавствовавшим, темка то что доктор прописал как раз то что меня интересует оч нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц . пофиг что пропал топик стартер, ему уже до лампы эта тема , но поверте многим нужна.
И еще небольшая просьба гуру: поделитесь кусочком кода на Си в теме формирования синуса , а то уже голову сломал подсказать некому, вот шляюсь по форумам , а тут такая тема... сорри что распыляюсь просто за 2 недели единственная толковая ветка.. 08.gif
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 30 2010, 02:10
Сообщение #51


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(KaMa3eR @ Jan 29 2010, 21:25) *
нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц

С какой сеткой перестройки?
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Jan 30 2010, 09:27
Сообщение #52


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



по 1 Гц если можно....
ткните еще носом в заполнение синуса на F=10 Гц и 10кГц естественно разное???
или не.. ???
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 30 2010, 11:26
Сообщение #53


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(KaMa3eR @ Jan 29 2010, 20:25) *
оч нужно сгородить ген
ему уже до лампы
или не..
???
На этом форуме принят более литературный вариант русского языка. Старайтесь придерживаться его, иначе вам просто не будут отвечать.

Код
#include    "avr/io.h"
#include    "avr/pgmspace.h"
#include    "avr/interrrupts.h"

uint8_t const PROGMEM Table[65] = // Таблица значений синуса от 0 до Пи/2 включительно. Диапазон значений от 0x80 до 0xFF
{
    .....
};

uint16_t Phase;         // 8.8 fixed point
uint16_t Phase_delta;   // 8.8 fixed point

static  uint8_t get_sinus()
{
    Table_index = (Phase >> 8) & 0x3F;
    if(Phase & (1<<14))
        Table_index = 64 - Table_index;
    uint8_t Result = pgm_read_byte(&Table[Table_index]);
    if(Phase & (1<<15))
        Result = 0x80 - Result;
    Phase += Phase_delta;
    return Result;
}

ISR(TIMER2_COMP_vect)
{
    OCR2 = get_sinus();
}

int main()
{
    // Fast PWM, T2CLK = F_CPU/32
    TCCR2 = (0<<FOC2)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(1<<CS21)|(1<<CS20);
    TIMSK = (1<<OCIE2);

    Phase_delta = 1234;

    sei();
    
    for(;;)
    {
    }


}
Это идея реализации. Как рассчитать приращение фазы и какой предделитель таймера вам лучше подойдет - разберитесь сами.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Jan 30 2010, 20:01
Сообщение #54


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



за конструктивную критику спасибо , учту, а за подсказку двойной СПАСИБО
суть движения уловил,
только маленькое уточнение Phase_delta равен величине предыдущего импульса
или фиксированная величина
uint16_t Phase; // 8.8 fixed point
uint16_t Phase_delta; // 8.8 fixed point

далее по тексту программы
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 30 2010, 20:18
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(KaMa3eR @ Jan 31 2010, 01:01) *
только маленькое уточнение Phase_delta равен величине предыдущего импульса
Вполне очевидно, что у Сергея Phase это фазовый аккумулятор, а Phase_delta - приращение (шаг приращения) фазы.
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Feb 14 2010, 10:20
Сообщение #56


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



Снова возник вопрос как рассчитать заполнение и регулирование амплитуды на разных диапазанах частот
даташит по етому повуду
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Jun 26 2011, 18:49
Сообщение #57


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



ну вот не прошло и несколько лет как практически готов ген синуса по Ридико..
Так вот вопросец возник такой
мега 16
частота 16Мгц

------------
accumulator += add_value;
temp = accumulator;

с переменной типа int accumulator, add_value, temp, accumulator; все ок, только смысла
с переменной типа float не помещается в прерывании...
OCR = 16E6/2*2^16 = 122,0703125
это значение должно быть больше значения времени обработки прерывания в тактах процессора
OCR1 = 122 (0x7A).....
Как быть ????Подскажите ПЛЗ..
Go to the top of the page
 
+Quote Post

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

 


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


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