//*********************************************************** // A/D convert -> LPF -> DAC out wave // 7.37MHz Internal RC oscillator, 16x PLL enabled // Fcy=7.37MHzx16/4=29.48MHz, Tcy=33.92ns // Toshio Iwata at DIGITALFILTER.COM all rights reserved // Last modified on 2007/06/06 //========================================================= // // オリジナル・プログラムは、上記コメントの岩田さん // // dsPIC30F4013による各種FIRフィルタの実験(DAC+LPF出力) // オリジナルと異なる点は、パワーオン時のSWの状態で、 // 各種フィルタ係数配列を選んで実行する点。 // // 2012+ブートローダー使用を、4013+PICkit2に変更して実験 // 「自作FRAもどき」にて周波数特性を確認してみる。 // // 2016/3/21 N.Ishii //*********************************************************** // パワーオン時のプッシュスイッチ SW1=1, SW2=1 : LPF // パワーオン時のプッシュスイッチ SW1=0, SW2=1 : HPF // パワーオン時のプッシュスイッチ SW1=1, SW2=0 : BPF // パワーオン時のプッシュスイッチ SW1=0, SW2=0 : BRF //#include #include #include #include #include // configuration _FWDT(WDT_OFF); _FGS(CODE_PROT_OFF); _FOSC(CSW_FSCM_OFF & FRC_PLL16); _FBORPOR(PBOR_OFF & PWRT_64 & MCLR_EN); // A/D control register unsigned int _ADCON1; unsigned int _ADCON2; unsigned int _ADCON3; unsigned int _ADCHS; unsigned int _ADPCFG; unsigned int _ADCSSL; // MCP4822 control bit #define selDAC_A 0x3000 #define selDAC_B 0xb000 #define GAIN_2x 0x9000 #define GAIN_1x 0xb000 #define DAC_DOWN 0xa000 #define DAC_OE 0xb000 // SPI control register; unsigned int _SPI1STAT; unsigned int _SPI1CON; // data unsigned int ResultData; unsigned int TmpData; int DelayLine[127]; int Coeff[127]; int outdata; int indata; void CoeffInitLpf() { // FIR型LPFの係数を代入(1kHz以下を通すフィルタ) //Generated by DSPLinks //U_4 //Remez Algorithm LPF //Sampling Frequency = 28800.0 //cutoff1 = 1100.0000000 //cutoff2 = 1900.0000000 //Tap Count = 127 //attenuate = -80.00 //ripple factor = 0.1000000 //Quantized by 16 [bits] Coeff[ 0 ] = -3 ; Coeff[ 1 ] = -4 ; Coeff[ 2 ] = -6 ; Coeff[ 3 ] = -8 ; Coeff[ 4 ] = -11 ; Coeff[ 5 ] = -14 ; Coeff[ 6 ] = -15 ; Coeff[ 7 ] = -16 ; Coeff[ 8 ] = -15 ; Coeff[ 9 ] = -12 ; Coeff[ 10 ] = -6 ; Coeff[ 11 ] = 1 ; Coeff[ 12 ] = 11 ; Coeff[ 13 ] = 22 ; Coeff[ 14 ] = 34 ; Coeff[ 15 ] = 46 ; Coeff[ 16 ] = 56 ; Coeff[ 17 ] = 62 ; Coeff[ 18 ] = 63 ; Coeff[ 19 ] = 58 ; Coeff[ 20 ] = 47 ; Coeff[ 21 ] = 29 ; Coeff[ 22 ] = 5 ; Coeff[ 23 ] = -22 ; Coeff[ 24 ] = -53 ; Coeff[ 25 ] = -83 ; Coeff[ 26 ] = -109 ; Coeff[ 27 ] = -127 ; Coeff[ 28 ] = -135 ; Coeff[ 29 ] = -129 ; Coeff[ 30 ] = -109 ; Coeff[ 31 ] = -73 ; Coeff[ 32 ] = -24 ; Coeff[ 33 ] = 34 ; Coeff[ 34 ] = 99 ; Coeff[ 35 ] = 164 ; Coeff[ 36 ] = 221 ; Coeff[ 37 ] = 264 ; Coeff[ 38 ] = 286 ; Coeff[ 39 ] = 281 ; Coeff[ 40 ] = 245 ; Coeff[ 41 ] = 178 ; Coeff[ 42 ] = 82 ; Coeff[ 43 ] = -37 ; Coeff[ 44 ] = -173 ; Coeff[ 45 ] = -311 ; Coeff[ 46 ] = -440 ; Coeff[ 47 ] = -544 ; Coeff[ 48 ] = -607 ; Coeff[ 49 ] = -617 ; Coeff[ 50 ] = -562 ; Coeff[ 51 ] = -435 ; Coeff[ 52 ] = -232 ; Coeff[ 53 ] = 42 ; Coeff[ 54 ] = 382 ; Coeff[ 55 ] = 772 ; Coeff[ 56 ] = 1196 ; Coeff[ 57 ] = 1632 ; Coeff[ 58 ] = 2056 ; Coeff[ 59 ] = 2443 ; Coeff[ 60 ] = 2773 ; Coeff[ 61 ] = 3023 ; Coeff[ 62 ] = 3180 ; Coeff[ 63 ] = 3234 ; Coeff[ 64 ] = 3180 ; Coeff[ 65 ] = 3023 ; Coeff[ 66 ] = 2773 ; Coeff[ 67 ] = 2443 ; Coeff[ 68 ] = 2056 ; Coeff[ 69 ] = 1632 ; Coeff[ 70 ] = 1196 ; Coeff[ 71 ] = 772 ; Coeff[ 72 ] = 382 ; Coeff[ 73 ] = 42 ; Coeff[ 74 ] = -232 ; Coeff[ 75 ] = -435 ; Coeff[ 76 ] = -562 ; Coeff[ 77 ] = -617 ; Coeff[ 78 ] = -607 ; Coeff[ 79 ] = -544 ; Coeff[ 80 ] = -440 ; Coeff[ 81 ] = -311 ; Coeff[ 82 ] = -173 ; Coeff[ 83 ] = -37 ; Coeff[ 84 ] = 82 ; Coeff[ 85 ] = 178 ; Coeff[ 86 ] = 245 ; Coeff[ 87 ] = 281 ; Coeff[ 88 ] = 286 ; Coeff[ 89 ] = 264 ; Coeff[ 90 ] = 221 ; Coeff[ 91 ] = 164 ; Coeff[ 92 ] = 99 ; Coeff[ 93 ] = 34 ; Coeff[ 94 ] = -24 ; Coeff[ 95 ] = -73 ; Coeff[ 96 ] = -109 ; Coeff[ 97 ] = -129 ; Coeff[ 98 ] = -135 ; Coeff[ 99 ] = -127 ; Coeff[ 100 ] = -109 ; Coeff[ 101 ] = -83 ; Coeff[ 102 ] = -53 ; Coeff[ 103 ] = -22 ; Coeff[ 104 ] = 5 ; Coeff[ 105 ] = 29 ; Coeff[ 106 ] = 47 ; Coeff[ 107 ] = 58 ; Coeff[ 108 ] = 63 ; Coeff[ 109 ] = 62 ; Coeff[ 110 ] = 56 ; Coeff[ 111 ] = 46 ; Coeff[ 112 ] = 34 ; Coeff[ 113 ] = 22 ; Coeff[ 114 ] = 11 ; Coeff[ 115 ] = 1 ; Coeff[ 116 ] = -6 ; Coeff[ 117 ] = -12 ; Coeff[ 118 ] = -15 ; Coeff[ 119 ] = -16 ; Coeff[ 120 ] = -15 ; Coeff[ 121 ] = -14 ; Coeff[ 122 ] = -11 ; Coeff[ 123 ] = -8 ; Coeff[ 124 ] = -6 ; Coeff[ 125 ] = -4 ; Coeff[ 126 ] = -3 ; } /* void CoeffInitHpf() { // FIR型HPFの係数を代入(2kHz以上を通すフィルタ) //Generated by DSPLinks //U_11 //Remez Algorithm HPF //Sampling Frequency = 28800.0 //cutoff1 = 1100.0000000 //cutoff2 = 1900.0000000 //Tap Count = 127 //attenuate = -80.00 //ripple factor = 0.1000000 //Quantized by 16 [bits] Coeff[ 0 ] = 52 ; Coeff[ 1 ] = -12 ; Coeff[ 2 ] = -14 ; Coeff[ 3 ] = -17 ; Coeff[ 4 ] = -19 ; Coeff[ 5 ] = -21 ; Coeff[ 6 ] = -20 ; Coeff[ 7 ] = -16 ; Coeff[ 8 ] = -9 ; Coeff[ 9 ] = 0 ; Coeff[ 10 ] = 12 ; Coeff[ 11 ] = 24 ; Coeff[ 12 ] = 36 ; Coeff[ 13 ] = 44 ; Coeff[ 14 ] = 47 ; Coeff[ 15 ] = 44 ; Coeff[ 16 ] = 33 ; Coeff[ 17 ] = 16 ; Coeff[ 18 ] = -6 ; Coeff[ 19 ] = -32 ; Coeff[ 20 ] = -58 ; Coeff[ 21 ] = -80 ; Coeff[ 22 ] = -94 ; Coeff[ 23 ] = -97 ; Coeff[ 24 ] = -87 ; Coeff[ 25 ] = -64 ; Coeff[ 26 ] = -28 ; Coeff[ 27 ] = 17 ; Coeff[ 28 ] = 67 ; Coeff[ 29 ] = 115 ; Coeff[ 30 ] = 156 ; Coeff[ 31 ] = 181 ; Coeff[ 32 ] = 186 ; Coeff[ 33 ] = 166 ; Coeff[ 34 ] = 122 ; Coeff[ 35 ] = 54 ; Coeff[ 36 ] = -29 ; Coeff[ 37 ] = -122 ; Coeff[ 38 ] = -212 ; Coeff[ 39 ] = -288 ; Coeff[ 40 ] = -336 ; Coeff[ 41 ] = -348 ; Coeff[ 42 ] = -315 ; Coeff[ 43 ] = -237 ; Coeff[ 44 ] = -114 ; Coeff[ 45 ] = 42 ; Coeff[ 46 ] = 218 ; Coeff[ 47 ] = 396 ; Coeff[ 48 ] = 553 ; Coeff[ 49 ] = 665 ; Coeff[ 50 ] = 710 ; Coeff[ 51 ] = 670 ; Coeff[ 52 ] = 531 ; Coeff[ 53 ] = 290 ; Coeff[ 54 ] = -51 ; Coeff[ 55 ] = -478 ; Coeff[ 56 ] = -971 ; Coeff[ 57 ] = -1501 ; Coeff[ 58 ] = -2035 ; Coeff[ 59 ] = -2535 ; Coeff[ 60 ] = -2968 ; Coeff[ 61 ] = -3303 ; Coeff[ 62 ] = -3514 ; Coeff[ 63 ] = 29181 ; Coeff[ 64 ] = -3514 ; Coeff[ 65 ] = -3303 ; Coeff[ 66 ] = -2968 ; Coeff[ 67 ] = -2535 ; Coeff[ 68 ] = -2035 ; Coeff[ 69 ] = -1501 ; Coeff[ 70 ] = -971 ; Coeff[ 71 ] = -478 ; Coeff[ 72 ] = -51 ; Coeff[ 73 ] = 290 ; Coeff[ 74 ] = 531 ; Coeff[ 75 ] = 670 ; Coeff[ 76 ] = 710 ; Coeff[ 77 ] = 665 ; Coeff[ 78 ] = 553 ; Coeff[ 79 ] = 396 ; Coeff[ 80 ] = 218 ; Coeff[ 81 ] = 42 ; Coeff[ 82 ] = -114 ; Coeff[ 83 ] = -237 ; Coeff[ 84 ] = -315 ; Coeff[ 85 ] = -348 ; Coeff[ 86 ] = -336 ; Coeff[ 87 ] = -288 ; Coeff[ 88 ] = -212 ; Coeff[ 89 ] = -122 ; Coeff[ 90 ] = -29 ; Coeff[ 91 ] = 54 ; Coeff[ 92 ] = 122 ; Coeff[ 93 ] = 166 ; Coeff[ 94 ] = 186 ; Coeff[ 95 ] = 181 ; Coeff[ 96 ] = 156 ; Coeff[ 97 ] = 115 ; Coeff[ 98 ] = 67 ; Coeff[ 99 ] = 17 ; Coeff[ 100 ] = -28 ; Coeff[ 101 ] = -64 ; Coeff[ 102 ] = -87 ; Coeff[ 103 ] = -97 ; Coeff[ 104 ] = -94 ; Coeff[ 105 ] = -80 ; Coeff[ 106 ] = -58 ; Coeff[ 107 ] = -32 ; Coeff[ 108 ] = -6 ; Coeff[ 109 ] = 16 ; Coeff[ 110 ] = 33 ; Coeff[ 111 ] = 44 ; Coeff[ 112 ] = 47 ; Coeff[ 113 ] = 44 ; Coeff[ 114 ] = 36 ; Coeff[ 115 ] = 24 ; Coeff[ 116 ] = 12 ; Coeff[ 117 ] = 0 ; Coeff[ 118 ] = -9 ; Coeff[ 119 ] = -16 ; Coeff[ 120 ] = -20 ; Coeff[ 121 ] = -21 ; Coeff[ 122 ] = -19 ; Coeff[ 123 ] = -17 ; Coeff[ 124 ] = -14 ; Coeff[ 125 ] = -12 ; Coeff[ 126 ] = 52 ; } */ void CoeffInitHpf() { // FIR型HPFの係数を代入(2kHz以上を通すフィルタ) //U_11 //Remez Algorithm HPF //Sampling Frequency = 28800.0 //cutoff1 = 1100.0000000 //cutoff2 = 1900.0000000 //Tap Count = 127 //attenuate = -80.00 //ripple factor = 10.0000000 (試に、-0.1から、10に変更してみた。) //Quantized by 16 [bits] Coeff[ 0 ]= -156 ; Coeff[ 1 ]= 158 ; Coeff[ 2 ]= 80 ; Coeff[ 3 ]= 28 ; Coeff[ 4 ]= -6 ; Coeff[ 5 ]= -29 ; Coeff[ 6 ]= -42 ; Coeff[ 7 ]= -48 ; Coeff[ 8 ]= -47 ; Coeff[ 9 ]= -40 ; Coeff[ 10 ]= -26 ; Coeff[ 11 ]= -8 ; Coeff[ 12 ]= 12 ; Coeff[ 13 ]= 33 ; Coeff[ 14 ]= 52 ; Coeff[ 15 ]= 66 ; Coeff[ 16 ]= 72 ; Coeff[ 17 ]= 67 ; Coeff[ 18 ]= 51 ; Coeff[ 19 ]= 25 ; Coeff[ 20 ]= -7 ; Coeff[ 21 ]= -44 ; Coeff[ 22 ]= -79 ; Coeff[ 23 ]= -108 ; Coeff[ 24 ]= -124 ; Coeff[ 25 ]= -123 ; Coeff[ 26 ]= -104 ; Coeff[ 27 ]= -67 ; Coeff[ 28 ]= -15 ; Coeff[ 29 ]= 45 ; Coeff[ 30 ]= 109 ; Coeff[ 31 ]= 164 ; Coeff[ 32 ]= 204 ; Coeff[ 33 ]= 218 ; Coeff[ 34 ]= 204 ; Coeff[ 35 ]= 157 ; Coeff[ 36 ]= 82 ; Coeff[ 37 ]= -14 ; Coeff[ 38 ]= -123 ; Coeff[ 39 ]= -229 ; Coeff[ 40 ]= -317 ; Coeff[ 41 ]= -372 ; Coeff[ 42 ]= -382 ; Coeff[ 43 ]= -339 ; Coeff[ 44 ]= -241 ; Coeff[ 45 ]= -94 ; Coeff[ 46 ]= 89 ; Coeff[ 47 ]= 290 ; Coeff[ 48 ]= 483 ; Coeff[ 49 ]= 642 ; Coeff[ 50 ]= 738 ; Coeff[ 51 ]= 746 ; Coeff[ 52 ]= 648 ; Coeff[ 53 ]= 433 ; Coeff[ 54 ]= 102 ; Coeff[ 55 ]= -334 ; Coeff[ 56 ]= -853 ; Coeff[ 57 ]= -1424 ; Coeff[ 58 ]= -2008 ; Coeff[ 59 ]= -2564 ; Coeff[ 60 ]= -3048 ; Coeff[ 61 ]= -3425 ; Coeff[ 62 ]= -3663 ; Coeff[ 63 ]= 29022 ; Coeff[ 64 ]= -3663 ; Coeff[ 65 ]= -3425 ; Coeff[ 66 ]= -3048 ; Coeff[ 67 ]= -2564 ; Coeff[ 68 ]= -2008 ; Coeff[ 69 ]= -1424 ; Coeff[ 70 ]= -853 ; Coeff[ 71 ]= -334 ; Coeff[ 72 ]= 102 ; Coeff[ 73 ]= 433 ; Coeff[ 74 ]= 648 ; Coeff[ 75 ]= 746 ; Coeff[ 76 ]= 738 ; Coeff[ 77 ]= 642 ; Coeff[ 78 ]= 483 ; Coeff[ 79 ]= 290 ; Coeff[ 80 ]= 89 ; Coeff[ 81 ]= -94 ; Coeff[ 82 ]= -241 ; Coeff[ 83 ]= -339 ; Coeff[ 84 ]= -382 ; Coeff[ 85 ]= -372 ; Coeff[ 86 ]= -317 ; Coeff[ 87 ]= -229 ; Coeff[ 88 ]= -123 ; Coeff[ 89 ]= -14 ; Coeff[ 90 ]= 82 ; Coeff[ 91 ]= 157 ; Coeff[ 92 ]= 204 ; Coeff[ 93 ]= 218 ; Coeff[ 94 ]= 204 ; Coeff[ 95 ]= 164 ; Coeff[ 96 ]= 109 ; Coeff[ 97 ]= 45 ; Coeff[ 98 ]= -15 ; Coeff[ 99 ]= -67 ; Coeff[ 100 ]= -104 ; Coeff[ 101 ]= -123 ; Coeff[ 102 ]= -124 ; Coeff[ 103 ]= -108 ; Coeff[ 104 ]= -79 ; Coeff[ 105 ]= -44 ; Coeff[ 106 ]= -7 ; Coeff[ 107 ]= 25 ; Coeff[ 108 ]= 51 ; Coeff[ 109 ]= 67 ; Coeff[ 110 ]= 72 ; Coeff[ 111 ]= 66 ; Coeff[ 112 ]= 52 ; Coeff[ 113 ]= 33 ; Coeff[ 114 ]= 12 ; Coeff[ 115 ]= -8 ; Coeff[ 116 ]= -26 ; Coeff[ 117 ]= -40 ; Coeff[ 118 ]= -47 ; Coeff[ 119 ]= -48 ; Coeff[ 120 ]= -42 ; Coeff[ 121 ]= -29 ; Coeff[ 122 ]= -6 ; Coeff[ 123 ]= 28 ; Coeff[ 124 ]= 80 ; Coeff[ 125 ]= 158 ; Coeff[ 126 ]= -156 ; } void CoeffInitBpf() { // FIR型BPFの係数を代入(1kHz〜2kHzを通すフィルタ) //Generated by DSPLinks //U_12 //Remez Algorithm BPF //Sampling Frequency = 28800.0 //cutoff1 = 550.0000000 //cutoff2 = 950.0000000 //cutoff3 = 2100.0000000 //cutoff4 = 2500.0000000 //Tap Count = 127 //attenuate = -55.00 //ripple factor = 0.3000000 //Quantized by 16 [bits] Coeff[ 0 ] = 48 ; Coeff[ 1 ] = -56 ; Coeff[ 2 ] = -10 ; Coeff[ 3 ] = 26 ; Coeff[ 4 ] = 61 ; Coeff[ 5 ] = 95 ; Coeff[ 6 ] = 123 ; Coeff[ 7 ] = 140 ; Coeff[ 8 ] = 140 ; Coeff[ 9 ] = 117 ; Coeff[ 10 ] = 69 ; Coeff[ 11 ] = 1 ; Coeff[ 12 ] = -77 ; Coeff[ 13 ] = -156 ; Coeff[ 14 ] = -221 ; Coeff[ 15 ] = -259 ; Coeff[ 16 ] = -265 ; Coeff[ 17 ] = -235 ; Coeff[ 18 ] = -178 ; Coeff[ 19 ] = -105 ; Coeff[ 20 ] = -33 ; Coeff[ 21 ] = 20 ; Coeff[ 22 ] = 43 ; Coeff[ 23 ] = 30 ; Coeff[ 24 ] = -13 ; Coeff[ 25 ] = -77 ; Coeff[ 26 ] = -138 ; Coeff[ 27 ] = -175 ; Coeff[ 28 ] = -169 ; Coeff[ 29 ] = -109 ; Coeff[ 30 ] = 3 ; Coeff[ 31 ] = 156 ; Coeff[ 32 ] = 322 ; Coeff[ 33 ] = 469 ; Coeff[ 34 ] = 568 ; Coeff[ 35 ] = 595 ; Coeff[ 36 ] = 541 ; Coeff[ 37 ] = 415 ; Coeff[ 38 ] = 243 ; Coeff[ 39 ] = 63 ; Coeff[ 40 ] = -83 ; Coeff[ 41 ] = -162 ; Coeff[ 42 ] = -154 ; Coeff[ 43 ] = -59 ; Coeff[ 44 ] = 92 ; Coeff[ 45 ] = 256 ; Coeff[ 46 ] = 371 ; Coeff[ 47 ] = 381 ; Coeff[ 48 ] = 241 ; Coeff[ 49 ] = -60 ; Coeff[ 50 ] = -506 ; Coeff[ 51 ] = -1038 ; Coeff[ 52 ] = -1570 ; Coeff[ 53 ] = -2001 ; Coeff[ 54 ] = -2232 ; Coeff[ 55 ] = -2186 ; Coeff[ 56 ] = -1828 ; Coeff[ 57 ] = -1170 ; Coeff[ 58 ] = -278 ; Coeff[ 59 ] = 737 ; Coeff[ 60 ] = 1739 ; Coeff[ 61 ] = 2585 ; Coeff[ 62 ] = 3149 ; Coeff[ 63 ] = 3348 ; Coeff[ 64 ] = 3149 ; Coeff[ 65 ] = 2585 ; Coeff[ 66 ] = 1739 ; Coeff[ 67 ] = 737 ; Coeff[ 68 ] = -278 ; Coeff[ 69 ] = -1170 ; Coeff[ 70 ] = -1828 ; Coeff[ 71 ] = -2186 ; Coeff[ 72 ] = -2232 ; Coeff[ 73 ] = -2001 ; Coeff[ 74 ] = -1570 ; Coeff[ 75 ] = -1038 ; Coeff[ 76 ] = -506 ; Coeff[ 77 ] = -60 ; Coeff[ 78 ] = 241 ; Coeff[ 79 ] = 381 ; Coeff[ 80 ] = 371 ; Coeff[ 81 ] = 256 ; Coeff[ 82 ] = 92 ; Coeff[ 83 ] = -59 ; Coeff[ 84 ] = -154 ; Coeff[ 85 ] = -162 ; Coeff[ 86 ] = -83 ; Coeff[ 87 ] = 63 ; Coeff[ 88 ] = 243 ; Coeff[ 89 ] = 415 ; Coeff[ 90 ] = 541 ; Coeff[ 91 ] = 595 ; Coeff[ 92 ] = 568 ; Coeff[ 93 ] = 469 ; Coeff[ 94 ] = 322 ; Coeff[ 95 ] = 156 ; Coeff[ 96 ] = 3 ; Coeff[ 97 ] = -109 ; Coeff[ 98 ] = -169 ; Coeff[ 99 ] = -175 ; Coeff[ 100 ] = -138 ; Coeff[ 101 ] = -77 ; Coeff[ 102 ] = -13 ; Coeff[ 103 ] = 30 ; Coeff[ 104 ] = 43 ; Coeff[ 105 ] = 20 ; Coeff[ 106 ] = -33 ; Coeff[ 107 ] = -105 ; Coeff[ 108 ] = -178 ; Coeff[ 109 ] = -235 ; Coeff[ 110 ] = -265 ; Coeff[ 111 ] = -259 ; Coeff[ 112 ] = -221 ; Coeff[ 113 ] = -156 ; Coeff[ 114 ] = -77 ; Coeff[ 115 ] = 1 ; Coeff[ 116 ] = 69 ; Coeff[ 117 ] = 117 ; Coeff[ 118 ] = 140 ; Coeff[ 119 ] = 140 ; Coeff[ 120 ] = 123 ; Coeff[ 121 ] = 95 ; Coeff[ 122 ] = 61 ; Coeff[ 123 ] = 26 ; Coeff[ 124 ] = -10 ; Coeff[ 125 ] = -56 ; Coeff[ 126 ] = 48 ; } void CoeffInitBrf() { // FIR型BRFの係数を代入(1kHz〜2kHzをカットするフィルタ) //Generated by DSPLinks //U_13 //Remez Algorithm BRF //Sampling Frequency = 28800.0 //cutoff1 = 550.0000000 //cutoff2 = 950.0000000 //cutoff3 = 2100.0000000 //cutoff4 = 2500.0000000 //Tap Count = 127 //attenuate = -55.00 //ripple factor = 0.3000000 //Quantized by 16 [bits] Coeff[ 0 ] = -25 ; Coeff[ 1 ] = 326 ; Coeff[ 2 ] = -512 ; Coeff[ 3 ] = -7 ; Coeff[ 4 ] = 242 ; Coeff[ 5 ] = 277 ; Coeff[ 6 ] = 216 ; Coeff[ 7 ] = 132 ; Coeff[ 8 ] = 59 ; Coeff[ 9 ] = 9 ; Coeff[ 10 ] = -11 ; Coeff[ 11 ] = -4 ; Coeff[ 12 ] = 28 ; Coeff[ 13 ] = 80 ; Coeff[ 14 ] = 142 ; Coeff[ 15 ] = 199 ; Coeff[ 16 ] = 237 ; Coeff[ 17 ] = 243 ; Coeff[ 18 ] = 211 ; Coeff[ 19 ] = 143 ; Coeff[ 20 ] = 51 ; Coeff[ 21 ] = -48 ; Coeff[ 22 ] = -136 ; Coeff[ 23 ] = -192 ; Coeff[ 24 ] = -205 ; Coeff[ 25 ] = -174 ; Coeff[ 26 ] = -113 ; Coeff[ 27 ] = -40 ; Coeff[ 28 ] = 17 ; Coeff[ 29 ] = 34 ; Coeff[ 30 ] = -3 ; Coeff[ 31 ] = -98 ; Coeff[ 32 ] = -235 ; Coeff[ 33 ] = -388 ; Coeff[ 34 ] = -519 ; Coeff[ 35 ] = -592 ; Coeff[ 36 ] = -584 ; Coeff[ 37 ] = -485 ; Coeff[ 38 ] = -309 ; Coeff[ 39 ] = -88 ; Coeff[ 40 ] = 129 ; Coeff[ 41 ] = 297 ; Coeff[ 42 ] = 376 ; Coeff[ 43 ] = 350 ; Coeff[ 44 ] = 228 ; Coeff[ 45 ] = 53 ; Coeff[ 46 ] = -116 ; Coeff[ 47 ] = -210 ; Coeff[ 48 ] = -167 ; Coeff[ 49 ] = 47 ; Coeff[ 50 ] = 432 ; Coeff[ 51 ] = 940 ; Coeff[ 52 ] = 1487 ; Coeff[ 53 ] = 1961 ; Coeff[ 54 ] = 2248 ; Coeff[ 55 ] = 2251 ; Coeff[ 56 ] = 1916 ; Coeff[ 57 ] = 1243 ; Coeff[ 58 ] = 297 ; Coeff[ 59 ] = -804 ; Coeff[ 60 ] = -1906 ; Coeff[ 61 ] = -2846 ; Coeff[ 62 ] = -3476 ; Coeff[ 63 ] = 29069 ; Coeff[ 64 ] = -3476 ; Coeff[ 65 ] = -2846 ; Coeff[ 66 ] = -1906 ; Coeff[ 67 ] = -804 ; Coeff[ 68 ] = 297 ; Coeff[ 69 ] = 1243 ; Coeff[ 70 ] = 1916 ; Coeff[ 71 ] = 2251 ; Coeff[ 72 ] = 2248 ; Coeff[ 73 ] = 1961 ; Coeff[ 74 ] = 1487 ; Coeff[ 75 ] = 940 ; Coeff[ 76 ] = 432 ; Coeff[ 77 ] = 47 ; Coeff[ 78 ] = -167 ; Coeff[ 79 ] = -210 ; Coeff[ 80 ] = -116 ; Coeff[ 81 ] = 53 ; Coeff[ 82 ] = 228 ; Coeff[ 83 ] = 350 ; Coeff[ 84 ] = 376 ; Coeff[ 85 ] = 297 ; Coeff[ 86 ] = 129 ; Coeff[ 87 ] = -88 ; Coeff[ 88 ] = -309 ; Coeff[ 89 ] = -485 ; Coeff[ 90 ] = -584 ; Coeff[ 91 ] = -592 ; Coeff[ 92 ] = -519 ; Coeff[ 93 ] = -388 ; Coeff[ 94 ] = -235 ; Coeff[ 95 ] = -98 ; Coeff[ 96 ] = -3 ; Coeff[ 97 ] = 34 ; Coeff[ 98 ] = 17 ; Coeff[ 99 ] = -40 ; Coeff[ 100 ] = -113 ; Coeff[ 101 ] = -174 ; Coeff[ 102 ] = -205 ; Coeff[ 103 ] = -192 ; Coeff[ 104 ] = -136 ; Coeff[ 105 ] = -48 ; Coeff[ 106 ] = 51 ; Coeff[ 107 ] = 143 ; Coeff[ 108 ] = 211 ; Coeff[ 109 ] = 243 ; Coeff[ 110 ] = 237 ; Coeff[ 111 ] = 199 ; Coeff[ 112 ] = 142 ; Coeff[ 113 ] = 80 ; Coeff[ 114 ] = 28 ; Coeff[ 115 ] = -4 ; Coeff[ 116 ] = -11 ; Coeff[ 117 ] = 9 ; Coeff[ 118 ] = 59 ; Coeff[ 119 ] = 132 ; Coeff[ 120 ] = 216 ; Coeff[ 121 ] = 277 ; Coeff[ 122 ] = 242 ; Coeff[ 123 ] = -7 ; Coeff[ 124 ] = -512 ; Coeff[ 125 ] = 326 ; Coeff[ 126 ] = -25 ; } void PushDelay(int din) { // 遅延器のプッシュ int tmpDelayLine[127]; VectorCopy(127-1, tmpDelayLine+1, DelayLine); // 配列を一個ずらしてコピー(DSPライブラリ使用) tmpDelayLine[0] = din; // 新しいデータを入れる VectorCopy(127, DelayLine, tmpDelayLine); // グローバル配列にコピー(DSPライブラリ使用) } int CalOutWave() { // デジタルフィルタの出力を計算 int tmp; tmp = VectorDotProduct(127, DelayLine, Coeff); // データと係数積和演算(DSPライブラリ使用) return tmp; } // Timer subroutine //void __attribute__((__interrupt__, __shadow__, no_auto_psv)) _AltT3Interrupt(void) void __attribute__((__interrupt__, __shadow__, no_auto_psv)) _T3Interrupt(void) { // --- A/D is 12bits, filtering is 12bits, DAC is 12bits while(!IFS0bits.ADIF); // wait A/D ResultData = ReadADC12(0); // 12bit resolution indata = ResultData - 2048; // 符号付きにする PushDelay(indata); // 遅延器のプッシュ outdata = CalOutWave(); // デジタルフィルタの出力を計算 outdata += 2048; // 符号なしにする if(outdata > 4095) outdata = 4095; // オーバフローリミッタ if(outdata < 0) outdata = 0; // アンダーフローリミッタ ResultData = outdata; TmpData = SPI1BUF; // clear SPI receive flag TmpData = selDAC_A & GAIN_2x & DAC_OE; // set DAC control bit TmpData |= ResultData; // set value PORTBbits.RB2 = 0; // MCP4822 #CS assert WriteSPI1(TmpData); // send data while(SPI1STATbits.SPIRBF == 0); // waiting transmittion complete PORTBbits.RB2 = 1; // MCP4822 #CS negate IFS0bits.ADIF = 0; // clear A/D interuppt flag IFS0bits.T3IF = 0; // clear T3 interuppt flag } // Main routine int main(void) { // port init TRISB=0x01FF; TRISBbits.TRISB2 = 0; PORTBbits.RB2 = 1; // MCP4822 #CS negate // Use Alternate Interrupt Vector Table INTCON2bits.ALTIVT=1; // Confirm to turn off ADC ADCON1bits.ADON=0; // ADC init _ADCHS= ADC_CH0_POS_SAMPLEA_AN3 & ADC_CH0_NEG_SAMPLEA_NVREF; // A-D channel-3 select SetChanADC12(_ADCHS); _ADCON1=ADC_MODULE_ON & ADC_IDLE_CONTINUE & ADC_FORMAT_INTG & ADC_CLK_TMR & ADC_AUTO_SAMPLING_ON & ADC_SAMP_OFF; _ADCON2=ADC_VREF_AVDD_AVSS & ADC_SCAN_OFF & ADC_SAMPLES_PER_INT_1 & ADC_ALT_BUF_OFF & ADC_ALT_INPUT_OFF; // Tad={Tcy(ADCS+1)}/2>334ns, Then ADCS>18.7, Tad=10*Tcy _ADCON3=ADC_SAMPLE_TIME_1 & ADC_CONV_CLK_SYSTEM & ADC_CONV_CLK_10Tcy; _ADPCFG=ENABLE_AN3_ANA; // A-D channel-3 analog input _ADCSSL=SCAN_NONE; OpenADC12(_ADCON1, _ADCON2, _ADCON3, _ADPCFG, _ADCSSL); // SPI init _SPI1CON = FRAME_ENABLE_OFF & FRAME_SYNC_INPUT & ENABLE_SDO_PIN & SPI_MODE16_ON & SPI_SMP_ON & SPI_CKE_OFF & CLK_POL_ACTIVE_LOW & SLAVE_ENABLE_OFF & MASTER_ENABLE_ON & SEC_PRESCAL_2_1 & PRI_PRESCAL_1_1; _SPI1STAT = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR; OpenSPI1(_SPI1CON, _SPI1STAT); // DAC initialize TmpData = SPI1BUF; // clear SPI receive flag TmpData = selDAC_A & GAIN_2x & DAC_OE; // set DAC control bit TmpData |= 2048; // center position PORTBbits.RB2 = 0; // MCP4822 #CS assert WriteSPI1(TmpData); // send data while(SPI1STATbits.SPIRBF == 0); // waiting transmittion complete PORTBbits.RB2 = 1; // MCP4822 #CS negate // Timer3 setting OpenTimer3(T3_ON & T3_GATE_OFF & T3_PS_1_1 & T3_SOURCE_INT, 1024-1); // 28.8kHz sampling ADC ConfigIntTimer3(T3_INT_PRIOR_5 & T3_INT_ON); // enable interrupt DISICNT = 0x0000; // CoeffInitLpf(); // FIR型LPFの係数を代入 if(PORTBbits.RB0 == 1 && PORTBbits.RB8 == 1) { // パワーオン時のプッシュスイッチの値で係数選択 CoeffInitLpf(); // FIR型LPFの係数を代入 } else if (PORTBbits.RB0 == 0 && PORTBbits.RB8 == 1) { CoeffInitHpf(); // FIR型HPFの係数を代入 } else if (PORTBbits.RB0 == 1 && PORTBbits.RB8 == 0) { CoeffInitBpf(); // FIR型BPFの係数を代入 } else { CoeffInitBrf(); // FIR型BRFの係数を代入 } // main loop while(1) { // A/D result store in ResultData } // CloseTimer3(); // never excute // CloseADC12(); // never excute // CloseSPI1(); // never excute }