Перейти к содержанию

Квадратурный модулятор


Губитель

Рекомендуемые сообщения

Всем доброго времени суток. Настала проблема. Требуется решить задачу, а именно реализовать квадратурный модулятор или что то лучшее на МК. Схему на логике конечно прикладываю. Вопрос вот в чем: Понимаю амплитудную, частотную, фазовую в отдельности, но как это это совместить, и реализовать на деле пока что не понимаю. На АЦП МК поступает сигнал, там какие то манипуляции с амплитудой и фазой сигнала. Модулирующим является простой меандр. 

Модулятор с квадратурной амплитудной модуляцией (КАМ-16) состоит из следующих блоков и узлов:

  1.  генератор промежуточной частоты  
  2. формирователь квадратурных сигналов
  3.  инвертор 1
  4.  инвертор 2
  5. коммутатор 1
  6.  коммутатор 2
  7.  ПФ 1
  8.  ПФ 2
  9. источник сигнала
  10.  генератор тактовой частоты
  11. делитель частоты на 4
  12.  сдвиговый регистр
  13. накопительный регистр
  14. преобразователь уровня1
  15.  преобразователь уровня 2
  16.  сумматор

Безымянный.png

Особенно интересен второй пункт в реализации.

Изменено пользователем Губитель
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Даааа, как всегда надо предложить готовое решение! Блестяще! Модулятор нужен не для практических целей, а сама суть того, что он сделан на МК. Гуглом пользоваться умею, но если будут полезные ссылки по существу, буду только рад. Я так понимаю, что проще всего сдвинуть 2 сигнала на 90 градусов, это один сигнал умножить на таблицу синусов, а другой на таблицу косинусов при формировании выходного сигнала? Частота промежуточной частоты нужна 64кГц.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Не, забудьте про таблицу синусов. Тут всё гораздо проще.

Вот, к примеру, формирователь квадратурных сигналов на рисунке. Это просто два D-триггера. Входная частота клоков в 4 раза больше нужной. На выходах триггеров получаются сигналы I и Q. Как раз сдвинутые на 90 градусов.

Далее есть инверторы 3 и 4, которые просто инвертируют эти I иQ сигналы. Коммутаторы 5, 6 позволяют выбирать прямой или инверсный сигналы. На это требуется 2 бита.

Потом идут фильтры, которые делают из прямоугольников две синусоиды со сдвигом 90 градусов.

И, наконец, управляемые делители 14, 15, которые либо пропускают синус 1:1, либо ослабляют синус в 3 раза. Можно выбрать нужное, для этого ещё 2 бита управления.

На выходе оба канала тупо суммируются.

Вот и всё.

Имеем 4 бита управления: два на инверсию 0 или 180 градусов, два на амплитуду 1 или 1/3. Если комбинация 0000, то нет I и Q инверсии  и полная амплитуда на выходе: выходной синус сдвинут на 45 градусов, т.к. просто сложили 0гр. и 90гр. синусы.

Изменяя первый бит 0 на 1, код 1000,  мы просто инвертируем сигнал I. На выходе уже получаем другой синус со сдвигом фазы -45гр.

Если код, например, 0010, имеем неинвертированные сигналы, но амплитуда одного 1/3, а другого осталась 1. В результате на выходе новый синус с новой фазой и амплитудой.

Таким образом можно зашифровать 16 различных комбинаций ( 4 бита) в выходном синусе.

cxem_QAM1.png

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

Нужно сделать на МК? Только сейчас въехал в задачу.

Ну, тоды, конечно, таблица синусов, она же таблица косинусов. Принцип формирования модуляции остаётся тот же.

Частота 64 кГц. Например, имеем на борту 12-битный ЦАП со временем установки 1мкс. Всего получим 16 точек на период. То есть таблица синусов состоит из 16 точек всего. Главный цикл программы - бегаем по кругу с частотой 1МГц и выбираем значения подряд из таблицы.

Для ускорения алгоритма заранее делаем восемь таблиц: синус, -синус, косинус, - косинус, 1/3синус, -1/3синус, 1/3 косинус, - 1/3 косинус. Это чтобы избежать промежуточных вычислений.

Входной сигнал, который нужно замодулировать - это однобитный поток единичек - ноликов. Отрезаем от потока по 4 бита.

Смотрим на полученный код ХХХХ. Если:

первые два бита 00, то бегаем по таблице синусов,

10 - то по таблице минус синус.

01 - таблица 1/3 синуса

11 - таблица -1/3 синуса

Полученное табличное значение кладём в выходную переменную.

Далее, то же самое с третьим и четвёртым битами, только пользуем косинус, а не синус. Складываем с предыдущим значением.

Полученный результат подаём на ЦАП.

