Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
RSS лента

NikB

DDC/DUC трансивер на базе OSA103 Mini

Оценить эту запись
Цитата Сообщение от NikB Посмотреть сообщение
Добрый день!
Бэндкодер реализован на adrduino + внешний цап управляемый по SPI.
Вот код:

Скрытый текст

#define F_CPU 16000000UL

#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include "SPI.h"

int LD = 8;
int CS = 10;

int A = 2;
int B = 3;
int C = 4;
//int v_port = 9;

word outputValue = 0; // a word is a 16-bit number
byte data = 0; // and a byte is an 8-bit number

void setup() {

pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
//pinMode(v_port, OUTPUT);

digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);

pinMode(CS, OUTPUT);
pinMode(LD, OUTPUT);
SPI.begin(); // wake up the SPI bus.
SPI.setDataMode(SPI_MODE3);
SPI.setBitOrder(MSBFIRST);
}

//Decoder
void switch_bpf(uint8_t n)
{
if (n < 7)
{
if (n == 0)
{
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
}
if (n == 1)
{
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
}
if (n == 2)
{
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
}
if (n == 3)
{
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
}
if (n == 4)
{
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
}
if (n == 5)
{
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
}
if (n == 6)
{
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
}
}
}
//Decoder_end

//Freq
const uint32_t freqs[] = { // верхние границы диапазонов
450000 // 0..450
, 800000 //450..800
, 1900000 // 800 .. 1.9
, 5000000 // 1.9 .. 5
, 12000000 // 5 .. 12
, 22000000 // 12 .. 22
, 33000000 // 22 .. 33
, 0xFFFFFFFFUL // если выше - включаем bypass
};
//Freq_END

//DAC_V_out
const uint32_t dac_out[] = { // верхние границы диапазонов
1900 //0
, 1880 //1
, 1875 //2
, 1870 //3
, 1855 //4
, 1850 //5
, 1845 //6
, 1830 //7
, 1825 //8
, 1820 //9
, 1810 //10
, 1795 //11
, 1790 //12
, 1785 //13
, 1775 //14
, 1760 //15
, 1755 //16
, 1750 //17
, 1745 //18
, 1725 //19
, 1720 //20
, 1710 //21
, 1700 //22
, 1680 //23
, 1660 //24
, 1610 //25
, 1600 //26
, 1840 //27
};
//DAC_END


inline void uart_init(void)
{
UBRR0 = 0; // 1Mbps
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8 бит данных, 1 стоп-бит, без контроля чётности
UCSR0B = (1 << RXEN0); // разрешить прием данных
}


//*** Инициализация таймера 1, частота ~16 КГц ***//
inline void timer_init(void)
{
//TCCR1A = 0; // режим CTC
TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10); // fOSC/1024
//OCR1A = 0xFFFF; // считать до упора
}



//*** Прием данных по UART ***//
unsigned char uart_receive(void)
{
while (!(UCSR0A & (1 << RXC0)));
return UDR0;
}

void loop()
{
//////////
//outputValue = 1720;

// delay(1000);
//////////
//
uint8_t x; // индекс принятого байта в буфере
uint8_t buf[5]; // буфер приёма
uint16_t tmr; // предыдущее состояние таймера
#define FREQ (*(uint32_t*)buf)
#define RXTX (buf[4])
#define TXFLAG 0x80
//_end
uart_init();
timer_init();
tmr = TCNT1;
x = 0;
while (x < 5)
{
buf[x++] = uart_receive();
if (TCNT1 - tmr > 600) // если на приём ушло много времени,
x = 1; // ... то это первый байт пакета
tmr = TCNT1; // обновим таймер
}

for (uint8_t i = 0; i < sizeof(freqs) / sizeof(freqs[0]); i++)
{
if (FREQ <= freqs[i])
{
switch_bpf(i);
//1
if (FREQ >= 450000 && FREQ <= 500000){outputValue=dac_out[12];}
if (FREQ >= 500000 && FREQ <= 550000){outputValue=dac_out[21];}
if (FREQ >= 550000 && FREQ <= 800000){outputValue=dac_out[26];}
//
//2
if (FREQ >= 800000 && FREQ <= 900000){outputValue=dac_out[0];}
if (FREQ >= 1000000 && FREQ <= 1100000){outputValue=dac_out[2];}
if (FREQ >= 1100000 && FREQ <= 1200000){outputValue=dac_out[3];}
if (FREQ >= 1200000 && FREQ <= 1400000){outputValue=dac_out[5];}
if (FREQ >= 1400000 && FREQ <= 1600000){outputValue=dac_out[15];}
if (FREQ >= 1600000 && FREQ <= 1800000){outputValue=dac_out[25];}
if (FREQ >= 1800000 && FREQ <= 1900000){outputValue=dac_out[25];}
if (FREQ >= 1900000 && FREQ <= 2500000){outputValue=dac_out[0];}
//
//3
if (FREQ >= 2500000 && FREQ <= 3000000){outputValue=dac_out[0];}
if (FREQ >= 3000000 && FREQ <= 3400000){outputValue=dac_out[2];}
if (FREQ >= 3400000 && FREQ <= 4000000){outputValue=dac_out[7];}
if (FREQ >= 4000000 && FREQ <= 4500000){outputValue=dac_out[11];}
if (FREQ >= 4500000 && FREQ <= 5000000){outputValue=dac_out[17];}
//if (FREQ >= 5000000 && FREQ <= 5500000){outputValue=dac_out[13];}
//
//4
if (FREQ >= 5000000 && FREQ <= 6800000){outputValue=dac_out[0];}
if (FREQ >= 6800000 && FREQ <= 7000000){outputValue=dac_out[1];}
if (FREQ >= 7000000 && FREQ <= 8000000){outputValue=dac_out[5];}
if (FREQ >= 8000000 && FREQ <= 9000000){outputValue=dac_out[11];}
if (FREQ >= 10000000 && FREQ <= 11000000){outputValue=dac_out[19];}
if (FREQ >= 11000000 && FREQ <= 12000000){outputValue=dac_out[24];}
if (FREQ >= 12000000 && FREQ <= 13000000){outputValue=dac_out[27];}
//
//5
if (FREQ >= 13000000 && FREQ <= 14000000){outputValue=dac_out[8];}
if (FREQ >= 14000000 && FREQ <= 15000000){outputValue=dac_out[10];}
if (FREQ >= 15000000 && FREQ <= 16000000){outputValue=dac_out[13];}
if (FREQ >= 16000000 && FREQ <= 17000000){outputValue=dac_out[16];}
if (FREQ >= 18000000 && FREQ <= 19000000){outputValue=dac_out[19];}
if (FREQ >= 19000000 && FREQ <= 20000000){outputValue=dac_out[24];}
if (FREQ >= 20000000 && FREQ <= 21000000){outputValue=dac_out[25];}
if (FREQ >= 21000000 && FREQ <= 22000000){outputValue=dac_out[26];}
//
//6
if (FREQ >= 22000000 && FREQ <= 33000000){outputValue=dac_out[10];}
//
digitalWrite(LD, HIGH);
digitalWrite(CS, LOW);
data = highByte(outputValue);
SPI.transfer(data);
data = lowByte(outputValue);
SPI.transfer(data);
digitalWrite(CS, HIGH);
digitalWrite(LD, LOW);
break;
}
}

}


Оса просто передает на вход ардуины свою частоту, не важно прием или передача.
Категории
Без категории

Комментарии

  1. Аватар для minaev
    Устройство получает питание по шине USB?
    Обновлено 24.11.2020 в 02:32 minaev