Генерация меандра на Mega
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
Генерация меандра на Mega
Я делаю умножитель импульсов на mega8, и возникли некоторые вопросы.
Считаю входные импульсы и опорные (метод временных ворот). Получаю частоту входного сигнала (да, отмечу, входной сигнал - меандр).
Потом операции с вычисленной цифрой (умножение).
Собственно вопрос, как выводить импульсы нужной частоты ? Как я понимаю ШИМ регистр использовать не получится, его частота определяется только делителем ШИМ.
А выводить PORTx.x = 1; delay_ms (period); PORTx.x = 0; - не очень красивый вариант. Да и будут моменты, когда период будет плавать из-за возникновения прерывания. Хотя, на тех частотах (у меня на входе от 6Гц до 100Гц, коэффициент умножения от 0,1 до 5, т.е. на выходе не более 500Гц) плавание периодна +- с десяток микросекунд совершенно не критичен.
А вопрос в том, как реализовать это красиво? правильно...
Считаю входные импульсы и опорные (метод временных ворот). Получаю частоту входного сигнала (да, отмечу, входной сигнал - меандр).
Потом операции с вычисленной цифрой (умножение).
Собственно вопрос, как выводить импульсы нужной частоты ? Как я понимаю ШИМ регистр использовать не получится, его частота определяется только делителем ШИМ.
А выводить PORTx.x = 1; delay_ms (period); PORTx.x = 0; - не очень красивый вариант. Да и будут моменты, когда период будет плавать из-за возникновения прерывания. Хотя, на тех частотах (у меня на входе от 6Гц до 100Гц, коэффициент умножения от 0,1 до 5, т.е. на выходе не более 500Гц) плавание периодна +- с десяток микросекунд совершенно не критичен.
А вопрос в том, как реализовать это красиво? правильно...
Re: Генерация меандра на Mega
Правильно реализовать это на таймере в режиме генерации частоты. ШИМ тут ни при чем.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Генерация меандра на Mega
Ser60, у меги8 разве есть такой аппаратный режим?
Мне кажется тут надо таймером только интервалы отмерять (например 1мс), а генерацию программно реализовывать.
при таймере 1мс - период генерируемого сигнала будет кратен 1мс.
Мне кажется тут надо таймером только интервалы отмерять (например 1мс), а генерацию программно реализовывать.
при таймере 1мс - период генерируемого сигнала будет кратен 1мс.
Ставим плюсы: )
Re: Генерация меандра на Mega
если нуна точность и малый шаг перестройки частоты - делайте программный DDS
Re: Генерация меандра на Mega
А чем CTC режим совместно с Toggle on Compare Match не угодил? Как раз меандр будет.
Про про требуемую точность и, соответственно, применимость конкретного способа - это автору темы видней.
Про про требуемую точность и, соответственно, применимость конкретного способа - это автору темы видней.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Генерация меандра на Mega
ibiza11 писал(а):у меги8 разве есть такой аппаратный режим?
Извиняюсь, что пространно выразился, но я имел в виду именно CTC режим как описал выше Kavka. ТС вместо измерения входной частоты следует измерять ее период, затем делить его на множитель и полученную величину использовать для вычисления полупериода генерируемой частоты таймером. Конечно, из-за ошибок оккругления при делении изменять генерируемую частоту можно будет только с некоторым дискретом.
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
Re: Генерация меандра на Mega
А где можно прочитать статеечку про конфигурирование СТС ? Меня немного в тупик поставили overflow interrupt, compare interrupt, timer value, compare...
Re: Генерация меандра на Mega
По мне, режим CTC здесь не нужен. Делаю так, правда для ATtiny2313(AT90S2313), для mega8 будет примерно так же.

Спойлер
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
Re: Генерация меандра на Mega
akl, все бы хорошо, только я asm не знаю ))) только на C. Расскажите алгоритм...
Re: Генерация меандра на Mega
Symbiosis писал(а):А где можно прочитать статеечку про конфигурирование СТС ?
Исчерпывающая информация по режимам таймера находится в ДШ. Кроме того, по AVR8 имеется много книг на русском. Выбирайте любую.
Re: Генерация меандра на Mega
Ничего сложного. Алгоритм основан на предположении, что множитель может быть представлен простой дробью, в числителе (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 писал(а):...Расскажите алгоритм...
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
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
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Генерация меандра на Mega
а как должен работать ваш код?
я вижу программную генерацию импульсов на ноге PORTB.2, период зависит от переменной temp. Но я не вижу, где в вашей программе задается этот temp.
я вижу программную генерацию импульсов на ноге PORTB.2, период зависит от переменной temp. Но я не вижу, где в вашей программе задается этот temp.
Ставим плюсы: )
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
Re: Генерация меандра на Mega
Вот здесь
Код: Выделить всё
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
я не вижу ни одной операции присвоения значения переменной temp
Ставим плюсы: )
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
Re: Генерация меандра на Mega
Бугага. Тогда другой вопрос, почему оно работает но глючно 
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
Re: Генерация меандра на Mega
заработало )
- Symbiosis
- Вымогатель припоя
- Сообщения: 600
- Зарегистрирован: Вс апр 27, 2008 13:44:52
- Контактная информация:
Re: Генерация меандра на Mega
В общем рано обрадовался...
Глюк алгоритмический. В общем пока на входе есть импульсы на выходе все красиво. Как только на вход ничего не идёт, на выходе меандр 58кГц. Подсобите , как сделать
Глюк алгоритмический. В общем пока на входе есть импульсы на выходе все красиво. Как только на вход ничего не идёт, на выходе меандр 58кГц. Подсобите , как сделать
- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: Генерация меандра на Mega
Как вариант, контролировать текущий массив входных измерений.
Только нужно учесть скорость изменения входной частоты...
Это традиционная сигнальная задача фильтрации...
Только нужно учесть скорость изменения входной частоты...
Это традиционная сигнальная задача фильтрации...
Re: Генерация меандра на Mega
Symbiosis писал(а):Я делаю умножитель импульсов на mega8
Извращение какое-то.
А вопрос в том, как реализовать это красиво? правильно...
Красиво и правильно будет использование DDS с управлением от mega8. В крайнем случае можно использовать внутренний СТС, но спектр там будет тот еще.