|
Генерация сигнала прямоугольной формы, реалиация линейного изменения |
|
|
|
Aug 29 2008, 02:20
|

Частый гость
 
Группа: Свой
Сообщений: 130
Регистрация: 8-08-08
Из: Новосибирск
Пользователь №: 39 488

|
Цитата(KSN @ Aug 29 2008, 07:55)  Необходимо генерить сигнал прямоугольной формы. Частота меняется линейно от 0 Гц до 200 кГц. Какие есть подходы для реализации? Самое простое: использовать 2 таймера, таймер1 - остчитывает тики t, таймер2 - в режиме ШИМ с изменением периода(скважность постоянная). По каждому тику таймера один вычисляю частоту, записываю ее в таймер2(разрешаю для него прерывания, по срабатыванию которого период изменится). Есть одно но: допустим рассчитанная частота 100 Гц(10мс), а период таймера1 - 1 мс, получится, что таймер 1 в "холостую" отработает 10 тактов, на 10-ом вычислит новую частоту и запишет ее в таймер2. Как обойти это? Я бы взял маааленькую плисину подовал на неё значение частоты от МК. 200кГц на АВР сгенерировать достаточно гиморойно да и с плавностью регулировки частоты проблемы будут.
|
|
|
|
|
Aug 29 2008, 02:47
|
Местный
  
Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304

|
Цитата(rezident @ Aug 29 2008, 08:57)  Сначала уточните с какой точностью нужно формировать частоту? Или это не периодическая частота, а сигналы произвольной длительности? Точность формирования частоты может быть в пределах: от +-1 до +-10 Гц. Цитата(igorenja @ Aug 29 2008, 09:20)  Я бы взял маааленькую плисину подовал на неё значение частоты от МК. 200кГц на АВР сгенерировать достаточно гиморойно да и с плавностью регулировки частоты проблемы будут. Генерация 200кГц для АВР не проблема.
|
|
|
|
|
Aug 29 2008, 05:14
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(KSN @ Aug 29 2008, 06:47)  Точность формирования частоты может быть в пределах: от +-1 до +-10 Гц. Генерация 200кГц для АВР не проблема. Напрасно Вы так думаете. С помощью таймера на частоте 200КГц разрешение в +-10Гц получить не удастся. Вам даже разрешения в 1КГц не достичь.
|
|
|
|
|
Aug 29 2008, 05:48
|
Местный
  
Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304

|
Цитата(Qwertty @ Aug 29 2008, 12:14)  Напрасно Вы так думаете. С помощью таймера на частоте 200КГц разрешение в +-10Гц получить не удастся. Вам даже разрешения в 1КГц не достичь. Фраза "генерация 200кГц на АВР не проблема" относится только к возможности генерации такого сигнала. Линейно изменять с точностью 10Гц - да, невозможно. Буду рассматривать возможность изменения частоты с большим шагом.
|
|
|
|
|
Aug 29 2008, 09:13
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(rx3apf @ Aug 29 2008, 07:29)  Возможно и 10 Hz, и 1 Hz, и даже доли Hz. Вот только форма при этом будет далека от меандра. Можно сделать извращенный вариант - программный DDS, фильтр, а потом поставить компаратор... Почему же извращённый? Это единственный вариант на авр, дешёвый к тому же. Недавно прорабатывал вариант НЧ свип-генератора синусоидального сигнала 0,3 Гц-500кГц на таком принципе, пмсм получалось неплохо, правда, руки пока не дошли до реализации в железе. Частота выдачи самплов составляла 4000 кГц со скоростью перестройки частоты от 0.3 Гц и выше за период. Если без перестройки то можно было увеличить частоту выборки до 5000 кГц.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 29 2008, 09:39
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(SasaVitebsk @ Aug 29 2008, 08:25)  однокристалка может использоваться в качестве измерителя-подстройщика Автору нужна перестройка частоты, поэтому МК будет сильно занят вычислением и установкой очередного номинала частоты. Цитата(SasaVitebsk @ Aug 29 2008, 08:25)  Если это единственная задача однокристалки, - то вполне реально её воплотить. В максимуме частоты на 16М получается 80 тактов. Это более чем достаточно. Процент точности здесь очевиден А здесь не понял ничего, какие 80 тактов, куда их прикладывать? Чтобы сгенерить нормальный синус, надо не менее 8-10 выборок на период. Для выходной частоты 200 кГц частота выборок составит не менее 1600-2000 кГц, и то этого может быть мало. При тактовой частоте проца 20 Мгц на одну выборку остаётся всего 10 тактов, какие 80?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 29 2008, 09:39
|
Местный
  
Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304

