Цифровой программируемый генератор, подключение ltc6903 к STM32.

Цифровой программируемый генератор, подключение ltc6903 к STM32.

В одной из конструкций понадобилось изменять тактовую частоту в большом диапазоне и из названия становится понятно, что выбор пал на LTC6903. LTC6903 и LTC6904 — цифровые программируемые генераторы с диапазоном частот от 1KHz до 68MHz, отличаются они лишь тем, что LTC6903 управляется по SPI, а LTC6904 по I2C. Они достаточно просты в подключении и требуют лишь блокировочные конденсаторы по питанию.

Давайте рассмотрим их основные характеристики:
  • диапазон питающих напряжений от 2.7V — 5.5V
  • ток потребления 1.7mA при напряжении 2.7V и выходной частоте < 1MHz
  • ошибка частоты < 1,1% во всём диапазоне частот
  • уход частоты в зависимости от температуры 10ppm/°C


Данная микросхема выпускается в корпусе MS8.
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Назначение выводов:
  • V, GND – выводы питания
  • SDI(Serial Data Input), SCK(Serial Clock), SEN(Serial Enable) – выводы подключения по SPI
  • CLK – выходы генератора
  • OE – асинхронный вход, при установке на этом выводе логического нуля, на выходе генератора устанавливается логический ноль


Для подключения генератора по SPI, открываем STM32CUBE и выбираем контроллер, в моём случае это STM32F103VE, далее выбираем SPI, который хотим использовать и смотрим какие выводы в нём задействованы. Картинку можно увеличить кликнув по ней.
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Что касается вывода SEN, первоначально посадил его на землю, при этом LTC6903 работала не стабильно, при отправке посылки не всегда начиналась генерация, а иногда начиналась не на той частоте. Пролистав ещё пару раз даташит, обратил внимание на такой параметр Min Latch Time – SEN to SEN, то есть минимальное время, между переключениями вывода SEN равно 400nS, из этого можно сделать вывод, что всё-таки этим выводом нужно управлять, а не просто посадить его на землю. И это действительно оказалось так.

Так как SEN должен находиться в низком состоянии определённое время, то управлять ним будем обычным выводом, настроеным как выход с открытым коллектором, а не выводом NSS.

Подключения согласно даташита
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Все выводы SPI подтянуть к питанию резисторами, номиналом 10K.
Цифровой программируемый генератор, подключение ltc6903 к STM32.


Теперь о самой посылке
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Цифровой программируемый генератор, подключение ltc6903 к STM32.

из картинки выше стало понятно, что она состоит из 16 бит, старшие 4 бита, определяют в каком диапазоне будет частота наших колебаний
Цифровой программируемый генератор, подключение ltc6903 к STM32.

С помощью следующих 10 бит задаётся частота, для того чтобы найти их значение надо воспользоваться формулой
Цифровой программируемый генератор, подключение ltc6903 к STM32.

OCT - значение из таблицы, f - частота
И последние два бита определяют на какие выводы будут выводиться колебания.
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Надо сказать, что после подачи питания, значение всех регистров равно нулю и на обоих выводах CLK присутствует меандр с частотой 1,03KHz.

Теперь давайте рассмотрим на примере как запустить генератор с нужной нам частотой. Если мы хотим, чтобы частота колебаний была 6,5MHz первым делом находим из таблицы чему равен OCT.
Цифровой программируемый генератор, подключение ltc6903 к STM32.

OCT = 12 или 1100, теперь, подставив значение OCT в формулу, получим DAC
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Округляем получившееся значение до целых DAC = 707 или 1011000011. Осталось только выбрать на какой вывод будут выводиться колебания, пусть выводятся на CLK(CNF1 = 1, CNF0 = 0).

Теперь давайте поставим рядом все полученные цифры 1100 1011 0000 1110, если перевести это число в шестнадцатеричную систему получим 0хСB0E, это число, которое надо отправить, чтобы генератор запустился на частоте 6,5MHz или около того, мы же чуть округлили.

Пишем код.

#include "stm32f10x.h"  

void Spi_Init (void)
{
//включаем тактирование Port B и альтернативных функций
RCC->APB2ENR  |= RCC_APB2ENR_IOPBEN | | RCC_APB2ENR_AFIOEN;   
	
//13 и 15 вывод - альтернативная функция, push pull, 10 вывод - выход, open drain
GPIOB->CRH &= ~(GPIO_CRH_CNF13_0 | GPIO_CRH_CNF15_0);  
GPIOB->CRH |= GPIO_CRH_CNF13_1 | GPIO_CRH_CNF15_1;  	
GPIOB->CRH |= GPIO_CRH_MODE10_0 | GPIO_CRH_MODE13_1 |	GPIO_CRH_MODE15_1;

//включаем тактирование SPI2
RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;   
	
  SPI2->CR1 |= SPI_CR1_BR;                //Baud rate = Fpclk/256
  SPI2->CR1 |= SPI_CR1_CPOL;             //Polarity cls signal CPOL = 1;
  SPI2->CR1 |= SPI_CR1_CPHA;             //Phase cls signal    CPHA = 1;
  SPI2->CR1 |= SPI_CR1_DFF;               //16 bit data
  SPI2->CR1 &= ~SPI_CR1_LSBFIRST;         //MSB will be first
  SPI2->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI;  //Software slave management & Internal slave select
	
  SPI2->CR1 |= SPI_CR1_MSTR;              //Mode Master
  SPI2->CR1 |= SPI_CR1_SPE;                //Enable SPI2

}

void delay(uint32_t delayTime)
{	
    uint32_t i;
    for(i = 0; i < delayTime; i++);
}

void Spi_Transmit(uint16_t data)
{

	while(!(SPI2->SR & SPI_SR_TXE));

	GPIOB->BSRR = GPIO_BSRR_BR10;
	SPI2->DR = data;	
	delay(10000);
	GPIOB->BSRR = GPIO_BSRR_BS10;
}
int main(void)
{

	delay(720000);
	Spi_Init();
        //после инициализации, LTC6903 начинает откликаться только после второй посылки
        Spi_Transmit(0X0000);
        Spi_Transmit(0XCB0E);

	while(1)
	{
		
	}
}

Надо сказать о том, что на частотах выше 1MHz, необходимом минимизировать ёмкость нагрузки до 5 pF, иначе частота колебаний “уйдёт” от расчётной. Для этих целей можно использовать высокоскоростной буфер. Нам же для измерения, достаточно выставить на щупе переключатель в положение 1:10.

Проверяем что получилось.
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Расчётная частота отличается от реальной и превышает ошибку 1,1% заявленную производителем. В моём проекте эта микросхема тактирует АЦП и значения необходимых мне частот известны заранее, поэтому для меня не составляет труда подогнать частоту до нужной с помощью DAC, а использовать её в качестве гетеродина не получится.

Выбросы на фронтах возникают из-за длины провода земляного крокодила, давайте заменим его специальной насадкой.
Цифровой программируемый генератор, подключение ltc6903 к STM32.

Цифровой программируемый генератор, подключение ltc6903 к STM32.

На этом всё.
комментарии
3