Например TDA7294

Форум РадиоКот :: Просмотр темы - Генерация меандра на Mega
Форум РадиоКот
https://radiokot.ru/forum/

Генерация меандра на Mega
https://radiokot.ru/forum/viewtopic.php?f=57&t=91153
Страница 1 из 2

Автор:  Symbiosis [ Пт июн 21, 2013 03:55:22 ]
Заголовок сообщения:  Генерация меандра на Mega

Я делаю умножитель импульсов на mega8, и возникли некоторые вопросы.

Считаю входные импульсы и опорные (метод временных ворот). Получаю частоту входного сигнала (да, отмечу, входной сигнал - меандр).

Потом операции с вычисленной цифрой (умножение).

Собственно вопрос, как выводить импульсы нужной частоты ? Как я понимаю ШИМ регистр использовать не получится, его частота определяется только делителем ШИМ.

А выводить PORTx.x = 1; delay_ms (period); PORTx.x = 0; - не очень красивый вариант. Да и будут моменты, когда период будет плавать из-за возникновения прерывания. Хотя, на тех частотах (у меня на входе от 6Гц до 100Гц, коэффициент умножения от 0,1 до 5, т.е. на выходе не более 500Гц) плавание периодна +- с десяток микросекунд совершенно не критичен.

А вопрос в том, как реализовать это красиво? правильно...

