STM32F767_ANC_IMC.ino 3.03 KB
Newer Older
1
2
3
4
5
#include "ANCcontroller.h"
//#include <STM32ADC.h>
//#include <libmaple/adc.h>
//#include <CMSIS_DSP.h>

杉下大河's avatar
杉下大河 committed
6
7
8
9
10
HardwareTimer Timer1(TIM1);
// the setup function runs once when you press reset or power the board
uint8_t sw = LOW;
int sensorPin = A6;    // select the input pin for the potentiometer
int biasPin = A12;
11
12
13
14
15
16
17
int audioOutPin = A13;

const int Q_BIT_NUM = 12;
const int AS_SYS_SAMPLERATE = 4000*2;
const int AUDIO_BIAS = 2482;//3.3V中の2V(12bit)

char anc_state;
杉下大河's avatar
杉下大河 committed
18
bool Sendflg = true;
19
bool calocReadyFlg = false;
杉下大河's avatar
杉下大河 committed
20
int sendTimingCnt=0;
21
22
23
24
25
26
27
int audioInValue = 0;  // variable to store the value coming from the sensor
int audioOutValue = 0;

uint32_t t1,t2;

WaveGenerator s_sound(AS_SYS_SAMPLERATE,Q_BIT_NUM);
ANC_Controller ANC;
杉下大河's avatar
杉下大河 committed
28
29
30
31

void sendDebugdat(){
  sw ^=1;
  digitalWrite(LED_GREEN, sw);
32
  printf("%d\n",audioInValue);
杉下大河's avatar
杉下大河 committed
33
34
}

35
//adcは最適値を設定すれば高速化できる余地あり現在30μs
杉下大河's avatar
杉下大河 committed
36
void audioreader() {
37
38
39
40
41
42
43
44
45
46
47
48
49

  audioInValue = analogRead(sensorPin);//多分12bitで読み取る

  analogWrite(audioOutPin,audioOutValue);
  sendTimingCnt++;
  calocReadyFlg = true;
}


void audioreader_debug() {
  t1 = micros();

  audioInValue = analogRead(sensorPin);//多分12bitで読み取る
杉下大河's avatar
杉下大河 committed
50
  sendTimingCnt++;
51
52
53

  t2 = micros();
  printf(" t=%d \n",t2-t1);
杉下大河's avatar
杉下大河 committed
54
55
56
57
58
}

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_GREEN, OUTPUT);
59
  pinMode(audioOutPin, OUTPUT);
杉下大河's avatar
杉下大河 committed
60
  pinMode(biasPin, OUTPUT);
61
  pinMode(sensorPin,INPUT_ANALOG);
杉下大河's avatar
杉下大河 committed
62

63
64
65
  analogWriteResolution(Q_BIT_NUM);//analogwriteを12bit(MAX4095)で利用できるように設定
  analogReadResolution(Q_BIT_NUM);
  analogWrite(biasPin,2482);//MAX3.3vの2.0V
杉下大河's avatar
杉下大河 committed
66
67
68


  Timer1.pause();                   // タイマー停止
69
70

  Timer1.setOverflow(AS_SYS_SAMPLERATE,HERTZ_FORMAT);//サンプルレートHzでよびだす
杉下大河's avatar
杉下大河 committed
71
72
73
74
75
76
77
78
  Timer1.attachInterrupt(           // 割り込みハンドラの登録
      audioreader                  // 呼び出す関数
    );

  Timer1.setCount(0);               // カウンタを0に設定
  Timer1.refresh();                 // タイマ更新
  Timer1.resume();                  // タイマースタート
  tone(PB4,200);
79
80
81
  analogWrite(biasPin,AUDIO_BIAS);

  anc_state = ANC.IDENTIFICAT_COEFC;
杉下大河's avatar
杉下大河 committed
82
83
}

84

杉下大河's avatar
杉下大河 committed
85
86
// the loop function runs over and over again forever
void loop() {
87
88
  //デバグ情報の送信
  if(sendTimingCnt >= AS_SYS_SAMPLERATE / 4){
杉下大河's avatar
杉下大河 committed
89
90
91
    sendDebugdat();
    sendTimingCnt=0;
  }
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116


  //ANC状態の管理
  if (anc_state == ANC.IDENTIFICAT_COEFC) {
    t1 = micros();
    //伝達関数の推定をしている。非同期処理なのでタイミングがずれるかも
    if(calocReadyFlg){
      ANC.calc2ndPassTF(audioInValue-AUDIO_BIAS,audioOutValue);
      audioOutValue = s_sound.playWaveCharp(s_sound.UNSINGED_INT_WAVE);

      calocReadyFlg=false;
    }
    t2 = micros();
    printf(" t=%d \n",t2-t1);

  //起動から15sでモード移行 正確に処理したい場合はタイマーを使おう!
    if (millis() > 15 * 1000) {
      ANC.printCoefC();
      anc_state = ANC.ACTIVATION_ANC;
    }
  }
  else if (anc_state == ANC.ACTIVATION_ANC) {
    audioOutValue = 0;
  }

杉下大河's avatar
杉下大河 committed
117
}