STM Урок 19. HAL. ADC Injected Channel

 

 

 

Урок 19

HAL. ADC Injected Channel

 

 

Проект создаём из ADC_REGULAR_DMA, называем его ADC_INJECTED.

Запускаем Cube. Заходим в Configuration. Отключим там везде DMA.

Также отключим прерывания от АЦП, если таковые включены. Они нам пока не нужны. Это тема следующего урока.

Настраиваем там вот так

 

 

image00

image01

 

Генерируем и запускаем проект.

Как всегда настроим программатор и подключим файл lcd.h

Удалим все счётчики cnt отовсюду, включая SysTick

 

volatile uint32_t cnt1, cnt2;

/* USER CODE END PV */

/* USER CODE BEGIN 2 */

        cnt1=0;cnt2=0;

        sprintf(str,"%10u",cnt1);//преобразуем результат в строку

        LCD_SetPos(6,0);//покажем результат на ЖКИ-дисплее

        LCD_String(str);

        sprintf(str,"%10u",cnt2);

        LCD_SetPos(6,1);//покажем результат на ЖКИ-дисплее

        LCD_String(str);

        cnt1++;

//        ADC_Data[0] = HAL_ADC_GetValue(hadc1);

/* USER CODE BEGIN 0 */

extern volatile uint32_t cnt2;

/* USER CODE END 0 */

void SysTick_Handler(void)

{

  /* USER CODE BEGIN SysTick_IRQn 0 */

        cnt2++;

  /* USER CODE END SysTick_IRQn 0 */

 

 

Уберем также старт АЦП с DMA

 

        LCD_Clear();

        HAL_ADC_Start_DMA(&hadc1,(uint32_t*) &ADC_Data,4);

  /* USER CODE END 2 */

 

Уберем также цикл for из бесконечного цикла, содержимое цикла оставим

Все инжектоные функции теперь не на 108 странице, а на 126

Напишем в бесконечный цикл

 

  while (1)

  {

                HAL_ADCEx_InjectedStart(&hadc1);//запустим аналого-цифровое преобразование

                HAL_ADC_PollForConversion(&hadc1,100);//дождёмся окончания преобразований

                u[0]=((float)HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_1))*3/4096;//занесём результат преобразований в переменную

                u[1]=((float)HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_2))*3/4096;//занесём результат преобразований в переменную

                u[2]=((float)HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_3))*3/4096;//занесём результат преобразований в переменную

                u[3]=((float)HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_4))*3/4096;//занесём результат преобразований в переменную

 

Добавим в main() еще переменную для строки. А существующую немного увеличим. Счётчик-переменную i можно убрать

 

  /* USER CODE BEGIN 1 */

        float u[4];

        char str[21];

        char str1[9];

  /* USER CODE END 1 */

 

Допишем в бесконечный цикл следующий код

 

                u[2]=((float)HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_3))*3/4096;//занесём результат преобразований в переменную

                u[3]=((float)HAL_ADCEx_InjectedGetValue(&hadc1,ADC_INJECTED_RANK_4))*3/4096;//занесём результат преобразований в переменную

                sprintf(str,"%.2fv",u[0]);//преобразуем результат в строку

                sprintf(str1,"%.2fv",u[1]);//преобразуем результат в строку

                strcat(str,str1);

                sprintf(str1,"%.2fv",u[2]);//преобразуем результат в строку

                strcat(str,str1);

                sprintf(str1,"%.2fv",u[3]);//преобразуем результат в строку

                strcat(str,str1);

                LCD_SetPos(0,3);//покажем результат на ЖКИ-дисплее

                LCD_String(str);

                HAL_ADCEx_InjectedStop(&hadc1);//остановим преобразования

                HAL_Delay(200);//задержка перед следующим циклом

  /* USER CODE END WHILE */

 

Но чтобы нам использовать функцию strcat, подключим библиотеку

 

/* USER CODE BEGIN Includes */

#include "main.h"

#include <string.h>

/* USER CODE END Includes */

 

Предыдущий урок Программирование МК STM32 Следующий урок

 

Исходный код

 

Отладочную плату и дисплей можно приобрести здесь:

STM32F4-DISCOVERY

Дисплей LCD 20×4

 

 

Смотреть ВИДЕОУРОК

 

STM32 HAL. ADC Injected Channel

 

6 комментариев на “STM Урок 19. HAL. ADC Injected Channel
  1. nomadenvoy:

    Владимир, извините!

    Во вложении не тот пример у ВАС, проверьте пожалуйста исходный код!

  2. nomadenvoy:

    Да! И ещё во многих случаях SWD выключен, народ будет мучаться как я…

    • admin:

      А я его принудительно и не включаю. Вроде всё прошивается и отлаживаетя. Вы имеете в виду в Cube в разделе SYS выбирать Serial Wire?

  3. nomadenvoy:

    Да, именно это. Как то нарвался на то что камень не откликался после прошивки, вот и решил поделиться.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*