不韋 呂
/
SDR_AM_Rx_CIC
AM中波放送用SDR.CICフィルタのみを使用.CQ出版社「トランジスタ技術」誌,2021年4月号に掲載
SDR_Library/F446_ADC.cpp@1:30d9fb51dec1, 2019-09-23 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Sep 23 07:32:10 2019 +0000
- Revision:
- 1:30d9fb51dec1
- Parent:
- 0:6906f8616429
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:6906f8616429 | 1 | //------------------------------------------------------------- |
MikamiUitOpen | 0:6906f8616429 | 2 | // F446 内蔵 ADC をポーリング方式で使うためのクラス |
MikamiUitOpen | 0:6906f8616429 | 3 | // ADC2 を使用(固定) |
MikamiUitOpen | 0:6906f8616429 | 4 | // |
MikamiUitOpen | 0:6906f8616429 | 5 | // 2019/07/15, Copyright (c) 2019 MIKAMI, Naoki |
MikamiUitOpen | 0:6906f8616429 | 6 | //------------------------------------------------------------- |
MikamiUitOpen | 0:6906f8616429 | 7 | |
MikamiUitOpen | 0:6906f8616429 | 8 | #include "F446_ADC.hpp" |
MikamiUitOpen | 0:6906f8616429 | 9 | #include "PeripheralPins.h" // PinMap_ADC を使う場合に必要 |
MikamiUitOpen | 0:6906f8616429 | 10 | #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため |
MikamiUitOpen | 0:6906f8616429 | 11 | // PeripheralPins.c は以下よりたどって行けば取得可能 |
MikamiUitOpen | 0:6906f8616429 | 12 | // https://gitlab.exmachina.fr/fw-libs/mbed-os/tree/5.8.1 |
MikamiUitOpen | 0:6906f8616429 | 13 | |
MikamiUitOpen | 0:6906f8616429 | 14 | namespace Mikami |
MikamiUitOpen | 0:6906f8616429 | 15 | { |
MikamiUitOpen | 0:6906f8616429 | 16 | // コンストラクタ |
MikamiUitOpen | 0:6906f8616429 | 17 | AdcF446::AdcF446(float fSampling, PinName pin) : myAdc_(ADC2) |
MikamiUitOpen | 0:6906f8616429 | 18 | { |
MikamiUitOpen | 0:6906f8616429 | 19 | AnalogIn adc_(pin); // GPIO を ADC 用に切り替えるために必要 |
MikamiUitOpen | 0:6906f8616429 | 20 | // この時点で ADC1 の CR2 の ADON ビットは 0 になっている |
MikamiUitOpen | 0:6906f8616429 | 21 | __HAL_RCC_ADC1_CLK_DISABLE(); // ADC1 に供給されているクロックを停止する |
MikamiUitOpen | 0:6906f8616429 | 22 | |
MikamiUitOpen | 0:6906f8616429 | 23 | __HAL_RCC_ADC2_CLK_ENABLE(); // ADC2 にクロックを供給する |
MikamiUitOpen | 0:6906f8616429 | 24 | // __HAL_RCC_ADC2_CLK_ENABLE() の定義:stm32f4xx_hal_rcc_ex.h |
MikamiUitOpen | 0:6906f8616429 | 25 | |
MikamiUitOpen | 0:6906f8616429 | 26 | // pin に対応するチャンネルを使うための設定 |
MikamiUitOpen | 0:6906f8616429 | 27 | myAdc_->SQR3 = STM_PIN_CHANNEL(pinmap_function(pin, PinMap_ADC)); |
MikamiUitOpen | 0:6906f8616429 | 28 | // pinmap_function() のヘッダファイル: mbed\hal\pinmap.h |
MikamiUitOpen | 0:6906f8616429 | 29 | // STM_PIN_CHANNEL() の定義:PinNamesTypes.h |
MikamiUitOpen | 0:6906f8616429 | 30 | |
MikamiUitOpen | 0:6906f8616429 | 31 | // ADC の CR1 の設定 |
MikamiUitOpen | 0:6906f8616429 | 32 | myAdc_->CR1 = 0x0; // AD 変換終了割り込みを禁止 |
MikamiUitOpen | 0:6906f8616429 | 33 | // ADC の CR2 の設定 |
MikamiUitOpen | 0:6906f8616429 | 34 | myAdc_->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される |
MikamiUitOpen | 0:6906f8616429 | 35 | | ADC_EXTERNALTRIGCONV_T8_TRGO // 外部トリガ: Timer8 TRGO event |
MikamiUitOpen | 0:6906f8616429 | 36 | | ADC_CR2_ADON; // ADC を有効にする |
MikamiUitOpen | 0:6906f8616429 | 37 | |
MikamiUitOpen | 0:6906f8616429 | 38 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:6906f8616429 | 39 | SetTim8(fSampling); |
MikamiUitOpen | 0:6906f8616429 | 40 | } |
MikamiUitOpen | 0:6906f8616429 | 41 | |
MikamiUitOpen | 0:6906f8616429 | 42 | // AD 変換された値を読み込む |
MikamiUitOpen | 0:6906f8616429 | 43 | float AdcF446::Read() |
MikamiUitOpen | 0:6906f8616429 | 44 | { |
MikamiUitOpen | 0:6906f8616429 | 45 | while ((ADC2->SR & ADC_SR_EOC) != ADC_SR_EOC) {} |
MikamiUitOpen | 0:6906f8616429 | 46 | return ToFloat(myAdc_->DR); |
MikamiUitOpen | 0:6906f8616429 | 47 | } |
MikamiUitOpen | 0:6906f8616429 | 48 | |
MikamiUitOpen | 0:6906f8616429 | 49 | // AD 変換器の外部トリガに使うタイマ (TIM8) の設定 |
MikamiUitOpen | 0:6906f8616429 | 50 | // fSampling 標本化周波数 [kHz] |
MikamiUitOpen | 0:6906f8616429 | 51 | void AdcF446::SetTim8(float fSampling) |
MikamiUitOpen | 0:6906f8616429 | 52 | { |
MikamiUitOpen | 0:6906f8616429 | 53 | __HAL_RCC_TIM8_CLK_ENABLE(); // クロック供給. "stm32f4xx_hal_rcc.h" 参照 |
MikamiUitOpen | 0:6906f8616429 | 54 | TIM_TypeDef* const TIM = TIM8; |
MikamiUitOpen | 0:6906f8616429 | 55 | |
MikamiUitOpen | 0:6906f8616429 | 56 | TIM->CR2 = TIM_TRGO_UPDATE; // Update event を TRGO (trigger output) とする |
MikamiUitOpen | 0:6906f8616429 | 57 | |
MikamiUitOpen | 0:6906f8616429 | 58 | float arrF = (SystemCoreClock/fSampling)/1000.0f; |
MikamiUitOpen | 0:6906f8616429 | 59 | if (arrF >65535) |
MikamiUitOpen | 0:6906f8616429 | 60 | { |
MikamiUitOpen | 0:6906f8616429 | 61 | fprintf(stderr, "%8.2f kHz : 標本化周波数が低すぎます.\r\n", fSampling); |
MikamiUitOpen | 0:6906f8616429 | 62 | while (true) {} |
MikamiUitOpen | 0:6906f8616429 | 63 | } |
MikamiUitOpen | 0:6906f8616429 | 64 | TIM->ARR = floor(arrF + 0.5f) - 1; // Auto-reload レジスタの設定 |
MikamiUitOpen | 0:6906f8616429 | 65 | TIM->PSC = 0; // Prescaler の設定 |
MikamiUitOpen | 0:6906f8616429 | 66 | TIM->CR1 = TIM_CR1_CEN; // TIM8 を有効にする |
MikamiUitOpen | 0:6906f8616429 | 67 | } |
MikamiUitOpen | 0:6906f8616429 | 68 | } |