Ваше программное обеспечение отлично справляется с поставленной задачей, но оно также блокирует некоторые полезные и важные функции. Для наилучшего использования сайта, пожалуйста, найдите время, чтобы отключить ваш AdBlocker.

STM32F030F4P6 AD8400 Keil

Опубликовано stm32 - сб, 03/20/2021 - 12:00

Всем привет!

STM32F030F4P6 AD8400.

Цель получить управление цифровым резистором от 0 до 5 Ком.

Для этого выбираем микросхему AD8400ARZ10 [SO-8]

В этой стать мы создадим тестовую плату с цифровым потенциометром AD8400, подключим тестовую плату с AD8400  к китайской плате с установленным на ней микроконтроллером фирмы STMSTM32F030F4P6, напишем простую программу программного SPI для передачи данных от STM32F030F4P6 к  AD8400 в среде программирования Keil Vision 

И так приступим..

Минимальную информацию для использования AD8400  в своем проекте можно посмотреть в статье ссылка

Выбираем микросхему в нужном нам корпусе.

Я выбрал SO-8

f2_7

И нарисовал простую плату в DIP TRACE. Нам для тестового варианта сложного не чего проектировать не нужно. Просто выводим все пины микросхемы на штырьковый разъем.

 f2_6

Перенес на текстолит и вытравил - как это делать более подробнее в статье STM32F030F4P6 hand-made

Получилась тестовая плата

f2_3

Припаиваем на плату микросхему AD8400

f2_2

Конечный вид платы и внешний вид микросхемы (как на рисунке так и на плате)

f1_6_0

f2_1

 

Для продолжения работы возьмем одну из популярных макетных плат из большого китайского магазина  

 

f2_5

Плата простая, дешевая, все пины выведены на штырьковые разъемы. Микроконтроллер установленный на плате соответствует STM32F030F4P6.

Соединяем тестовую плату с AD8400 перемычками с  платой с  STM32F030F4P6 следующим образом:

Плата с AD8400             Плата с STM32F030F4P6

                          CS    <---   PB1   

                           SDI  <---  PA7  

                          CLK <---   PA5                

                          VDD <--- 3V3

                        GND   <--- GND

                A1 W1 B1  цифровой потенциометр оставим пока не подключенным

В результате получаем следующую сборку см. фото ниже

 

f2_4

Для программирования платы  с  STM32F030F4P6 будем использовать программатор клон ST-LINK V2 

f2_8

Подключаем программатор к плате с STM32F030F4P6 и получаем следующую сборку см.ниже 

f2_9

 

С технической составляющей закончено - переходим к программной части.

Программу будем разрабатывать в среде 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 

 

 

 

Яндекс.Метрика