|
Цитата(=GM= @ Aug 29 2008, 16:13)  Почему же извращённый? Это единственный вариант на авр, дешёвый к тому же. Недавно прорабатывал вариант НЧ свип-генератора синусоидального сигнала 0,3 Гц-500кГц на таком принципе, пмсм получалось неплохо, правда, руки пока не дошли до реализации в железе. Частота выдачи самплов составляла 4000 кГц со скоростью перестройки частоты от 0.3 Гц и выше за период. Если без перестройки то можно было увеличить частоту выборки до 5000 кГц. Растолкуйте алгоритм, пожалуйста
|
|
|
|
|
Aug 29 2008, 09:58
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Базовая программа генерации синуса Код loop: add r28,r24 ; 1 adc 29,r25 ; 1 adc r30,r26 ; 1 lpm ; 3 out portb,r0; 1 rjmp loop ; 2 => 9 cycles Как видите, цикл выполняется за 9 тактов. Т.е. при тактовой частоте проца в 20 МГц, частота выдачи самплов будет равна 20000/9=2222 ксампла/с. Цикл легко можно уменьшить до 8 тактов и даже до 7. (С помощью усложнения схемы мне даже удалось довести до 4 тактов для генератора и до 5 тактов для свипа, впрочем там преследовались другие цели.) Начать можно отсюда
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 29 2008, 11:50
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(=GM= @ Aug 29 2008, 14:31)  по-другому никак. По другому тоже можно - генерить прямоугольник сразу, с частотой в два раза больше требуемой, затем внешним триггером делить на два. На прямоугольник не надо так много выборок как на синус. И меандр будет чище, чем после фильтра->компаратора.
|
|
|
|
|
Aug 29 2008, 11:59
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(=GM= @ Aug 29 2008, 13:13)  Почему же извращённый? Это единственный вариант на авр, дешёвый к тому же. Недостаток - при перестройке генерация прекращается. Ну и аналоговой обвески много - DAC и фильтр. Цитата(Qwertty @ Aug 29 2008, 15:50)  По другому тоже можно - генерить прямоугольник сразу, с частотой в два раза больше требуемой, затем внешним триггером делить на два. На прямоугольник не надо так много выборок как на синус. И меандр будет чище, чем после фильтра->компаратора. Нельзя. Сигнал надо делать чистым, а если фаза будет дрожать (а без преобразования в синус и последующей фильтрации это неизбежно), то и после делителя картина останется прежней. Ничего, даже отдаленно напоминающего меандр, уже не получится. А вот через аналоговое преобразование - получится.
|
|
|
|
|
Aug 29 2008, 12:02
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(=GM= @ Aug 29 2008, 16:31)  Прозевали вы сообщение уважаемого rx3apf (пост #8). Сначала надо получить синус, потом компаратор, потом меандр 0,3Гц-200кГц с дискретом 0,3 Гц, по-другому никак. А, это там, где он назвал такой вариант "извращённым"?  А в вашей интерпретации это уже "по-другому никак"?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 29 2008, 12:06
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(=GM= @ Aug 29 2008, 13:58)  Цикл легко можно уменьшить до 8 тактов и даже до 7. (С помощью усложнения схемы мне даже удалось довести до 4 тактов для генератора и до 5 тактов для свипа, впрочем там преследовались другие цели.) А вот как сделать меньше 9 без уменьшения разрядности накопителя ? Я когда-то этим развлекался (переделывал программку от J. Hansen), добавлял генератор белого шума, упрощал генераторы пилы, но вот сократить цикл синуса не смог... Цитата(=GM= @ Aug 29 2008, 13:39)  Чтобы сгенерить нормальный синус, надо не менее 8-10 выборок на период. Для выходной частоты 200 кГц частота выборок составит не менее 1600-2000 кГц, и то этого может быть мало. При тактовой частоте проца 20 Мгц на одну выборку остаётся всего 10 тактов, какие 80? Теоретически - достаточно больше двух выборок. На практике, используя пассивный ФНЧ пятого порядка, картинка была вполне симпатичной при четырех-пяти.
|
|
|
|
|
Aug 29 2008, 12:28
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(rx3apf @ Aug 29 2008, 15:59)  Нельзя. Сигнал надо делать чистым, а если фаза будет дрожать (а без преобразования в синус и последующей фильтрации это неизбежно), то и после делителя картина останется прежней. Ничего, даже отдаленно напоминающего меандр, уже не получится. А вот через аналоговое преобразование - получится. У меня и так получается нормально. Не знаю как насчет отдаленно, но я по осцилу от меандра сигнал после делителя отличить не могу.
|
|
|
|
|
Aug 29 2008, 12:48
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(rx3apf @ Aug 29 2008, 16:34)  Тогда какая принципиальная разница, генерить сразу меандр или делать его потом триггером ? Вариант с накоплением фазы не дает возможность получить меандр Сразу не выходит, получается что-то типа 11100_11000_11100_11000...То есть при неизменном периоде длительность импульса скачет достаточно серьезно.
|
|
|
|
|
Aug 29 2008, 12:59
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Qwertty @ Aug 29 2008, 16:48)  Сразу не выходит, получается что-то типа 11100_11000_11100_11000...То есть при неизменном периоде длительность импульса скачет достаточно серьезно. И после делителя на 2 внешним триггером она будет скакать точно так же. Вроде бы самоочевидно, нет ? Цитата(=GM= @ Aug 29 2008, 16:53)  Всё просто. Если вы до запуска цикла перенесёте таблицу синуса из флеша в озу, а в программе из поста #13 вместо команды lpm поставите команду ld r0,z - получите уже 8 тактов. А, ну такой вариант я предполагал. Просто когда я развлекался с таким генератором, использовался 2313, а у него такой фокус не пройдет из-за ограниченности памяти.
Сообщение отредактировал rx3apf - Aug 29 2008, 12:57
|
|
|
|
|
Aug 29 2008, 13:09
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(rx3apf @ Aug 29 2008, 10:59)  Недостаток - при перестройке генерация прекращается. Ну и аналоговой обвески много - DAC и фильтр Ну, это как систему строить. В одном варианте у меня при 7 тактах на выборку (это 2857 квыборок/с) генерация при перестройке не прекращается. А в другом варианте при 5 тактах на выборку (это 4000 квыборок/с) частота перестраивается с заданной скоростью. И только в последнем варианте, при 4 тактах на выборку (это 5000 квыборок/с), генерация при перестройке прекращается. Вот думаю, как лучше объединить варианты в одном изделии. Цитата(rx3apf @ Aug 29 2008, 11:59)  А, ну такой вариант я предполагал. Просто когда я развлекался с таким генератором, использовался 2313, а у него такой фокус не пройдет из-за ограниченности памяти Что ж вы молчали-то? Вот чего не напишу, всё уже предполагалось, а чего спрашивать тогда? А насчет 7 тактов есть какие-нибудь предположения?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 29 2008, 13:37
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(rx3apf @ Aug 29 2008, 12:14)  А вот 7 и меньше тактов - действительно не могу сообразить Ну, это тоже просто, примерно вот так Код add r28,r24 ; 1 adc 29,r25 ; 1 adc r30,r26 ; 1 ld r0,z ; 2 loop: out portb,r0; 1 add r28,r24 ; 1 adc 29,r25 ; 1 adc r30,r26 ; 1 ld r0,z ; 2 add r28,r24 ; 1 out portb,r0; 1 adc 29,r25 ; 1 adc r30,r26 ; 1 ld r0,z ; 2 rjmp loop ; 2, total=14/2=7
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Aug 29 2008, 14:22
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(rx3apf @ Aug 29 2008, 16:59)  И после делителя на 2 внешним триггером она будет скакать точно так же. Вроде бы самоочевидно, нет ? Нет  11100_11000_11100_11000... 11111_00000_11111_00000... после делителя
|
|
|
|
|
Aug 29 2008, 14:45
|
Местный
  
Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527

|
Цитата(rx3apf @ Aug 29 2008, 18:30)  И если программно генерировать вдвое более низкую частоту, то картина будет _в точности_ такой же, как после триггера-делителя. Вполне возможно. Просто мне нужно было две таких частоты со сдвигом на 90 градусов. Поэтому частоту пришлось поднять вдвое, а потом делить.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|