- Войдите или зарегистрируйтесь, чтобы оставлять комментарии
Всем привет!
STM32F030F4P6 AD8400.
Цель получить управление цифровым резистором от 0 до 5 Ком.
Для этого выбираем микросхему AD8400ARZ10 [SO-8]
В этой стать мы создадим тестовую плату с цифровым потенциометром AD8400, подключим тестовую плату с AD8400 к китайской плате с установленным на ней микроконтроллером фирмы STM - STM32F030F4P6, напишем простую программу программного SPI для передачи данных от STM32F030F4P6 к AD8400 в среде программирования Keil Vision
И так приступим..
Минимальную информацию для использования AD8400 в своем проекте можно посмотреть в статье ссылка
Выбираем микросхему в нужном нам корпусе.
Я выбрал SO-8
И нарисовал простую плату в DIP TRACE. Нам для тестового варианта сложного не чего проектировать не нужно. Просто выводим все пины микросхемы на штырьковый разъем.
Перенес на текстолит и вытравил - как это делать более подробнее в статье STM32F030F4P6 hand-made
Получилась тестовая плата
Припаиваем на плату микросхему AD8400
Конечный вид платы и внешний вид микросхемы (как на рисунке так и на плате)
Для продолжения работы возьмем одну из популярных макетных плат из большого китайского магазина
Плата простая, дешевая, все пины выведены на штырьковые разъемы. Микроконтроллер установленный на плате соответствует STM32F030F4P6.
Соединяем тестовую плату с AD8400 перемычками с платой с STM32F030F4P6 следующим образом:
Плата с AD8400 Плата с STM32F030F4P6
CS <--- PB1
SDI <--- PA7
CLK <--- PA5
VDD <--- 3V3
GND <--- GND
A1 W1 B1 цифровой потенциометр оставим пока не подключенным
В результате получаем следующую сборку см. фото ниже
Для программирования платы с STM32F030F4P6 будем использовать программатор клон ST-LINK V2
Подключаем программатор к плате с STM32F030F4P6 и получаем следующую сборку см.ниже
С технической составляющей закончено - переходим к программной части.
Программу будем разрабатывать в среде Keil Vision.
Как создать проект в Keil - можно почитать - ссылка и даже посмотреть - ссылка в конце статьи
Запускаем Keil создаем проект и начинаем настраивать порты
***************************************************************************************************************
// Конфигурируем порты
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); // Включаем тактирование порта B
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE); // Включаем тактирование порта A
// Настраиваем встроенный светодиод на плате PA4
GPIO_InitStructure.GPIO_Pin = Led;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Настраиваем пин CS PB1
GPIO_InitStructure.GPIO_Pin = CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,CS); // Отключим AD8400
// Настраиваем пин SDI PA7
GPIO_InitStructure.GPIO_Pin = SDI;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,SDI); // переведем в ноль выход данных
// Настраиваем пин CLK PA5
GPIO_InitStructure.GPIO_Pin = CLK;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,CLK);
}
********************************************************************************
Напишем основную программу для задания нужного нам переменного резистора
void ad8400_write(uint8_t Address, uint8_t Data) // Подпрограмма позволяет работать с переменными резисторами
{
uint32_t posilka;
uint8_t i;
posilka = (Address << 8) | Data; // Формируем посылку из адреса + данных
GPIO_ResetBits(GPIOB,CS); // Разрешаем запись в AD8400
for (i = 0; i < 10; i++)
{
GPIO_ResetBits(GPIOA,CLK); // генерируем сигнал CLK
if ((posilka & 0x200) == 0) //
{
GPIO_ResetBits(GPIOA,SDI);//SDI
}
else
{
GPIO_SetBits(GPIOA,SDI);
}
GPIO_SetBits(GPIOA,CLK);
posilka = posilka << 1;
}
GPIO_SetBits(GPIOA,SDI);
GPIO_SetBits(GPIOB,CS);
}
***********************************************************************************************
И осталось из main обратиться к нужной нам функции
int main(void)
{
SysTick_Config(SystemCoreClock); // необходимо для получения паузы
GPIO_init(); // Инициализируем порты
while (1)
{
Led_ON; // Включаем светодиод
delay_ms(1000); // пауза 1 сек
ad8400_write(0, 128); // отправляем по нулевому адресу нужную нам позицию переменного резистора
Led_OFF; // выключаем светодиод
delay_ms(1000); // пауза 1 сек
}
}
*****************************************************************************************************************
Загружаем программу в микроконтроллер на плате и измеряем сопротивление между W1 и A1 или W1 и B1.
Ура!!!!
Все получилось!
Программа позволяем изменять переменный резистор с дискретностью в 1 шаг от 0 до 255.
Если необходим исходник программы или остались вопросы то пишем на stm32@stm32res.ru