DIGILIGHT
gain_ctrl.c
См. документацию.
1 
14 #include <avr/io.h>
15 #include "avr_helper.h"
16 #include <stdlib.h>
17 #include "hardware.h"
18 #include "global.h"
19 #include "gain_ctrl.h"
20 #include "spectrum.h"
21 
25 INIT(7){
26  // TIMER2 используется для ШИМ-сигнала управления усилением
27  TCCR2 = TIMER_CLK_DIV_1 | _BV(WGM20) | _BV(WGM21) | _BV(COM21);
28  // выход ШИМ от 2-го таймера
29  DDR(OC2_PORT) |= OC2_PIN; // выход OC2
30 }
31 
36 static void set_gain(uint8_t v){
37  OCR2 = (MAX_LEVEL - v);
38 }
39 
46  static uint8_t div = GAIN_DIV;
47  static float integral = 0.0;
48 
49  if(cfg.agc_enabled && (s != NULL)){
50  if(s->average_vol < DEF_SILENCE_LVL) {
51  integral = cfg.sensitivity / 0.008;
52  return;
53  }
54  // automatic - PID
55  if(--div) return;
56  div = GAIN_DIV;
57 
58  float error = (AGC_NORMAL_LVL - s->peak_volume);
59  if(error < 0)
60  integral += error;
61  else
62  integral += 0.1*error;
63  if(integral < 0) integral = 0;
64  if(integral > 10000.0) integral = 10000.0;
65 
66  float v = error * 0.05 + integral * 0.008;
67  if(v > (MAX_LEVEL-1)) v = MAX_LEVEL - 1;
68  if(v < 0) v = 0;
69  cfg.sensitivity = v;
70  }
71 
72  set_gain(cfg.sensitivity);
73 }
74 
INIT(7)
Definition: gain_ctrl.c:25
#define OC2_PIN
Выход ОС2.
Definition: hardware.h:81
#define OC2_PORT
Символ порта, который используется для регулировки чувствительности - выход ШИМ OC2.
Definition: hardware.h:79
#define MAX_LEVEL
фиксированное количество уровней регулирования чувствительности
Definition: global.h:81
#define DEF_SILENCE_LVL
Предел уровня громкости, считающийся тишиной
Definition: global.h:23
volume_t average_vol
средняя громкость
Definition: global.h:74
Общие описания
uint8_t sensitivity
уровень регулировки чувствительности
Definition: global.h:89
#define GAIN_DIV
Задержка автоматического регулятора
Definition: gain_ctrl.h:18
структура параметров звукового сигнала
Definition: global.h:72
Описания для модуля реализации спектрального анализа
#define AGC_NORMAL_LVL
Нормальный средний уровень сигнала
Definition: gain_ctrl.h:14
Аппаратно-зависимые определения
uint8_t agc_enabled
АРУ включено
Definition: global.h:90
volume_t peak_volume
пиковая громкость
Definition: global.h:73
void sens_control(signal_t *s)
Регулировка чувствительности
Definition: gain_ctrl.c:45
Модуль управления усилением