Страница 1 из 2
Генерация меандра на Mega
Добавлено: Пт июн 21, 2013 03:55:22
Symbiosis
Я делаю умножитель импульсов на mega8, и возникли некоторые вопросы.
Считаю входные импульсы и опорные (метод временных ворот). Получаю частоту входного сигнала (да, отмечу, входной сигнал - меандр).
Потом операции с вычисленной цифрой (умножение).
Собственно вопрос, как выводить импульсы нужной частоты ? Как я понимаю ШИМ регистр использовать не получится, его частота определяется только делителем ШИМ.
А выводить PORTx.x = 1; delay_ms (period); PORTx.x = 0; - не очень красивый вариант. Да и будут моменты, когда период будет плавать из-за возникновения прерывания. Хотя, на тех частотах (у меня на входе от 6Гц до 100Гц, коэффициент умножения от 0,1 до 5, т.е. на выходе не более 500Гц) плавание периодна +- с десяток микросекунд совершенно не критичен.
А вопрос в том, как реализовать это красиво? правильно...
Re: Генерация меандра на Mega
Добавлено: Пт июн 21, 2013 04:00:29
Ser60
Правильно реализовать это на таймере в режиме генерации частоты. ШИМ тут ни при чем.
Re: Генерация меандра на Mega
Добавлено: Пт июн 21, 2013 08:55:39
ibiza11
Ser60, у меги8 разве есть такой аппаратный режим?
Мне кажется тут надо таймером только интервалы отмерять (например 1мс), а генерацию программно реализовывать.
при таймере 1мс - период генерируемого сигнала будет кратен 1мс.
Re: Генерация меандра на Mega
Добавлено: Пт июн 21, 2013 09:27:35
polyname
если нуна точность и малый шаг перестройки частоты - делайте программный DDS
Re: Генерация меандра на Mega
Добавлено: Пт июн 21, 2013 09:42:49
Kavka
А чем CTC режим совместно с Toggle on Compare Match не угодил? Как раз меандр будет.
Про про требуемую точность и, соответственно, применимость конкретного способа - это автору темы видней.
Re: Генерация меандра на Mega
Добавлено: Пт июн 21, 2013 19:04:08
Ser60
ibiza11 писал(а):у меги8 разве есть такой аппаратный режим?
Извиняюсь, что пространно выразился, но я имел в виду именно CTC режим как описал выше
Kavka. ТС вместо измерения входной частоты следует измерять ее период, затем делить его на множитель и полученную величину использовать для вычисления полупериода генерируемой частоты таймером. Конечно, из-за ошибок оккругления при делении изменять генерируемую частоту можно будет только с некоторым дискретом.
Re: Генерация меандра на Mega
Добавлено: Пн июн 24, 2013 12:18:42
Symbiosis
А где можно прочитать статеечку про конфигурирование СТС ? Меня немного в тупик поставили overflow interrupt, compare interrupt, timer value, compare...
Re: Генерация меандра на Mega
Добавлено: Пн июн 24, 2013 13:37:30
akl
По мне, режим CTC здесь не нужен. Делаю так, правда для ATtiny2313(AT90S2313), для mega8 будет примерно так же.
Спойлер

Re: Генерация меандра на Mega
Добавлено: Пн июн 24, 2013 16:22:43
Symbiosis
akl, все бы хорошо, только я asm не знаю ))) только на C. Расскажите алгоритм...
Re: Генерация меандра на Mega
Добавлено: Пн июн 24, 2013 18:20:28
Ser60
Symbiosis писал(а):А где можно прочитать статеечку про конфигурирование СТС ?
Исчерпывающая информация по режимам таймера находится в ДШ. Кроме того, по AVR8 имеется много книг на русском. Выбирайте любую.
Re: Генерация меандра на Mega
Добавлено: Вт июн 25, 2013 06:28:51
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 запускается вначале формирования выходного импульса и при переполнении формирует конец импульса. Из вышеописанного Вы самостоятельно можете сформировать меандр.

Re: Генерация меандра на Mega
Добавлено: Ср апр 09, 2014 06:48:12
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);
};
}
Re: Генерация меандра на Mega
Добавлено: Ср апр 09, 2014 09:09:32
ibiza11
а как должен работать ваш код?
я вижу программную генерацию импульсов на ноге PORTB.2, период зависит от переменной temp. Но я не вижу, где в вашей программе задается этот temp.
Re: Генерация меандра на Mega
Добавлено: Ср апр 09, 2014 09:13:39
Symbiosis
Вот здесь
Код: Выделить всё
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (timer == 59) {
RP100MS = temp;
timer = 0;
RP100MS = 0;
}
else {
timer++;
};
}
Re: Генерация меандра на Mega
Добавлено: Ср апр 09, 2014 09:16:34
ibiza11

гениально!
я не вижу ни одной операции присвоения значения переменной temp
Re: Генерация меандра на Mega
Добавлено: Ср апр 09, 2014 09:23:32
Symbiosis
Бугага. Тогда другой вопрос, почему оно работает но глючно

Re: Генерация меандра на Mega
Добавлено: Ср апр 09, 2014 09:25:12
Symbiosis
заработало )
Re: Генерация меандра на Mega
Добавлено: Чт апр 10, 2014 02:43:26
Symbiosis
В общем рано обрадовался...
Глюк алгоритмический. В общем пока на входе есть импульсы на выходе все красиво. Как только на вход ничего не идёт, на выходе меандр 58кГц. Подсобите , как сделать
Re: Генерация меандра на Mega
Добавлено: Чт апр 10, 2014 05:07:05
КРАМ
Как вариант, контролировать текущий массив входных измерений.
Только нужно учесть скорость изменения входной частоты...
Это традиционная сигнальная задача фильтрации...
Re: Генерация меандра на Mega
Добавлено: Чт апр 10, 2014 08:14:55
Elvys
Symbiosis писал(а):Я делаю умножитель импульсов на mega8
Извращение какое-то.
А вопрос в том, как реализовать это красиво? правильно...
Красиво и правильно будет использование DDS с управлением от mega8. В крайнем случае можно использовать внутренний СТС, но спектр там будет тот еще.