Входной поток гораздо медленнее, чем 64кГц, поэтому успеем пробежать несколько кругов по таблицам, пока не настанет  время для следующих 4-х байт.

Очень удобно для этого использовать модуль DMA для записи в ЦАП, если, конечно, он есть на борту МК.

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Губитель сказал:

Даааа, как всегда надо предложить готовое решение!

А вы,что хотели?Все в этом плане давненько придумано.Хотите свой оригинальный,так выкладывайте,дополните копилку очередной новой и провереной схемой или методом.

Ссылка на комментарий
Поделиться на другие сайты

Наконец-то выдалось свободное время и решил доделать до конца. Огромное спасибо Yurkin2015 за ответ, очень помог. Цап сделаю по схеме делителей напряжений. МК работает от внутреннего генератора 1 МГц, у таймера установлен предделитель на 8, и работает по совпадению с 52, для достижения частоты 2,4 кГц( частота информационного сигнала) 1 000 000/8/52=2400. Кто по опытнее, корректно ли я набрал код, т.к новичек. @Yurkin2015 , как скажется на работе то, что частота выхода получится 1000000/16= 62 500, критично?

 

.include "m16def.inc"   ; Используем ATMega16
			.include "macro.inc"

.DEF    COUNTER = R18
; RAM ========================================================
		.DSEG
SIN_sel:	.byte 1
COS_sel:	.byte 1
POTOK:      .byte 1


; FLASH ======================================================
         .CSEG
         .ORG $000        	; (RESET) 
         RJMP   Reset
         .ORG $002
         RETI             	; (INT0) External Interrupt Request 0
         .ORG $004
         RETI             	; (INT1) External Interrupt Request 1
         .ORG $006
         RETI		      	; (TIMER2 COMP) Timer/Counter2 Compare Match
         .ORG $008
         RETI             	; (TIMER2 OVF) Timer/Counter2 Overflow
         .ORG $00A
         RETI		      	; (TIMER1 CAPT) Timer/Counter1 Capture Event
         .ORG $00C 
         RETI               ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
         .ORG $00E
         RETI				; (TIMER1 COMPB) Timer/Counter1 Compare Match B
         .ORG $010
         RETI			  	; (TIMER1 OVF) Timer/Counter1 Overflow
         .ORG $012
         RETI			 	; (TIMER0 OVF) Timer/Counter0 Overflow
         .ORG $014
         RETI             	; (SPI,STC) Serial Transfer Complete
         .ORG $016
         RETI	  	        ; (USART,RXC) USART, Rx Complete
         .ORG $018
         RETI	      		; (USART,UDRE) USART Data Register Empty
         .ORG $01A
         RETI      	        ; (USART,TXC) USART, Tx Complete
         .ORG $01C
         RETI       	    ; (ADC) ADC Conversion Complete
         .ORG $01E
         RETI             	; (EE_RDY) EEPROM Ready
         .ORG $020
         RETI             	; (ANA_COMP) Analog Comparator
         .ORG $022
         RETI             	; (TWI) 2-wire Serial Interface
         .ORG $024
         RETI             	; (INT2) External Interrupt Request 2
         .ORG $026
         RJMP   Timer0            	; (TIMER0 COMP) Timer/Counter0 Compare Match
         .ORG $028
         RETI             	; (SPM_RDY) Store Program Memory Ready
	
	 	.ORG   INT_VECTORS_SIZE      	; Конец таблицы прерываний

; Interrupts ==============================================

 Timer0:                    ; сравнение с 52( частота модулирующего сигнала 2,4 кГц)
            PUSHF
			PUSH	ZL
			PUSH	ZH
			PUSH	R16
			
			LDS		R16,POTOK   ;
            SBIC    PinA,1      ; Формируем информационный поток
			SUBI    R16,-1      ;
			
			INC     R20         ; увеличиваем счетчик на 1, если количество битов равно 4, то
			CPI     R20,4       ; уходим на перемену таблиц синуса и косинуса
			BREQ    INF         ;
			
			LSL     R16         ; Формируем информационный поток
			STS		POTOK,R16   ;
EXIT:
			POP     R16         ;
			POP		ZH          ; корректный выход из прерывания
			POP		ZL          ;
			POPF                ;
			RETI
INF:
            STS		POTOK,R16   ; 
			ANDI    R16,3       ; Здесь мы маской удаляем ненужные биты, несущие инфу о косинусе

            CPI		R16,0		; SIN
			BREQ	SIN0

			CPI		R16,1		; -SIN
			BREQ	SIN1

			CPI		R16,2		; SIN/3
			BREQ	SIN2

			CPI		R16,3		; -SIN/3
			BREQ	SIN3

