roboforum.ru

Технический форум по робототехнике.

Как подключить к МК пищалку?

Как подключить к МК пищалку?

Kozinaka » 01 мар 2010, 18:01

Имеется пьезо пищалка (только излучатель звука, без генератора), как лучше её подключить к МК?

Собираюсь просто посадить на две выходных ноги (на одной 0, на другой 1), инвертируя с определённой частотой сигнал на них.

Сопротивление пищалки если мерять какое-то гигантское получается, т.е. резисторы не нужны? А ещё часто советуют конденсатор вставлять, для чего?

Re: Как подключить к МК пищалку?

Myp » 01 мар 2010, 18:11

раз не меряется сопротивление то нужно ёмкость померять :)

Re: Как подключить к МК пищалку?

avr123.nm.ru » 01 мар 2010, 18:25

Подключение нормальное, но надежней последовательно включить резистор на 130-200 Ом.

Re: Как подключить к МК пищалку?

Kozinaka » 02 мар 2010, 14:30

А конденсатор нужен? Пьезо пищалка перестаёт проводить ток после того как мембрана выгнется?

Re: Как подключить к МК пищалку?

executer » 02 мар 2010, 14:34

скорее после того как внутренняя емкость зарядится до напряжения питания. (а уже вследствие этого пластинка выгнится)

Re: Как подключить к МК пищалку?

CiSi » 05 мар 2010, 16:56

Вот сдесь посмотри, там должен все найти: viewtopic.php?f=16&t=2785&start=0

Re: Как подключить к МК пищалку?

Kozinaka » 14 июн 2010, 00:02

Спасибо за внимание и информацию! Подключить пищалку на две ноги МК и попищать на разной высоте получилось! :D

Теперь хочется не заниматься генерацией частоты нот и воспроизведением мелодии в основной программе. Почитал тему про "Рюшечки", решил сделать через ШИМ, как у yak-40, но столкнулся с рядом проблем:

Решил повесить всё на третий, двухбайтовый, счётчик-таймер (у меня mega128), сделал 10-битный быстрый ШИМ, вот так инициализирую:

Код: Выделить всёРазвернуть
   //Вывод PE3 переключается в режим OC3A и 
   //сбрасывается при совпадении таймера со счетчиком,
   //WGM3: 0111 = 10-разр. быстрая ШИМ
   //Таймер остановлен
   TCCR3A = 0b10000011;
   TCCR3B = 0b00001000;    

   //Сброс счетчика таймера
   TCNT1H = 0x00;
   TCNT1L = 0x00;

   //Запуск таймера с предделителем 8
   TCCR3B |= 0b10;

   //Установка регистра сравнения (число от 0 до 1023)
   OCR3AH = (char)(nPWM>>8);
   OCR3AL = (char)nPWM;


