| Форум РадиоКот 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/ |
|


