Перейти к содержанию
    

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Впору Райкина вспоминать: "Столько образования на один бифштекс!!"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что мешает использовать дробные числа с фиксированной точкой? У меня, например, фаза 16 бит, из старших восьми 6 используются как индекс таблицы и 2 старших как признаки инверсии индекса/выхода (квадрант).
В моих применениях максимальные выходные частоты небольшие, значение максимальной частоты известно, количество отсчетов (размер таблицы) тоже, поэтому устраивает тип long. Значение шага заранее умножено на требуемую степень двойки. Текущая фаза тоже в long хранится. Для вычисления индекса отсчета суммирую два long и делаю нужное количество сдвигов вправо. Вот и все вычисления. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для вычисления индекса отсчета ... и делаю нужное количество сдвигов вправо.
Ну это же и есть "взять целую часть от числа с фиксированной точкой". Консенсус!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вери биг сенкс всем учавствовавшим, темка то что доктор прописал как раз то что меня интересует оч нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц . пофиг что пропал топик стартер, ему уже до лампы эта тема , но поверте многим нужна.

И еще небольшая просьба гуру: поделитесь кусочком кода на Си в теме формирования синуса , а то уже голову сломал подсказать некому, вот шляюсь по форумам , а тут такая тема... сорри что распыляюсь просто за 2 недели единственная толковая ветка.. :08:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц

С какой сеткой перестройки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

по 1 Гц если можно....

ткните еще носом в заполнение синуса на F=10 Гц и 10кГц естественно разное???

или не.. ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

оч нужно сгородить ген

ему уже до лампы

или не..

???

На этом форуме принят более литературный вариант русского языка. Старайтесь придерживаться его, иначе вам просто не будут отвечать.

 

#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(;;)
    {
    }


}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

за конструктивную критику спасибо , учту, а за подсказку двойной СПАСИБО

суть движения уловил,

только маленькое уточнение Phase_delta равен величине предыдущего импульса

или фиксированная величина

uint16_t Phase; // 8.8 fixed point

uint16_t Phase_delta; // 8.8 fixed point

 

далее по тексту программы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

только маленькое уточнение Phase_delta равен величине предыдущего импульса
Вполне очевидно, что у Сергея Phase это фазовый аккумулятор, а Phase_delta - приращение (шаг приращения) фазы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Снова возник вопрос как рассчитать заполнение и регулирование амплитуды на разных диапазанах частот

даташит по етому повуду

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну вот не прошло и несколько лет как практически готов ген синуса по Ридико..

Так вот вопросец возник такой

мега 16

частота 16Мгц

------------

accumulator += add_value;

temp = accumulator;

 

с переменной типа int accumulator, add_value, temp, accumulator; все ок, только смысла

с переменной типа float не помещается в прерывании...

OCR = 16E6/2*2^16 = 122,0703125

это значение должно быть больше значения времени обработки прерывания в тактах процессора

OCR1 = 122 (0x7A).....

Как быть ????Подскажите ПЛЗ..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...