DMAを検出して、ADCのマルチチャネル検出電圧値は、複数のチャネルです。
cubemxは以下に。
変換数の数は、ADCで使用するチャネルの数です。次のランクにサンプリング時間とチャンネルのチャンネル名を設定します。
ADC割り込みを有効にします。
DMAモード設定でそれ以外の場合は、唯一のDMAが設けられていない、環状モードに設定されています。1バイトのデータ幅は、使用することは、二倍のそれ以外の場合は、ADCのDMAは引き返しました。
プログラムを見て。
最初のコード。
int型メイン(無効) { / * ユーザーコードは、1をBEGIN * / / * ユーザコードEND 1 * / / * MCU設定---------------------------------------------- ---------- * / / * すべての周辺機器のリセット、初期化フラッシュインタフェースとのSysTick。* / HAL_Init(); / * ユーザーコードは、初期化をBEGIN * / / * USER CODE END初期化* / / * を設定し、システムクロック* / SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ uint32_t AD_DMA[2]; float a, b; HAL_ADCEx_Calibration_Start(&hadc1); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_ADC_Start_DMA(&hadc1, AD_DMA, 2); a = (float)AD_DMA[0]; b = (float)AD_DMA[1]; /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ printf("PA2电压为 %.2fV\r\n", (a * 3.3) / 4096); // a除以4096 * 3.3 会更好理解 printf("PA3电压为 %.2fV\r\n", (b * 3.3) / 4096); printf("\r\n"); HAL_Delay(1000); }
因为HAL库中,DMA开启ADC是通过这个函数定义的,HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)。看参数,即先定义一个装载从DMA读取的ad值,多少通道就设几个,不然读完所用通道之后还有多的地方装载数据,会造成数据混乱不正确不匹配。
uint32_t AD_DMA[2];
接着要进行一个adc校准。
HAL_ADCEx_Calibration_Start(&hadc1);
函数作用为进行adc的自校准,消除每个电容上的误差,用在adc_start之前。
接着我们开启dma的adc模式。
HAL_ADC_Start_DMA(&hadc1, AD_DMA, 2);
最后一个参数意思是装载的字节长度,一般是多少通道就设多少,在cubemx设置了word,如果是half word,则为两倍。
最后就是利用dma把adc值装入了这个数组中,再把它们读出来即可。