Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Генератор sin
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Схемотехника
Страницы: 1, 2
_Pasha
Цитата(KaMa3eR @ Jan 29 2010, 21:25) *
нужно сгородить ген синусоиды на частоту от 10Гц до 5кГц

С какой сеткой перестройки?
KaMa3eR
по 1 Гц если можно....
ткните еще носом в заполнение синуса на F=10 Гц и 10кГц естественно разное???
или не.. ???
Сергей Борщ
Цитата(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(;;)
    {
    }


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

далее по тексту программы
rezident
Цитата(KaMa3eR @ Jan 31 2010, 01:01) *
только маленькое уточнение Phase_delta равен величине предыдущего импульса
Вполне очевидно, что у Сергея Phase это фазовый аккумулятор, а Phase_delta - приращение (шаг приращения) фазы.
KaMa3eR
Снова возник вопрос как рассчитать заполнение и регулирование амплитуды на разных диапазанах частот
даташит по етому повуду
KaMa3eR
ну вот не прошло и несколько лет как практически готов ген синуса по Ридико..
Так вот вопросец возник такой
мега 16
частота 16Мгц

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

с переменной типа int accumulator, add_value, temp, accumulator; все ок, только смысла
с переменной типа float не помещается в прерывании...
OCR = 16E6/2*2^16 = 122,0703125
это значение должно быть больше значения времени обработки прерывания в тактах процессора
OCR1 = 122 (0x7A).....
Как быть ????Подскажите ПЛЗ..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.