Цифровой программируемый генератор, подключение ltc6903 к STM32.
В одной из конструкций понадобилось изменять тактовую частоту в большом диапазоне и из названия становится понятно, что выбор пал на LTC6903. LTC6903 и LTC6904 — цифровые программируемые генераторы с диапазоном частот от 1KHz до 68MHz, отличаются они лишь тем, что LTC6903 управляется по SPI, а LTC6904 по I2C. Они достаточно просты в подключении и требуют лишь блокировочные конденсаторы по питанию.
Давайте рассмотрим их основные характеристики:
Данная микросхема выпускается в корпусе MS8.
Назначение выводов:
Для подключения генератора по SPI, открываем STM32CUBE и выбираем контроллер, в моём случае это STM32F103VE, далее выбираем SPI, который хотим использовать и смотрим какие выводы в нём задействованы. Картинку можно увеличить кликнув по ней.
Что касается вывода SEN, первоначально посадил его на землю, при этом LTC6903 работала не стабильно, при отправке посылки не всегда начиналась генерация, а иногда начиналась не на той частоте. Пролистав ещё пару раз даташит, обратил внимание на такой параметр Min Latch Time – SEN to SEN, то есть минимальное время, между переключениями вывода SEN равно 400nS, из этого можно сделать вывод, что всё-таки этим выводом нужно управлять, а не просто посадить его на землю. И это действительно оказалось так.
Так как SEN должен находиться в низком состоянии определённое время, то управлять ним будем обычным выводом, настроеным как выход с открытым коллектором, а не выводом NSS.
Подключения согласно даташита
Все выводы SPI подтянуть к питанию резисторами, номиналом 10K.
Теперь о самой посылке
из картинки выше стало понятно, что она состоит из 16 бит, старшие 4 бита, определяют в каком диапазоне будет частота наших колебаний
С помощью следующих 10 бит задаётся частота, для того чтобы найти их значение надо воспользоваться формулой
OCT - значение из таблицы, f - частота
И последние два бита определяют на какие выводы будут выводиться колебания.
Надо сказать, что после подачи питания, значение всех регистров равно нулю и на обоих выводах CLK присутствует меандр с частотой 1,03KHz.
Теперь давайте рассмотрим на примере как запустить генератор с нужной нам частотой. Если мы хотим, чтобы частота колебаний была 6,5MHz первым делом находим из таблицы чему равен OCT.
OCT = 12 или 1100, теперь, подставив значение OCT в формулу, получим DAC
Округляем получившееся значение до целых DAC = 707 или 1011000011. Осталось только выбрать на какой вывод будут выводиться колебания, пусть выводятся на CLK(CNF1 = 1, CNF0 = 0).
Теперь давайте поставим рядом все полученные цифры 1100 1011 0000 1110, если перевести это число в шестнадцатеричную систему получим 0хСB0E, это число, которое надо отправить, чтобы генератор запустился на частоте 6,5MHz или около того, мы же чуть округлили.
Пишем код.
Надо сказать о том, что на частотах выше 1MHz, необходимом минимизировать ёмкость нагрузки до 5 pF, иначе частота колебаний “уйдёт” от расчётной. Для этих целей можно использовать высокоскоростной буфер. Нам же для измерения, достаточно выставить на щупе переключатель в положение 1:10.
Проверяем что получилось.
Расчётная частота отличается от реальной и превышает ошибку 1,1% заявленную производителем. В моём проекте эта микросхема тактирует АЦП и значения необходимых мне частот известны заранее, поэтому для меня не составляет труда подогнать частоту до нужной с помощью DAC, а использовать её в качестве гетеродина не получится.
Выбросы на фронтах возникают из-за длины провода земляного крокодила, давайте заменим его специальной насадкой.
На этом всё.
Давайте рассмотрим их основные характеристики:
- диапазон питающих напряжений от 2.7V — 5.5V
- ток потребления 1.7mA при напряжении 2.7V и выходной частоте < 1MHz
- ошибка частоты < 1,1% во всём диапазоне частот
- уход частоты в зависимости от температуры 10ppm/°C
Данная микросхема выпускается в корпусе MS8.
Назначение выводов:
- V, GND – выводы питания
- SDI(Serial Data Input), SCK(Serial Clock), SEN(Serial Enable) – выводы подключения по SPI
- CLK – выходы генератора
- OE – асинхронный вход, при установке на этом выводе логического нуля, на выходе генератора устанавливается логический ноль
Для подключения генератора по SPI, открываем STM32CUBE и выбираем контроллер, в моём случае это STM32F103VE, далее выбираем SPI, который хотим использовать и смотрим какие выводы в нём задействованы. Картинку можно увеличить кликнув по ней.
Что касается вывода SEN, первоначально посадил его на землю, при этом LTC6903 работала не стабильно, при отправке посылки не всегда начиналась генерация, а иногда начиналась не на той частоте. Пролистав ещё пару раз даташит, обратил внимание на такой параметр Min Latch Time – SEN to SEN, то есть минимальное время, между переключениями вывода SEN равно 400nS, из этого можно сделать вывод, что всё-таки этим выводом нужно управлять, а не просто посадить его на землю. И это действительно оказалось так.
Так как SEN должен находиться в низком состоянии определённое время, то управлять ним будем обычным выводом, настроеным как выход с открытым коллектором, а не выводом NSS.
Подключения согласно даташита
Все выводы SPI подтянуть к питанию резисторами, номиналом 10K.
Теперь о самой посылке
из картинки выше стало понятно, что она состоит из 16 бит, старшие 4 бита, определяют в каком диапазоне будет частота наших колебаний
С помощью следующих 10 бит задаётся частота, для того чтобы найти их значение надо воспользоваться формулой
OCT - значение из таблицы, f - частота
И последние два бита определяют на какие выводы будут выводиться колебания.
Надо сказать, что после подачи питания, значение всех регистров равно нулю и на обоих выводах CLK присутствует меандр с частотой 1,03KHz.
Теперь давайте рассмотрим на примере как запустить генератор с нужной нам частотой. Если мы хотим, чтобы частота колебаний была 6,5MHz первым делом находим из таблицы чему равен OCT.
OCT = 12 или 1100, теперь, подставив значение OCT в формулу, получим DAC
Округляем получившееся значение до целых 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.
Проверяем что получилось.
Расчётная частота отличается от реальной и превышает ошибку 1,1% заявленную производителем. В моём проекте эта микросхема тактирует АЦП и значения необходимых мне частот известны заранее, поэтому для меня не составляет труда подогнать частоту до нужной с помощью DAC, а использовать её в качестве гетеродина не получится.
Выбросы на фронтах возникают из-за длины провода земляного крокодила, давайте заменим его специальной насадкой.
На этом всё.
Похожие статьи