CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使うプログラムを,入力として STM32F746 の内蔵 ADC を使うように変更したもの. http://seminar.cqpub.co.jp/ccm/ES18-0020

Dependencies:   mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Committer:
MikamiUitOpen
Date:
Mon Mar 12 05:10:31 2018 +0000
Revision:
2:dd48e1e59daa
Parent:
0:ab7a35d87173
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:ab7a35d87173 1 //----------------------------------------------------------
MikamiUitOpen 0:ab7a35d87173 2 // Simultanuous AD Conversion by polling using
MikamiUitOpen 0:ab7a35d87173 3 // ADC1 and ADC3 on STM32F746
MikamiUitOpen 0:ab7a35d87173 4 //
MikamiUitOpen 0:ab7a35d87173 5 // STM32F746 の ADC1, ADC3 を使って同時に AD 変換を開始し,
MikamiUitOpen 0:ab7a35d87173 6 // ポーリングによりアナログ信号を入力するクラス
MikamiUitOpen 0:ab7a35d87173 7 //
MikamiUitOpen 0:ab7a35d87173 8 // PA_0 (DISCO-F746 の A0) : ADC1 CH0
MikamiUitOpen 0:ab7a35d87173 9 // PF_10 (DISCO-F746 の A1) : ADC3 CH8
MikamiUitOpen 0:ab7a35d87173 10 //
MikamiUitOpen 0:ab7a35d87173 11 // 2017/08/16, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:ab7a35d87173 12 //----------------------------------------------------------
MikamiUitOpen 0:ab7a35d87173 13
MikamiUitOpen 0:ab7a35d87173 14 #include "F746_ADC.hpp"
MikamiUitOpen 0:ab7a35d87173 15
MikamiUitOpen 0:ab7a35d87173 16 namespace Mikami
MikamiUitOpen 0:ab7a35d87173 17 {
MikamiUitOpen 0:ab7a35d87173 18 AdcDual::AdcDual(int frequency)
MikamiUitOpen 0:ab7a35d87173 19 {
MikamiUitOpen 0:ab7a35d87173 20 GPIO_InitTypeDef gpioInit;
MikamiUitOpen 0:ab7a35d87173 21 // 以下の三つのメンバの値は共通
MikamiUitOpen 0:ab7a35d87173 22 gpioInit.Mode = GPIO_MODE_ANALOG;
MikamiUitOpen 0:ab7a35d87173 23 gpioInit.Pull = GPIO_NOPULL;
MikamiUitOpen 0:ab7a35d87173 24 gpioInit.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
MikamiUitOpen 0:ab7a35d87173 25
MikamiUitOpen 0:ab7a35d87173 26 // PA0 を ADC 入力として使うための設定
MikamiUitOpen 0:ab7a35d87173 27 __HAL_RCC_GPIOA_CLK_ENABLE();
MikamiUitOpen 0:ab7a35d87173 28 HAL_GPIO_DeInit(GPIOA, 0);
MikamiUitOpen 0:ab7a35d87173 29 gpioInit.Pin = GPIO_PIN_0;
MikamiUitOpen 0:ab7a35d87173 30 HAL_GPIO_Init(GPIOA, &gpioInit);
MikamiUitOpen 0:ab7a35d87173 31
MikamiUitOpen 0:ab7a35d87173 32 // PF10 を ADC 入力として使うための設定
MikamiUitOpen 0:ab7a35d87173 33 __HAL_RCC_GPIOF_CLK_ENABLE();
MikamiUitOpen 0:ab7a35d87173 34 HAL_GPIO_DeInit(GPIOF, 10);
MikamiUitOpen 0:ab7a35d87173 35 gpioInit.Pin = GPIO_PIN_10;
MikamiUitOpen 0:ab7a35d87173 36 HAL_GPIO_Init(GPIOF, &gpioInit);
MikamiUitOpen 0:ab7a35d87173 37
MikamiUitOpen 0:ab7a35d87173 38 // ADC1 の設定 (PA0)
MikamiUitOpen 0:ab7a35d87173 39 __HAL_RCC_ADC1_CLK_ENABLE();
MikamiUitOpen 0:ab7a35d87173 40 ADC1->CR1 = 0x0;
MikamiUitOpen 0:ab7a35d87173 41 ADC1->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される
MikamiUitOpen 0:ab7a35d87173 42 | ADC_EXTERNALTRIGCONV_T6_TRGO // 外部トリガ: Timer6 TRGO event
MikamiUitOpen 0:ab7a35d87173 43 | ADC_CR2_ADON; // ADC を有効にする
MikamiUitOpen 0:ab7a35d87173 44 ADC1->SQR3 = 0x0; // CH0 を使う
MikamiUitOpen 0:ab7a35d87173 45
MikamiUitOpen 0:ab7a35d87173 46 // ADC3 の設定 (PF10)
MikamiUitOpen 0:ab7a35d87173 47 __HAL_RCC_ADC3_CLK_ENABLE();
MikamiUitOpen 0:ab7a35d87173 48 ADC3->CR1 = 0x0;
MikamiUitOpen 0:ab7a35d87173 49 ADC3->CR2 = ADC_EXTERNALTRIGCONVEDGE_RISING // 外部トリガの立ち上がりで開始される
MikamiUitOpen 0:ab7a35d87173 50 | ADC_EXTERNALTRIGCONV_T6_TRGO // 外部トリガ: Timer6 TRGO event
MikamiUitOpen 0:ab7a35d87173 51 | ADC_CR2_ADON; // ADC を有効にする
MikamiUitOpen 0:ab7a35d87173 52 ADC3->SQR3 = 0x8; // CH8 を使う
MikamiUitOpen 0:ab7a35d87173 53
MikamiUitOpen 0:ab7a35d87173 54 // ADC 共通の設定
MikamiUitOpen 0:ab7a35d87173 55 ADC->CCR = 0x0; // 念のため
MikamiUitOpen 0:ab7a35d87173 56
MikamiUitOpen 0:ab7a35d87173 57 // AD 変換器の外部トリガに使うタイマ (TIM6) の設定
MikamiUitOpen 0:ab7a35d87173 58 SetTim6(frequency);
MikamiUitOpen 0:ab7a35d87173 59
MikamiUitOpen 0:ab7a35d87173 60 // これを入れなければ動かない(理由は不明)
MikamiUitOpen 0:ab7a35d87173 61 __DAC_CLK_ENABLE();
MikamiUitOpen 0:ab7a35d87173 62 // 下記と同じ処理の別表現
MikamiUitOpen 0:ab7a35d87173 63 // RCC->APB1ENR |= RCC_APB1ENR_DACEN;
MikamiUitOpen 0:ab7a35d87173 64 }
MikamiUitOpen 0:ab7a35d87173 65
MikamiUitOpen 0:ab7a35d87173 66 void AdcDual::Read(float &ad1, float &ad2)
MikamiUitOpen 0:ab7a35d87173 67 {
MikamiUitOpen 0:ab7a35d87173 68 WaitDone();
MikamiUitOpen 0:ab7a35d87173 69 ad1 = ToFloat(ADC1->DR);
MikamiUitOpen 0:ab7a35d87173 70 ad2 = ToFloat(ADC3->DR);
MikamiUitOpen 0:ab7a35d87173 71 }
MikamiUitOpen 0:ab7a35d87173 72
MikamiUitOpen 0:ab7a35d87173 73 void AdcDual::Read(uint16_t &ad1, uint16_t &ad2)
MikamiUitOpen 0:ab7a35d87173 74 {
MikamiUitOpen 0:ab7a35d87173 75 WaitDone();
MikamiUitOpen 0:ab7a35d87173 76 ad1 = ADC1->DR;
MikamiUitOpen 0:ab7a35d87173 77 ad2 = ADC3->DR;
MikamiUitOpen 0:ab7a35d87173 78 }
MikamiUitOpen 0:ab7a35d87173 79
MikamiUitOpen 0:ab7a35d87173 80 void AdcDual::SetTim6(int frequency)
MikamiUitOpen 0:ab7a35d87173 81 {
MikamiUitOpen 0:ab7a35d87173 82 __HAL_RCC_TIM6_CLK_ENABLE(); // Supply clock. See "stm32f7xx_hal_rcc_ex.h"
MikamiUitOpen 0:ab7a35d87173 83 SystemCoreClockUpdate(); // Update core clock. See "system_stm32f7xx.h"
MikamiUitOpen 0:ab7a35d87173 84
MikamiUitOpen 0:ab7a35d87173 85 TIM_TypeDef* const myTim = TIM6;
MikamiUitOpen 0:ab7a35d87173 86
MikamiUitOpen 0:ab7a35d87173 87 myTim->CR2 = TIM_CR2_MMS_1; // Update event: as trigger out
MikamiUitOpen 0:ab7a35d87173 88
MikamiUitOpen 0:ab7a35d87173 89 uint32_t psc = 0;
MikamiUitOpen 0:ab7a35d87173 90 uint32_t arr;
MikamiUitOpen 0:ab7a35d87173 91 while (true)
MikamiUitOpen 0:ab7a35d87173 92 {
MikamiUitOpen 0:ab7a35d87173 93 // TIM6 の入力のクロックは RCC_DCKCFGR1 の TIMPRE ビットにより
MikamiUitOpen 0:ab7a35d87173 94 // 108/216 MHz のいずれかに設定される
MikamiUitOpen 0:ab7a35d87173 95 // (RM0385 Rev.2, Reference manual では RCC_DKCFGR1 となっている)
MikamiUitOpen 0:ab7a35d87173 96 if ((RCC->DCKCFGR1 & RCC_DCKCFGR1_TIMPRE) == RCC_DCKCFGR1_TIMPRE)
MikamiUitOpen 0:ab7a35d87173 97 arr = SystemCoreClock/((psc + 1)*frequency);
MikamiUitOpen 0:ab7a35d87173 98 else
MikamiUitOpen 0:ab7a35d87173 99 arr = (SystemCoreClock/2)/((psc + 1)*frequency);
MikamiUitOpen 0:ab7a35d87173 100 if (arr <= 65536) break;
MikamiUitOpen 0:ab7a35d87173 101 psc++;
MikamiUitOpen 0:ab7a35d87173 102 }
MikamiUitOpen 0:ab7a35d87173 103 myTim->ARR = arr - 1; // Auto-reload
MikamiUitOpen 0:ab7a35d87173 104 myTim->PSC = psc; // Prescaler
MikamiUitOpen 0:ab7a35d87173 105 myTim->CR1 = TIM_CR1_CEN; // Enable TIM6
MikamiUitOpen 0:ab7a35d87173 106 }
MikamiUitOpen 0:ab7a35d87173 107 }