Вт ноя 22, 2022 14:28:08
/* USER CODE BEGIN PV */
char trans_str[63] = {0,}; // буфер для UART1
volatile uint16_t adc[2] = {0,}; // переменные для АЦП
volatile uint16_t adc1[NPT];
volatile uint16_t adc2[NPT];
volatile uint16_t cnt_NPT = 0;
volatile uint8_t flag = 0;
/* USER CODE END PV */
..........................................
/* USER CODE BEGIN 0 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1 && !flag) { //Если преобразование закончено и флаг в основном цикле был сброшен
if(cnt_NPT < NPT) {
adc1[cnt_NPT] = adc[0]; //запомнили значения для первого канала АЦП1
adc2[cnt_NPT] = adc[1]; //запомнили значения для второго канала АЦП2
adc[0] = 0; //сбросили значения
adc[1] = 0; //сбросили значения
cnt_NPT++;
} else {flag = 1; cnt_NPT = 0;} //ставим флаг что результат можно забирать
}
}
/* USER CODE END 0 */
..........................................
/* USER CODE BEGIN 2 */
HAL_ADCEx_Calibration_Start(&hadc1); //запуск автоматической самоккалибровки АЦП1
HAL_ADCEx_Calibration_Start(&hadc2); //запуск автоматической самоккалибровки АЦП2
HAL_ADC_Start(&hadc2); //запустить работу АЦП2
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)&adc, 1); //АЦП1 в мульти-режиме
HAL_TIM_OC_Start(&htim4, TIM_CHANNEL_4); //запустить рабуту таймера 4
/* USER CODE END 2 */
/* USER CODE BEGIN WHILE */
while (1)
{
if(flag) //Если флаг 1, значит результат измерения АЦП1 и АЦП2 готов
{
flag = 0;
for (uint16_t i=0; i<NPT; ){
snprintf(trans_str, 63, "%d %d %d\r\n", i, adc1[i], adc2[i]);
HAL_UART_Transmit(&huart1, (uint8_t*)trans_str, strlen(trans_str), 35);
i++; //инкрементируем после вывода инфы
}
//цикл пробежали, запускает АПЦ1 и АЦП2
//HAL_ADC_Start(&hadc2); //запустить работу АЦП2
//HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)&adc, 1); //длина равна 1 так как в DMA указано целое «слово»
}else{ //Если флаг 0, запускает АПЦ1 и АЦП2
//HAL_ADC_Start(&hadc2); //запустить работу АЦП2
//HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*)&adc, 1); //длина равна 1 так как в DMA указано целое «слово»
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
static void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_MultiModeTypeDef multimode = {0};
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T4_CC4;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure the ADC multi-mode
*/
multimode.Mode = ADC_DUALMODE_REGSIMULT;
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
static void MX_ADC2_Init(void)
{
/* USER CODE BEGIN ADC2_Init 0 */
/* USER CODE END ADC2_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC2_Init 1 */
/* USER CODE END ADC2_Init 1 */
/** Common config
*/
hadc2.Instance = ADC2;
hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc2.Init.ContinuousConvMode = DISABLE;
hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc2) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC2_Init 2 */
/* USER CODE END ADC2_Init 2 */
}
static void MX_TIM4_Init(void)
{
/* USER CODE BEGIN TIM4_Init 0 */
/* USER CODE END TIM4_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM4_Init 1 */
/* USER CODE END TIM4_Init 1 */
htim4.Instance = TIM4;
htim4.Init.Prescaler = 2187;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = 1;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_OC_Init(&htim4) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_TOGGLE;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_OC_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM4_Init 2 */
/* USER CODE END TIM4_Init 2 */
}
Ср ноя 23, 2022 08:59:31
Ср ноя 23, 2022 20:34:52
a797945 писал(а):Но очень вероятно, что ошибки нет и то что видите это реальность на f103
Пт ноя 25, 2022 12:20:56
Пт ноя 25, 2022 15:01:30
Пт ноя 25, 2022 18:08:38
Сб ноя 26, 2022 11:33:41
/* USER CODE BEGIN 0 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance == ADC1 && !flag) { //Если преобразование закончено и флаг в основном цикле был сброшен
if(cnt_NPT < NPT) {
adc1[cnt_NPT] = adc[0]; //запомнили значения для первого канала АЦП1
adc2[cnt_NPT] = adc[1]; //запомнили значения для второго канала АЦП2
adc[0] = 0; //сбросили значения
adc[1] = 0; //сбросили значения
cnt_NPT++;
} else {flag = 1; cnt_NPT = 0;} //ставим флаг что результат можно забирать
}
}
/* USER CODE END 0 */
Сб ноя 26, 2022 12:35:17
Сб ноя 26, 2022 12:54:27
a797945 писал(а):это вы же ?
Сб ноя 26, 2022 13:03:25
Сб ноя 26, 2022 21:33:57
Сб ноя 26, 2022 21:44:28
Вс ноя 27, 2022 11:07:32
Сб дек 03, 2022 12:38:36
Вс дек 04, 2022 13:09:49
Вс дек 04, 2022 15:15:26
КРАМ писал(а):Только непонятно зачем весь этот перфоманс?
А если имеется обработка перед выводом, то время преобразования перестает быть значимым. Ну и потребуется семплировать ЦАП от таймера.
Вс дек 04, 2022 15:33:26
Вс дек 04, 2022 16:15:40
Вс дек 04, 2022 16:31:19
Вс дек 04, 2022 17:30:53