STM32 ADC DMA
STM32 ADC DMA
割り込みで読むという方法などがあるが、連続的に読むやり方。
1.ピン配置
AnalogからADC1を選択(別にADC2でもよい、上の例では4チャンネル分を指定。すでにSPIと競合しているピンが赤くなっている)下のタブをDMA Settingにきりかえ、Addを押す。
ModeをCircularをしていして、Memoryの方にIncrementのチェックが入っているか確認する。
Continuous Conversion Mode Enable
Number of Conversion を読み取る端子の数、ここでは4
それぞれRank違いで、Sampling Timeを設定し、Channel0から1、2と使うチャンネル分増やす。Sampling Timeここは長くっとっておいて様子を見て早くする(計算すればよいんだろうけど・・・)
ADCについての詳しい解説:
Clockの方も必要に応じて編集する。
ADC prescalerを/6を選択して12MHzに設定した。ここまでできたら保存してコードを吐き出す。
2.コーディング
/* USER CODE BEGIN 2 */
//ADC setting
uint16_t ADC_buff[4];
while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK); // calibrate AD convertor
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_buff, 4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE END 2 */
メイン部分は
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/*read ADC*/
for (int i=0;i<4;i++){
V1[i]=ADC_buff[i]/4095.0*3.3;
sprintf(OLED_buffer, "ch%d=%d\n\r",i+1,ADC_buff[i]);
ssd1306_SetCursor(0, 8*i);
ssd1306_WriteString((char *)OLED_buffer, Font_6x8, White);
}
ssd1306_UpdateScreen();
}
ADC_buffを呼び出すごとに読み取りされる。
ch1~ch4で干渉している5-7を飛ばして、8をさらに有効化した場合でもBuffer[0]にch1,[1]にはch2.....[3]にch4, [4]にch8が格納される。
コメント
コメントを投稿