Автор:  Ser60 [ Пт июн 21, 2013 04:00:29 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Правильно реализовать это на таймере в режиме генерации частоты. ШИМ тут ни при чем.

Автор:  ibiza11 [ Пт июн 21, 2013 08:55:39 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Ser60, у меги8 разве есть такой аппаратный режим?
Мне кажется тут надо таймером только интервалы отмерять (например 1мс), а генерацию программно реализовывать.
при таймере 1мс - период генерируемого сигнала будет кратен 1мс.

Автор:  polyname [ Пт июн 21, 2013 09:27:35 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

если нуна точность и малый шаг перестройки частоты - делайте программный DDS

Автор:  Kavka [ Пт июн 21, 2013 09:42:49 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

А чем CTC режим совместно с Toggle on Compare Match не угодил? Как раз меандр будет.
Про про требуемую точность и, соответственно, применимость конкретного способа - это автору темы видней.

Автор:  Ser60 [ Пт июн 21, 2013 19:04:08 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

ibiza11 писал(а):
у меги8 разве есть такой аппаратный режим?

Извиняюсь, что пространно выразился, но я имел в виду именно CTC режим как описал выше Kavka. ТС вместо измерения входной частоты следует измерять ее период, затем делить его на множитель и полученную величину использовать для вычисления полупериода генерируемой частоты таймером. Конечно, из-за ошибок оккругления при делении изменять генерируемую частоту можно будет только с некоторым дискретом.

Автор:  Symbiosis [ Пн июн 24, 2013 12:18:42 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

А где можно прочитать статеечку про конфигурирование СТС ? Меня немного в тупик поставили overflow interrupt, compare interrupt, timer value, compare...

Автор:  akl [ Пн июн 24, 2013 13:37:30 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

По мне, режим CTC здесь не нужен. Делаю так, правда для ATtiny2313(AT90S2313), для mega8 будет примерно так же.
СпойлерИзображение

Автор:  Symbiosis [ Пн июн 24, 2013 16:22:43 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

akl, все бы хорошо, только я asm не знаю ))) только на C. Расскажите алгоритм...

Автор:  Ser60 [ Пн июн 24, 2013 18:20:28 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Symbiosis писал(а):
А где можно прочитать статеечку про конфигурирование СТС ?

Исчерпывающая информация по режимам таймера находится в ДШ. Кроме того, по AVR8 имеется много книг на русском. Выбирайте любую.

Автор:  akl [ Вт июн 25, 2013 06:28:51 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Symbiosis писал(а):
...Расскажите алгоритм...
Ничего сложного. Алгоритм основан на предположении, что множитель может быть представлен простой дробью, в числителе (N) и знаменателе (M) которого стоят целые числа. Для Вашего случая при множителе 0,1 (10/1 для периода, т.е. N=10, M=1) отсчитываются 10 входных периодов, а на выходе должен сформироваться 1 выходной период. Для множителя 5 (1/5 для периода, т.е. N=1, M=5)на каждый входной период формируется 5 выходных периодов. Для реализации этого алгоритма задействован Т1 с использованием прерываний захвата, переполнения и сравнения. Прерывания переполнения Т0 просто формируют импульс на выходе схемы. Замечу, Т1 запускается один раз и далее никогда не останавливается. Т0 запускается вначале формирования выходного импульса и при переполнении формирует конец импульса. Из вышеописанного Вы самостоятельно можете сформировать меандр. :)

Автор:  Symbiosis [ Ср апр 09, 2014 06:48:12 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Почему может не работать ? То нормально работает, то тупит контроллер.

Код:
#include <tiny13.h>
#include <delay.h>   

unsigned int RP100MS = 0;
unsigned int timer = 0;
unsigned int temp = 0;
unsigned int calc = 0;

// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
RP100MS++;
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (timer == 59) {
        RP100MS = temp;
        timer = 0;     
        RP100MS = 0;
        }
else {
timer++;
};
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=Out Func1=In Func0=In
// State5=T State4=T State3=T State2=0 State1=T State0=T
PORTB=0x00;
DDRB=0x04;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 150.000 kHz
// Mode: Normal top=FFh
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x40;
MCUCR=0x02;
GIFR=0x40;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// Global enable interrupts
#asm("sei")

while (1)
      {   
      calc = temp/1,25 // ((temp / 0,5) /2,5) пауза половину периода и коэффициент деления
     
      PORTB.2 = 0;
      delay_ms(calc);
      PORTB.2 = 1;
      delay_ms(calc);

      };
}

Автор:  ibiza11 [ Ср апр 09, 2014 09:09:32 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

а как должен работать ваш код?
я вижу программную генерацию импульсов на ноге PORTB.2, период зависит от переменной temp. Но я не вижу, где в вашей программе задается этот temp.

Автор:  Symbiosis [ Ср апр 09, 2014 09:13:39 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Вот здесь

Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (timer == 59) {
        RP100MS = temp;
        timer = 0;     
        RP100MS = 0;
        }
else {
timer++;
};
}

Автор:  ibiza11 [ Ср апр 09, 2014 09:16:34 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

:))) гениально!
я не вижу ни одной операции присвоения значения переменной temp

Автор:  Symbiosis [ Ср апр 09, 2014 09:23:32 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Бугага. Тогда другой вопрос, почему оно работает но глючно :)))

Автор:  Symbiosis [ Ср апр 09, 2014 09:25:12 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

заработало )

Автор:  Symbiosis [ Чт апр 10, 2014 02:43:26 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

В общем рано обрадовался...

Глюк алгоритмический. В общем пока на входе есть импульсы на выходе все красиво. Как только на вход ничего не идёт, на выходе меандр 58кГц. Подсобите , как сделать

Автор:  КРАМ [ Чт апр 10, 2014 05:07:05 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Как вариант, контролировать текущий массив входных измерений.
Только нужно учесть скорость изменения входной частоты...
Это традиционная сигнальная задача фильтрации...

Автор:  Elvys [ Чт апр 10, 2014 08:14:55 ]
Заголовок сообщения:  Re: Генерация меандра на Mega

Symbiosis писал(а):
Я делаю умножитель импульсов на mega8

Извращение какое-то.

Цитата:
А вопрос в том, как реализовать это красиво? правильно...

Красиво и правильно будет использование DDS с управлением от mega8. В крайнем случае можно использовать внутренний СТС, но спектр там будет тот еще.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/