MyTetra Share
Делитесь знаниями!
ADC (Injected Channel)
Время создания: 19.01.2018 11:44
Раздел: Electronics - Microcontrollers - STM32 - HAL

Включаем ADC1 и соответствующие каналы:


Заходим в конфигурацию ADC и выставляем Scan Conversion Mode, остальные параметры отключаем:


В разделе ADC_Injected_ConversionMode выставляем количество используемых конвертаций (в нашем случае - 2) и распределяем их по каналам:


Собиарем проект.


/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "stm32f4xx_hal.h"


/* USER CODE BEGIN Includes */

#include "lcd44780.h"

/* USER CODE END Includes */


/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

uint8_t getDigit(uint16_t, uint16_t);

/* USER CODE END PFP */


int main(void)

{


/* USER CODE BEGIN 1 */

float adcResult[2];

/* USER CODE END 1 */


/* USER CODE BEGIN 2 */

lcdInit();

/* USER CODE END 2 */


/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

HAL_ADCEx_InjectedStart(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 100);

adcResult[0] = ((float)HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_1)) * 3 / 4096;

adcResult[1] = ((float)HAL_ADCEx_InjectedGetValue(&hadc1, ADC_INJECTED_RANK_2)) * 3 / 4096;

HAL_ADCEx_InjectedStop(&hadc1);

lcdSendCmnd(0x01);

lcdSendCmnd(0x02);


for(uint8_t i = 0; i < 2; ++i)

{

uint16_t value = adcResult[i];

uint16_t reminder = adcResult[i] * 1000;

lcdSendData(getDigit(value, 1));

lcdSendCode(0x2E);

lcdSendData(getDigit(reminder, 100));

lcdSendData(getDigit(reminder, 10));

lcdSendCmnd(0xA8);

}

/*

uint16_t value = adcResult[0];

uint16_t reminder = adcResult[0] * 1000;


lcdSendData(getDigit(value, 1));

lcdSendCode(0x2E);

lcdSendData(getDigit(reminder, 100));

lcdSendData(getDigit(reminder, 10));

lcdSendCmnd(0xA8);

value = adcResult[1];

reminder = adcResult[1] * 1000;

lcdSendData(getDigit(value, 1));

lcdSendCode(0x2E);

lcdSendData(getDigit(reminder, 100));

lcdSendData(getDigit(reminder, 10));

*/

HAL_Delay(1000);

}

/* USER CODE END 3 */


}


/* USER CODE BEGIN 4 */

uint8_t getDigit(uint16_t number, uint16_t exp)

{

if(exp == 100)

number %= 1000;

else if(exp == 10)

number %= 100;

else if(exp == 1)

return number %= 10;

return number / exp;

}

/* USER CODE END 4 */



ADC Ijected with Interrupts


Для работы через прерывания, включаем их и выбиарем в настройках переход в прерывание при завершении всех конвертаций, а не поканальной:



Остальные параметры оставляем без изменений.


/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

volatile uint16_t adc_result[2];

/* USER CODE END PV */


/* USER CODE BEGIN 1 */

float adcResult[2];

/* USER CODE END 1 */


/* USER CODE BEGIN WHILE */

HAL_ADCEx_InjectedStart_IT(&hadc1);

while (1)

{

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */

adcResult[0] = ((float)adc_result[0]) * 3 / 4096;

adcResult[1] = ((float)adc_result[1]) * 3 / 4096;

lcdSendCmnd(0x01);

lcdSendCmnd(0x02);


for(uint8_t i = 0; i < 2; ++i)

{

uint16_t value = adcResult[i];

uint16_t reminder = adcResult[i] * 1000;

lcdSendData(getDigit(value, 1));

lcdSendCode(0x2E);

lcdSendData(getDigit(reminder, 100));

lcdSendData(getDigit(reminder, 10));

lcdSendCmnd(0xA8);

}

HAL_Delay(1000);

}

/* USER CODE END 3 */


/* USER CODE BEGIN 4 */

void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc1)

{

adc_result[0] = HAL_ADCEx_InjectedGetValue(hadc1, ADC_INJECTED_RANK_1);

adc_result[1] = HAL_ADCEx_InjectedGetValue(hadc1, ADC_INJECTED_RANK_2);

HAL_ADCEx_InjectedStart_IT(hadc1);

}

/* USER CODE END 4 */














 
MyTetra Share v.0.53
Яндекс индекс цитирования