Главная » Бытовая электроника » Делаем простой переключатель хлопка на PIC12F683. Схема и описание

Делаем простой переключатель хлопка на PIC12F683. Схема и описание

Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров...
Подробнее

Переключатель хлопков — забавный электронный проект для начинающих радиолюбителей. Это устройство включает и выключает электроприборы от звука хлопка в ладоши.

Сегодня мы обсудим создание простого переключателя хлопка, который срабатывает при обнаружении двух хлопков подряд. Здесь в качестве звукового датчика выступает электретный микрофон, преобразующий звук в электрический сигнал.

Поскольку сигнал с микрофона очень слабый, мы его усиливаем транзистором, а уже затем отправляем на вход микроконтроллера PIC12F683, который выполняет обработку данного сигнала.

простой переключатель хлопка на PIC12F683

Немного теории

Переключатель хлопков требует наличия на входе какого-либо преобразователя, который бы вырабатывал электрический сигнал под действием звука. Как правило, для этого используют электретный микрофон или просто микрофон (OBO-04FN-0B).

Выходной сигнал микрофона очень слабый, поэтому нам нужна схема для усиления детектируемого звукового сигнала. На следующей принципиальной схеме показан микрофонный усилитель на одном транзисторе:

Когда нет звука, напряжение на коллекторе (Vout) транзистора (2N3904), который находится в состоянии насыщения, составляет примерно 0,2 В. Когда микрофон улавливает звук хлопка, напряжение на нем резко падает.

Поскольку выход микрофона связан с базой транзистора через конденсатор C1, то напряжение база-эмиттер также снижается, и поэтому переход база-эмиттер менее смещен в прямом направлении или отсечен (в случае сильного хлопка). Следовательно, каждый раз, когда обнаруживается хлопок, возникает резкий пик напряжения на коллекторе.

Блок питания 0...30 В / 3A
Набор для сборки регулируемого блока питания...
Подробнее

На следующем рисунке показаны пики напряжения коллектора после нескольких хлопков. Вы можете видеть, что пиковое напряжение может доходить до 4,0 В в зависимости от громкости хлопка.

Теперь мы знаем, как преобразовать звук хлопка в электрический сигнал. Следующим этапом является подача этого сигнала на микроконтроллер PIC12F683 для каких-либо действий.

Микроконтроллер PIC12F683 имеет встроенный модуль компаратора, который можно использовать для сравнения двух аналоговых напряжений и получения цифровой индикации их относительных величин.

Модуль компаратора может работать в восьми различных режимах в зависимости от настроек битов CM2…CM 0 в регистре CMCON0. Для наших целей мы настроим его так:

CM<2:0> = 100

Контакт CIN- настроен как аналоговый вывод, контакты CIN+ и COUT настроены как I/O, выход компаратора доступен внутри, CVREF — неинвертирующий вход (см. рисунок ниже).

 

Мы сравниваем выходное напряжение коллектора (Vout) с внутренним опорным напряжением. Опорное напряжение внутренне соединено с положительным входом CIN+ модуля компаратора, в то время как выходное напряжение от усилителя поступает на отрицательный вход (CIN-) компаратора.

Вывод CIN мультиплексирован с I/O выводом GP1 микроконтроллера PIC12F683. Величина опорного напряжения программируется и управляется с помощью VRCON регистра. Мы установим опорное напряжение на уровне 0,625 В (предполагается, что напряжение питания 5,0 В).

Таким образом, в нормальных условиях опорное напряжение (0,625 В) больше, чем Vout (0,2 В), а выход компаратора (COUT) находиться в высоком состоянии. COUT доступен как изнутри, так и снаружи на I/O выводе GP2.

Когда раздается хлопок, COUT переходит в низкое состояние. Логику выхода компаратора можно инвертировать, установив бит инверсии выхода компаратора (CIN) в регистре CMCON0.

Микроконтроллер PIC12F683 может быть запрограммирован на выполнение коммутационных действий в зависимости от выхода компаратора.

Принципиальная электрическая схема

Полная принципиальная схема этого простого проекта переключение по хлопку показана ниже. Положительный и отрицательный входы внутреннего модуля компаратора доступны извне через выводы GP0 (CIN+) и GP1 (CIN-) соответственно.

Поскольку положительный вход подключен к внутреннему источнику опорного напряжения, вывод GP1 можно использовать в качестве I/O вывода. Выход от усилителя микрофона поступает на GP0.

Если микроконтроллер обнаруживает два подряд хлопка, то он переключает логический выход на вывод GP5. Светодиод соединен с выводом GP5 для индикации коммутационного действия микроконтроллера. Здесь он используется для демонстрации, и его можно заменить электромеханическим реле, если вы хотите управлять с его помощью электроприбором.

Программное обеспечение

Программа написана на языке Си и скомпилирована с помощью MikroC Pro for PIC compiler. Программа непрерывно ищет два подряд хлопка с интервалом в 1,5 секунды.

Если это произойдет, то вывод GP5 переключается. При обнаружении первого хлопка включается Timer1 для отсчета времени. Он генерирует сигнал тайм-аута через 1,5 секунды. Если в течении этого времени нет второго хлопка, то микроконтроллер игнорирует первый хлопок и возвращается к основной программе.

/*
 MCU: PIC12F683
 Oscillator: Internal 4.0000 MHz, MCLR Disabled, PWRT ON enabled
*/
 
sbit Output_LED at GP5_bit;
unsigned short i, TIME_UP;
 
void interrupt(void){
  if(PIR1.TMR1IF) {
    i ++;
    if(i == 3) TIME_UP = 1;  // Время до 1,5 сек.
    PIR1.TMR1IF = 0;
 }
}
 
void main() {
  TRISIO = 0b00000011 ;
  ANSEL = 0x00;
  INTCON = 0b11000000 ; // Включить GIE и PEE для прерывания переполнения Timer1
  PIE1 = 0b00000001 ;   // Включить TMR1IE
 
   // Настройка модуля компаратора
   // Вывод CIN настроен как аналоговый,
   // Вывод CIN + настроен как ввод / вывод,
   // Вывод COUT настроен как ввод / вывод,
   // Выход компаратора доступен внутри,
   // CVREF не инвертирующий ввод
   // CINV установлен на 1
  CMCON0 = 0b00010100;
  VRCON  = 0b10100011;  // Vref установлен на VDD/8
  Output_LED = 0;
  do{
     TMR1H = 0x00;
     TMR1L = 0x00;
     TIME_UP = 0;
     i = 0;
     T1CON = 0b00110000;   // Настройка Timer 1
     if(CMCON0.COUT){      // Обнаружен первый хлопок
       Delay_ms(100);
       T1CON.TMR1ON = 1;   // Старт Timer1
       while(!CMCON0.COUT && !TIME_UP); // Ждем второй хлопок
       T1CON.TMR1ON = 0;                      // Обнаружен или Timer1 переполнился
       if(CMCON0.COUT && !TIME_UP) Output_LED = ~Output_LED;
       Delay_ms(100);
     }
  }  while(1);
}

 

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*

57