Генерация меандра на Mega

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Генерация меандра на Mega

Сообщение Symbiosis »

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

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

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

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

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

А вопрос в том, как реализовать это красиво? правильно...
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Генерация меандра на Mega

Сообщение Ser60 »

Правильно реализовать это на таймере в режиме генерации частоты. ШИМ тут ни при чем.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Генерация меандра на Mega

Сообщение ibiza11 »

Ser60, у меги8 разве есть такой аппаратный режим?
Мне кажется тут надо таймером только интервалы отмерять (например 1мс), а генерацию программно реализовывать.
при таймере 1мс - период генерируемого сигнала будет кратен 1мс.
Ставим плюсы: )
polyname
Прорезались зубы
Сообщения: 249
Зарегистрирован: Пт май 18, 2012 23:12:23

Re: Генерация меандра на Mega

Сообщение polyname »

если нуна точность и малый шаг перестройки частоты - делайте программный DDS
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Генерация меандра на Mega

Сообщение Kavka »

А чем CTC режим совместно с Toggle on Compare Match не угодил? Как раз меандр будет.
Про про требуемую точность и, соответственно, применимость конкретного способа - это автору темы видней.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Генерация меандра на Mega

Сообщение Ser60 »

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

Извиняюсь, что пространно выразился, но я имел в виду именно CTC режим как описал выше Kavka. ТС вместо измерения входной частоты следует измерять ее период, затем делить его на множитель и полученную величину использовать для вычисления полупериода генерируемой частоты таймером. Конечно, из-за ошибок оккругления при делении изменять генерируемую частоту можно будет только с некоторым дискретом.
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Re: Генерация меандра на Mega

Сообщение Symbiosis »

А где можно прочитать статеечку про конфигурирование СТС ? Меня немного в тупик поставили overflow interrupt, compare interrupt, timer value, compare...
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Генерация меандра на Mega

Сообщение akl »

По мне, режим CTC здесь не нужен. Делаю так, правда для ATtiny2313(AT90S2313), для mega8 будет примерно так же.
СпойлерИзображение
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Re: Генерация меандра на Mega

Сообщение Symbiosis »

akl, все бы хорошо, только я asm не знаю ))) только на C. Расскажите алгоритм...
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3780
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: Генерация меандра на Mega

Сообщение Ser60 »

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

Исчерпывающая информация по режимам таймера находится в ДШ. Кроме того, по AVR8 имеется много книг на русском. Выбирайте любую.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Генерация меандра на Mega

Сообщение akl »

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
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Re: Генерация меандра на Mega

Сообщение Symbiosis »

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

Код: Выделить всё

#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
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Генерация меандра на Mega

Сообщение ibiza11 »

а как должен работать ваш код?
я вижу программную генерацию импульсов на ноге PORTB.2, период зависит от переменной temp. Но я не вижу, где в вашей программе задается этот temp.
Ставим плюсы: )
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Re: Генерация меандра на Mega

Сообщение Symbiosis »

Вот здесь

Код: Выделить всё

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (timer == 59) {
        RP100MS = temp;
        timer = 0;     
        RP100MS = 0;
        }
else {
timer++;
};
}
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Генерация меандра на Mega

Сообщение ibiza11 »

:))) гениально!
я не вижу ни одной операции присвоения значения переменной temp
Ставим плюсы: )
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Re: Генерация меандра на Mega

Сообщение Symbiosis »

Бугага. Тогда другой вопрос, почему оно работает но глючно :)))
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Re: Генерация меандра на Mega

Сообщение Symbiosis »

заработало )
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Re: Генерация меандра на Mega

Сообщение Symbiosis »

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

Глюк алгоритмический. В общем пока на входе есть импульсы на выходе все красиво. Как только на вход ничего не идёт, на выходе меандр 58кГц. Подсобите , как сделать
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25121
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Генерация меандра на Mega

Сообщение КРАМ »

Как вариант, контролировать текущий массив входных измерений.
Только нужно учесть скорость изменения входной частоты...
Это традиционная сигнальная задача фильтрации...
Elvys
Прорезались зубы
Сообщения: 206
Зарегистрирован: Пт мар 14, 2014 19:36:10

Re: Генерация меандра на Mega

Сообщение Elvys »

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

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

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

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

Вернуться в «AVR»