Library for build-in ADC and DAC in STM32F446 mounted on Nucleo F446RE. Nucleo F446RE に搭載されている STM32F446 の内蔵 ADC, DAC 用のライブラリ.

Dependents:   Demo_F446_AD_DA F446_MySoundMachine F446_ADF_Nlms F446_Spectrogram

Committer:
MikamiUitOpen
Date:
Tue Feb 21 13:10:46 2017 +0000
Revision:
6:bbc26cf86b70
Parent:
4:16667bdb8227
7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:c945b4fe9a48 1 //----------------------------------------------------------
MikamiUitOpen 0:c945b4fe9a48 2 // Simultanuous AD Conversion by polling using
MikamiUitOpen 4:16667bdb8227 3 // ADC2 and ADC3 on STM32F446
MikamiUitOpen 0:c945b4fe9a48 4 //
MikamiUitOpen 0:c945b4fe9a48 5 // STM32F446 の ADC2, ADC3 を使って同時に AD 変換を開始し,
MikamiUitOpen 0:c945b4fe9a48 6 // ポーリングによりアナログ信号を入力するクラス
MikamiUitOpen 0:c945b4fe9a48 7 // A0 (PA_0) : ADC2 CH0
MikamiUitOpen 0:c945b4fe9a48 8 // A1 (PA_1) : ADC3 CH1
MikamiUitOpen 0:c945b4fe9a48 9 //
MikamiUitOpen 4:16667bdb8227 10 // 2017/02/16, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:c945b4fe9a48 11 //----------------------------------------------------------
MikamiUitOpen 0:c945b4fe9a48 12
MikamiUitOpen 0:c945b4fe9a48 13 #include "F446_ADC.hpp"
MikamiUitOpen 0:c945b4fe9a48 14
MikamiUitOpen 0:c945b4fe9a48 15 namespace Mikami
MikamiUitOpen 0:c945b4fe9a48 16 {
MikamiUitOpen 0:c945b4fe9a48 17 AdcDual::AdcDual(int frequency)
MikamiUitOpen 0:c945b4fe9a48 18 {
MikamiUitOpen 2:29f9831ce719 19 // PA0, PA1 を ADC 入力として使うための設定
MikamiUitOpen 0:c945b4fe9a48 20 __HAL_RCC_GPIOA_CLK_ENABLE();
MikamiUitOpen 0:c945b4fe9a48 21 GPIO_InitTypeDef gpioInit;
MikamiUitOpen 0:c945b4fe9a48 22 gpioInit.Pin = GPIO_PIN_0 | GPIO_PIN_1;
MikamiUitOpen 0:c945b4fe9a48 23 gpioInit.Mode = GPIO_MODE_ANALOG;
MikamiUitOpen 0:c945b4fe9a48 24 gpioInit.Pull = GPIO_NOPULL;
MikamiUitOpen 0:c945b4fe9a48 25 gpioInit.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
MikamiUitOpen 0:c945b4fe9a48 26 HAL_GPIO_Init(GPIOA, &gpioInit);
MikamiUitOpen 0:c945b4fe9a48 27
MikamiUitOpen 2:29f9831ce719 28 // ADC2 の設定 (入力ポート:PA0)
MikamiUitOpen 0:c945b4fe9a48 29 __HAL_RCC_ADC2_CLK_ENABLE();
MikamiUitOpen 0:c945b4fe9a48 30 ADC2->CR1 = 0x0;
MikamiUitOpen 0:c945b4fe9a48 31 ADC2->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される
MikamiUitOpen 0:c945b4fe9a48 32 | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event
MikamiUitOpen 0:c945b4fe9a48 33 | ADC_CR2_ADON; // ADC を有効にする
MikamiUitOpen 0:c945b4fe9a48 34 ADC2->SQR3 = 0x0; // CH0 を使う
MikamiUitOpen 0:c945b4fe9a48 35
MikamiUitOpen 2:29f9831ce719 36 // ADC3 の設定 (入力ポート:PA1)
MikamiUitOpen 0:c945b4fe9a48 37 __HAL_RCC_ADC3_CLK_ENABLE();
MikamiUitOpen 0:c945b4fe9a48 38 ADC3->CR1 = 0x0;
MikamiUitOpen 0:c945b4fe9a48 39 ADC3->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される
MikamiUitOpen 0:c945b4fe9a48 40 | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event
MikamiUitOpen 0:c945b4fe9a48 41 | ADC_CR2_ADON; // ADC を有効にする
MikamiUitOpen 0:c945b4fe9a48 42 ADC3->SQR3 = 0x1; // CH1 を使う
MikamiUitOpen 0:c945b4fe9a48 43
MikamiUitOpen 0:c945b4fe9a48 44 // ADC 共通の設定
MikamiUitOpen 0:c945b4fe9a48 45 ADC->CCR = 0x0; // 念のため
MikamiUitOpen 0:c945b4fe9a48 46
MikamiUitOpen 0:c945b4fe9a48 47 // AD 変換器の外部トリガに使うタイマ (TIM8) の設定
MikamiUitOpen 0:c945b4fe9a48 48 SetTim8(frequency);
MikamiUitOpen 0:c945b4fe9a48 49 }
MikamiUitOpen 0:c945b4fe9a48 50
MikamiUitOpen 0:c945b4fe9a48 51 void AdcDual::Read(float &ad1, float &ad2)
MikamiUitOpen 0:c945b4fe9a48 52 {
MikamiUitOpen 0:c945b4fe9a48 53 WaitDone();
MikamiUitOpen 0:c945b4fe9a48 54 ad1 = ToFloat(ADC2->DR);
MikamiUitOpen 0:c945b4fe9a48 55 ad2 = ToFloat(ADC3->DR);
MikamiUitOpen 0:c945b4fe9a48 56 }
MikamiUitOpen 0:c945b4fe9a48 57
MikamiUitOpen 0:c945b4fe9a48 58 void AdcDual::Read(uint16_t &ad1, uint16_t &ad2)
MikamiUitOpen 0:c945b4fe9a48 59 {
MikamiUitOpen 0:c945b4fe9a48 60 WaitDone();
MikamiUitOpen 0:c945b4fe9a48 61 ad1 = ADC2->DR;
MikamiUitOpen 0:c945b4fe9a48 62 ad2 = ADC3->DR;
MikamiUitOpen 0:c945b4fe9a48 63 }
MikamiUitOpen 0:c945b4fe9a48 64
MikamiUitOpen 0:c945b4fe9a48 65 void AdcDual::SetTim8(int frequency)
MikamiUitOpen 0:c945b4fe9a48 66 {
MikamiUitOpen 0:c945b4fe9a48 67 __HAL_RCC_TIM8_CLK_ENABLE(); // Supply clock. See "stm32f4xx_hal_rcc.h"
MikamiUitOpen 0:c945b4fe9a48 68 SystemCoreClockUpdate(); // Update core clock. See "system_stm32f4xx.h"
MikamiUitOpen 0:c945b4fe9a48 69 TIM_TypeDef* const myTim = TIM8;
MikamiUitOpen 0:c945b4fe9a48 70
MikamiUitOpen 0:c945b4fe9a48 71 myTim->CR2 = TIM_CR2_MMS_1; // Update event: as trigger out
MikamiUitOpen 0:c945b4fe9a48 72
MikamiUitOpen 0:c945b4fe9a48 73 uint32_t psc = 0;
MikamiUitOpen 0:c945b4fe9a48 74 uint16_t mul = 1;
MikamiUitOpen 0:c945b4fe9a48 75 uint32_t arr;
MikamiUitOpen 0:c945b4fe9a48 76 while (true)
MikamiUitOpen 0:c945b4fe9a48 77 {
MikamiUitOpen 0:c945b4fe9a48 78 arr = SystemCoreClock/(mul*frequency);
MikamiUitOpen 0:c945b4fe9a48 79 if (arr <= 65536) break;
MikamiUitOpen 0:c945b4fe9a48 80 psc++;
MikamiUitOpen 0:c945b4fe9a48 81 mul++;
MikamiUitOpen 0:c945b4fe9a48 82 if (psc > 65535)
MikamiUitOpen 0:c945b4fe9a48 83 {
MikamiUitOpen 0:c945b4fe9a48 84 fprintf(stderr, "Sampling frequency: too low.\r\n");
MikamiUitOpen 0:c945b4fe9a48 85 while (true) {}
MikamiUitOpen 0:c945b4fe9a48 86 }
MikamiUitOpen 0:c945b4fe9a48 87 }
MikamiUitOpen 0:c945b4fe9a48 88 myTim->ARR = arr - 1; // Auto-reload
MikamiUitOpen 0:c945b4fe9a48 89 myTim->PSC = psc; // Prescaler
MikamiUitOpen 0:c945b4fe9a48 90 myTim->CR1 = TIM_CR1_CEN; // Enable TIM8
MikamiUitOpen 0:c945b4fe9a48 91 }
MikamiUitOpen 1:6b9f2af6613d 92 }