|
|
  |
Генератор sin, mega8 |
|
|
|
Jan 29 2010, 18:25
|
Участник

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

|
Вери биг сенкс всем учавствовавшим, темка то что доктор прописал как раз то что меня интересует оч нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц . пофиг что пропал топик стартер, ему уже до лампы эта тема , но поверте многим нужна. И еще небольшая просьба гуру: поделитесь кусочком кода на Си в теме формирования синуса , а то уже голову сломал подсказать некому, вот шляюсь по форумам , а тут такая тема... сорри что распыляюсь просто за 2 недели единственная толковая ветка..
|
|
|
|
|
Jan 30 2010, 09:27
|
Участник

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

|
по 1 Гц если можно.... ткните еще носом в заполнение синуса на F=10 Гц и 10кГц естественно разное??? или не.. ???
|
|
|
|
|
Jan 30 2010, 11:26
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 30 2010, 20:01
|
Участник

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

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

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

|
Снова возник вопрос как рассчитать заполнение и регулирование амплитуды на разных диапазанах частот даташит по етому повуду
|
|
|
|
|
Jun 26 2011, 18:49
|
Участник

Группа: Участник
Сообщений: 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)..... Как быть ????Подскажите ПЛЗ..
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|