На ноге PE3 висит пищалка, в зависимости от величины nPWM получается звук разной интенсивности, но одинаковой частоты. :(

В общем, почему так происходит мне теперь понятно:
HearPWM1.jpg
HearPWM1.jpg (11.24 КиБ) Просмотров: 11761


Подскажите, плиз, какой режим работы счетчика-таймера мне нужен, чтобы генерировать разные частоты?
СТС? - а как тогда добиться, чтобы сигнал половину периода шел, а половину нет?

P.S. Proteus в своём осциллографе рисует удивительную динамику: как будто сигнал сначала колеблется от 0 до 5в. а потом плавно сползает вниз. Это глюки осциллографа Proteus'a или я чего-то накрутил и получаю отрицательное напряжение? о_О
HearPWM2.jpg

Re: Как подключить к МК пищалку?

Kozinaka » 14 июн 2010, 11:09

Так, даташит сказал, что нужен CTC с режимом инвертирования сигнала на OCRnA. Вот сделал такой код инициализации:
Код: Выделить всёРазвернуть
//Вывод PE3 переключается в режим OC3A и переключает 
//своё состояние при совпадении таймера со счетчиком,
//WGM3: 0100 = CTC
//Таймер остановлен
TCCR3A = 0b01000000;
TCCR3B = 0b00001000;


Но что такой запуск:
Код: Выделить всёРазвернуть
//Установка регистра сравнения (число от 0 до 1023)
OCR3AH = (char)(20>>8);
OCR3AL = (char)20;
//Запуск таймера с предделителем 8
TCCR3B |= 0b10;

Что такой:
Код: Выделить всёРазвернуть
//Установка регистра сравнения (число от 0 до 1023)
OCR3AH = (char)(900>>8);
OCR3AL = (char)900;
//Запуск таймера с предделителем 8
TCCR3B |= 0b10;

Дают один и тот же прямоугольный сигнал с низкой частотой, из пищалки слышно пуканье, видимо это сигнал с частотой максимального значения счётчика. :(

Добавлено спустя 34 минуты 13 секунд:
Разобрался! :D

Фишка в том, как я останавливал таймер при переключении частоты. Двадцать раз прочитал про нюансы обращения с двухбайтовыми регистрами и именно в них напортачил. Вот корректный код постепенно уменьшающий частоту сигнала (управляющий регистр присваивается полностью, сначала старший байт, потом младший):
Код: Выделить всёРазвернуть
//Главный цикл
while(nFreq < 1000) {
   //Уменьшение частоты сигнала
   nFreq += 10;

   //Остановка таймера
   TCCR3A = 0b01000000;
   TCCR3B = 0b00001000;

   //Сброс счетчика таймера
   TCNT3H = 0x00;
   TCNT3L = 0x00;

   //Установка счётного регистра
   OCR3AH = (char)(nFreq>>8);
   OCR3AL = (char)nFreq;

   //Запуск таймера с предделителем 8
   TCCR3A = 0b01000000;
   TCCR3B = 0b00001010;

   //Пауза до следующего переключения частоты
   _delay_ms(100);
}
Последний раз редактировалось Kozinaka 14 июн 2010, 12:05, всего редактировалось 1 раз.

Re: Как подключить к МК пищалку?

blindman » 14 июн 2010, 11:12

Компилятор сам устанавливает регистры таймеров в нужном порядке, если записать вот так
Код: Выделить всёРазвернуть
OCR3A = nFreq;

Re: Как подключить к МК пищалку?

Kozinaka » 14 июн 2010, 14:22

Круть! Спасибо, код стал попонятнее! :)
Перехожу к генерации нот...

Добавлено спустя 2 часа 16 минут 13 секунд:
Теперь трабла со временем: как с помощью таймера-счётчика считать миллисекунды?

Частота кристалла выставлена 16Мгц, следовательно в секунду 16000000 срабатываний.
Ставлю на таймере-счётчике предделитель 128, получаю 16000000 / 128 = 125000 срабатываний в секунду. Дальше счетчику работающему в режиме CTC устанавливаю границу сброса 124, т.е. 125000 / 125 = 1000 срабатываний в секунду! В обработчике прерывания от таймера считаю 1000 раз и включаю\отключаю звук пикалки.
Увы получается не 1 секунда, а где-то 17 секунд. :(

Я правильно считаю?

Вот код инициализации счётчика:
Код: Выделить всёРазвернуть
//ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА 2
TCCR2 = 0b01001101;
OCR2 = 124;


Вот код обработчика прерывания:
Код: Выделить всёРазвернуть
//Обработчик прерывания по нажатию кнопки
ISR(TIMER2_COMP_vect) {
   ++g_nTime;
   if(g_nTime > 1000) {
      g_nTime = 0;
      if(g_bDebug) {
         //Тут остановка пищания 3 таймером         
         g_bDebug = false;
      } else {
         //Тут запуск пищания 3 таймером
         g_bDebug = true;
      }
   }    
}

Re: Как подключить к МК пищалку?

blindman » 14 июн 2010, 15:27

Считаешь-то правильно, только в регистр похоже пишешь совсем не то. У тебя предделитель на 1024 и fast pwm
и вот такое лучше не писать:
Код: Выделить всёРазвернуть
TCCR2 = 0b01001101;

есть же определения битов регистров, их и надо использовать

А предделителя на 128 у второго таймера нет

Re: Как подключить к МК пищалку?

Kozinaka » 14 июн 2010, 18:31

Уф! Спасибо тебе, blindman, огромное! :) А то я закис совсем.
В даташите WGM0 и WGM1 то так, то так написаны, а второго счетчика вообще нет, но подразумевается, что он аналог 0-го. А где можно почитать про 2-ой счётчик?

Действительно, я неправильно его инициализировал! Но никогда бы не смог допустить, что у второго таймера нет предделителя 128! Блок предделителя общий на три таймера 1, 2, 3, это даже в даташите есть. :shock:

Сейчас инициализирую счётчик так:
Код: Выделить всёРазвернуть
//Включение прерывания счетчика 0
TIMSK |= 1<<OCIE0;
//Инициализация счетчика 0
TCCR0 = 0x00 | 1<<WGM01 | 1<<CS02 | 1<<CS00;   
//Порог счетчика 0
OCR0 = 124;

Спасибо за рекомендацию, так понятнее и ошибиться сложнее!

Re: Как подключить к МК пищалку?

blindman » 14 июн 2010, 18:37

Это у тебя или даташит негодный, или не туда смотришь.

Re: Как подключить к МК пищалку?

Kozinaka » 14 июн 2010, 18:47

Смотрю на даташит вот тут: http://www.gaw.ru/html.cgi/txt/doc/micr ... /index.htm
Видимо при переводе что-то в стружку ушло. :(

Re: Как подключить к МК пищалку?

blindman » 15 июн 2010, 03:01

Даташиты здесь : http://atmel.com/dyn/products/devices.asp?family_id=607 и здесь : http://atmel.com/dyn/products/devices_v ... 0Solutions. Все остальное - эммм... фигня.


Rambler\'s Top100 Mail.ru counter