SIN0:		LDI		XL,low(SIN*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(SIN*2)
			RJMP	COS_SELECT

SIN1:		LDI		XL,low(SINN*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(SINN*2)
			RJMP	COS_SELECT

SIN2:		LDI		XL,low(SIN3*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(SIN3*2)
			RJMP	COS_SELECT

SIN3:		LDI		XL,low(SINN3*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(SINN3*2)
			RJMP	COS_SELECT

COS_SELECT:		   
		    LDS		R16,POTOK   ; вновь берем значение
			LSR     R16         ; и сдвигом вправо удаляем биты синуса
			LSR     R16         ;
			
			CPI		R16,0		; COS
			BREQ	COS0

			CPI		R16,1		; -COS
			BREQ	COS1

			CPI		R16,2		; COS/3
			BREQ	COS2

			CPI		R16,3		; -COS/3
			BREQ	COS3

COS0:		LDI		XL,low(COS*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(COS*2)
			RJMP	EXIT

COS1:		LDI		XL,low(COSN*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(COSN*2)
			RJMP	EXIT

COS2:		LDI		XL,low(COS3*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(COS3*2)
			RJMP	EXIT

COS3:		LDI		XL,low(COSN3*2)	; Берем адрес начала массива с будущими данными. 
			LDI		XH,High(COSN3*2)
			RJMP	EXIT
		

; End Interrupts ==========================================




;Internal Hardware Init ===========================================

Reset:   	STACKINIT					; Инициализация стека
			RAMFLUSH					; Очистка памяти

OUTI	TCCR0,2
OUTI    TIMSK,4
OUTI	OCR0,52

OUTI    DDRA,0xFE
OUTI    DDRB,0xFF
OUTI    DDRC,0xFF
OUTI    DDRD,0xFF



; End Internal Hardware Init ===================================



; External Hardware Init  ======================================
; End External Hardware Init  ==================================




; Run ==========================================================



; End Run ======================================================

; Main =========================================================
Main:		
        CLR	     R17		    ; Сбрасываем рабочий регистр
		ADD	     XL,COUNTER	    ; Вычисляем смещение по адресу таблицы
		ADC	     XH,R17
        LD       R16,X

        LD       R17,Y+
        ADD	     YL,COUNTER	; Вычисляем смещение по адресу таблицы
		ADC	     YH,R17 

        ADC      R16,R17;
        OUT	     PORTD,R16	; Выдаем его в порт

        INC      COUNTER
        SBRC     COUNTER,4
        CLR      COUNTER   

        RJMP		Main

	


; Procedure ====================================================

; End Procedure ================================================

SIN:
.db 176, 217, 244, 254, 244, 217, 176, 127, 79, 37, 10, 0, 10, 37, 78, 127
COS:
.db 244, 217, 176, 127, 79, 37, 10, 0, 10, 37, 78, 127, 175, 217, 244, 254
SINN:
.db 79, 37, 10, 0, 10, 37, 78, 127, 175, 216, 244, 254, 245, 217, 176, 128
COSN:
.db 10, 37, 78, 127, 175, 217, 244, 254, 244, 217, 176, 128, 79, 38, 10, 0
SIN3:
.db 143, 157, 166, 169, 166, 157, 143, 127, 111, 97, 88, 85, 88, 97, 111, 127
COS3:
.db 166, 157, 143, 127, 111, 97, 88, 85, 88, 97, 111, 127, 143, 157, 166, 169
SINN3:
.db 111, 97, 88, 85, 88, 97, 111, 127, 143, 157, 166, 169, 166, 157, 143, 127
COSN3:
.db 88, 97, 111, 127, 143, 157, 166, 169, 166, 157, 143, 127, 111, 97, 88, 85


; EEPROM =====================================================
			.ESEG				; Сегмент EEPROM
Изменено пользователем Губитель
Ссылка на комментарий
Поделиться на другие сайты

Обработчик прерывания таймера я особо не разглядывал, честно говоря, на асме для AVR никогда не программировал, поэтому слишком много новых букв для меня.

Есть только пара вопросов по Main.

Вот эта строчка загрузки в R17

LD R17,Y+

стоит в непонятном месте, перед вычислением адреса в Y, да ещё с постинкрементом. Почему с Y нельзя было сделать так же, как с Х?

И, потом, вот это

В 12/18/2016 в 21:58, Губитель сказал:

частота выхода получится 1000000/16= 62 500, критично?

То есть, весь цикл Main: занимает 16 клоков процессора, поэтому такая частота на выходе? Такая задумка?

Но это не частота выходного синуса, это - частота продвижения по таблице! А полный период синуса занимает ещё 16 мест в таблице. То есть синус на выходе будет 1000000/16/16 = 3906 Гц всего-то.

Для Вашей программы нужно запустить Мегу от 16МГц для нужной выходной частоты.

Я так думаю.

 

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...