Сергей Борщ 123 30 июля, 2009 Опубликовано 30 июля, 2009 · Жалоба Т.к. шаг приращения чаще всего представляет из себя дробное число. Лично я при расчете предпочитаю шаг приращения представлять целым числом. Соответственно вычисления индекса ведутся в целочисленной математике путем сложений, вычитаний и сдвигов.Так что мешает использовать дробные числа с фиксированной точкой? У меня, например, фаза 16 бит, из старших восьми 6 используются как индекс таблицы и 2 старших как признаки инверсии индекса/выхода (квадрант). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Microwatt 2 30 июля, 2009 Опубликовано 30 июля, 2009 · Жалоба Впору Райкина вспоминать: "Столько образования на один бифштекс!!" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 30 июля, 2009 Опубликовано 30 июля, 2009 · Жалоба Так что мешает использовать дробные числа с фиксированной точкой? У меня, например, фаза 16 бит, из старших восьми 6 используются как индекс таблицы и 2 старших как признаки инверсии индекса/выхода (квадрант).В моих применениях максимальные выходные частоты небольшие, значение максимальной частоты известно, количество отсчетов (размер таблицы) тоже, поэтому устраивает тип long. Значение шага заранее умножено на требуемую степень двойки. Текущая фаза тоже в long хранится. Для вычисления индекса отсчета суммирую два long и делаю нужное количество сдвигов вправо. Вот и все вычисления. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 31 июля, 2009 Опубликовано 31 июля, 2009 · Жалоба Для вычисления индекса отсчета ... и делаю нужное количество сдвигов вправо.Ну это же и есть "взять целую часть от числа с фиксированной точкой". Консенсус! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 29 января, 2010 Опубликовано 29 января, 2010 · Жалоба Вери биг сенкс всем учавствовавшим, темка то что доктор прописал как раз то что меня интересует оч нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц . пофиг что пропал топик стартер, ему уже до лампы эта тема , но поверте многим нужна. И еще небольшая просьба гуру: поделитесь кусочком кода на Си в теме формирования синуса , а то уже голову сломал подсказать некому, вот шляюсь по форумам , а тут такая тема... сорри что распыляюсь просто за 2 недели единственная толковая ветка.. :08: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 30 января, 2010 Опубликовано 30 января, 2010 · Жалоба нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц С какой сеткой перестройки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 30 января, 2010 Опубликовано 30 января, 2010 · Жалоба по 1 Гц если можно.... ткните еще носом в заполнение синуса на F=10 Гц и 10кГц естественно разное??? или не.. ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 30 января, 2010 Опубликовано 30 января, 2010 · Жалоба оч нужно сгородить ген ему уже до лампы или не.. ??? На этом форуме принят более литературный вариант русского языка. Старайтесь придерживаться его, иначе вам просто не будут отвечать. #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(;;) { } } Это идея реализации. Как рассчитать приращение фазы и какой предделитель таймера вам лучше подойдет - разберитесь сами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 30 января, 2010 Опубликовано 30 января, 2010 · Жалоба за конструктивную критику спасибо , учту, а за подсказку двойной СПАСИБО суть движения уловил, только маленькое уточнение Phase_delta равен величине предыдущего импульса или фиксированная величина uint16_t Phase; // 8.8 fixed point uint16_t Phase_delta; // 8.8 fixed point далее по тексту программы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 30 января, 2010 Опубликовано 30 января, 2010 · Жалоба только маленькое уточнение Phase_delta равен величине предыдущего импульсаВполне очевидно, что у Сергея Phase это фазовый аккумулятор, а Phase_delta - приращение (шаг приращения) фазы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 14 февраля, 2010 Опубликовано 14 февраля, 2010 · Жалоба Снова возник вопрос как рассчитать заполнение и регулирование амплитуды на разных диапазанах частот даташит по етому повуду Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 26 июня, 2011 Опубликовано 26 июня, 2011 · Жалоба ну вот не прошло и несколько лет как практически готов ген синуса по Ридико.. Так вот вопросец возник такой мега 16 частота 16Мгц ------------ accumulator += add_value; temp = accumulator; с переменной типа int accumulator, add_value, temp, accumulator; все ок, только смысла с переменной типа float не помещается в прерывании... OCR = 16E6/2*2^16 = 122,0703125 это значение должно быть больше значения времени обработки прерывания в тактах процессора OCR1 = 122 (0x7A)..... Как быть ????Подскажите ПЛЗ.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться